Centos7 默认是已安装了 Firewall,但是没有启动的,所以需要先启动下 Firewall,同时设置开机自启动,常用命令介绍
firewalld常用指令
查看已打开的所有端口:firewall-cmd --zone=public --list-ports
查询防火防所有开放端口及规则:firewall-cmd --list-all
启动:systemctl start firewalld
停止:systemctl stop firewalld
重启:systemctl restart firewalld
查状态:systemctl status firewalld
查看运行状态:firewall-cmd --state //running 表示运行
查看激活的zone :firewall-cmd --get-active-zones
查看 firewall 版本:firewall-cmd --version
安装指令(如果没有自带需手动安装): yum install firewalld
在开机时启用一个服务:systemctl enable firewalld.service
在开机时禁用一个服务:systemctl disable firewalld.service
查看服务是否开机启动:systemctl is-enabled firewalld.service
查看已启动的服务列表:systemctl list-unit-files|grep enabled
查看启动失败的服务列表:systemctl --failed
#查看防火墙规则(只显示/etc/firewalld/zones/public.xml中防火墙策略,在配置策略前,我一般喜欢先CP,以后方便直接还原)
firewall-cmd --list-all
#查看所有的防火墙策略(即显示/etc/firewalld/zones/下的所有策略)
firewall-cmd --list-all-zones
#重新加载配置文件
firewall-cmd --reload
#更改配置后一定要重新加载配置文件:
firewall-cmd --reload
关闭防火墙
systemctl disable firewalld 禁止开机启动防火墙
systemctl stop firewalld 关闭防火墙
systemctl status firewalld 查看防火墙状态
放行端口方法
1、开启一个端口:firewall-cmd --zone=public --add-port=80/tcp --permanent (--permanent 永久生效,没有此参数重启后失效)
开放端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=50000-56635/tcp --permanent
firewall-cmd --zone=public --add-port=100-500/udp --permanent
firewall-cmd --zone=public --add-port=80/tcp --add-port=8080/tcp --add-port=8443/tcp --permanent
删除端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent
指定IP访问:firewall-cmd --permanent --add-rich-rule
允许
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="3306" accept"
限制IP(拉黑IP)
firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="8.219.149.242" drop'
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='xx.xx.xxx.x' reject"
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='xx.xx.xxx.0/24' reject"
删除规则
firewall-cmd --permanent --remove-rich-rule 'rule family="ipv4" source address="8.219.149.242" drop'
Linux防火墙内的策略动作有REJECT和DROP两种,区别如下:
1.、REJECT动作会返回一个拒绝(终止)数据包(TCP FIN或UDP-ICMP-PORT-UNREACHABLE),明确的拒绝对方的连接动作。
连接马上断开,Client会认为访问的主机不存在。REJECT在IPTABLES里面有一些返回参数,参数如下:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
2、DROP动作只是简单的直接丢弃数据,并不反馈任何回应。需要Client等待超时,Client容易发现自己被防火墙所阻挡。
至于使用DROP还是REJECT更合适一直未有定论,因为的确二者都有适用的场合:
1、REJECT是一种更符合规范的处理方式,并且在可控的网络环境中,更易于诊断和调试网络/防火墙所产生的问题;
2、DROP则提供了更高的防火墙安全性和稍许的效率提高,但是由于DROP不很规范(不很符合TCP连接规范)的处理方式,可能会对你的网络造成一些不可预期或难以诊断的问题。因为DROP虽然单方面的中断了连接,但是并不返回任何拒绝信息,因此连接客户端将被动的等到tcp session超时才能判断连接是否成功,这样早企业内部网络中会有一些问题,例如某些客户端程序或应用需要IDENT协议支持(TCP Port 113, RFC 1413),如果防火墙未经通知的应用了DROP规则的话,所有的同类连接都会失败,并且由于超时时间,将导致难以判断是由于防火墙引起的问题还是网络设备/线路故障。
2、重新加载 firewall,修改配置后,必须重新加载才能生效:firewall-cmd --reload
firewall-cmd --reload
3、 查看已打开的所有端口:firewall-cmd --zone=public --list-ports
firewall-cmd --zone=public --list-ports
查询所有规则
firewall-cmd --list-all
实操:
[root@localhost ~]# firewall-cmd --zone=public --list-port
9876/tcp 8090/tcp 80/tcp 8080/tcp
[root@localhost ~]# firewall-cmd --zone=public --add-port=3307/tcp --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --zone=public --list-port
9876/tcp 8090/tcp 80/tcp 8080/tcp 3307/tcp
关闭端口方法
1、关闭 9876 端口:(--permanent 表示永久生效,没有此参数重启后失效)
firewall-cmd --zone=public --remove-port=9898/tcp --permanent
firewall-cmd --zone=public --remove-port=50000-65535/tcp --permanent
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="3306" accept"
2、重新加载 firewall,修改配置后,必须重新加载才能生效:firewall-cmd --reload
firewall-cmd --reload
实操:
[root@localhost ~]# firewall-cmd --zone=public --list-ports
9876/tcp 8090/tcp 80/tcp 8080/tcp
[root@localhost ~]# firewall-cmd --zone=public --remove-port=9876/tcp --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --zone=public --list-ports
8090/tcp 80/tcp 8080/tcp
public.xml 文件修改防火墙端口
1、firewall-cmd对端口的操作,如开放端口等信息,都放在" /etc/firewalld/zones/public.xml"中记录
cat /etc/firewalld/zones/public.xml
2、所以直接修改此文件也是可以的,这个文件会保存配置信息
查看指定zone的所有信息 firewall-cmd --zone=public --list-all
查看永久放行的服务
firewall-cmd --get-service —permanent
拒绝所有包 # firewall-cmd --panic-ond
取消拒绝状态
firewall-cmd --panic-off
查看是否拒绝
firewall-cmd --query-panic
更新防火墙规则,不需要重启服务
firewall-cmd --reload
更新防火墙规则,并且重启服务
firewall-cmd --complete-reload
添加接口到指定zone,默认都在public zone
firewall-cmd --zone=public --add-interface=eth0
如果不加--permanent参数,则该规则仅仅是运行时规则,firewall-cmd --reload 后该规则消失。
设置默认zone,如果不设置,默认为public,本命令立即生效无需重启 # firewall-cmd --set-default-zone=myzone
查看给定zone所有打开的端口: # firewall-cmd --zone=myzone --list-ports
添加一个端口到区域
firewall-cmd --zone=myzone --add-port=8080/tcp
如果不加--permanent参数,则该规则仅仅是运行时规则,firewall-cmd --reload 后该规则消失。
打开一个服务 # firewall-cmd --zone=work --add-service=ssh
移除服务
firewall-cmd --zone=work --remove-service=ssh
firewalld服务锁定与解锁
不能添加对应端口,和启动报错:
Failed to start firewalld.service: Unit is masked.
执行命令,即可实现取消服务的锁定
systemctl unmask firewalld
下次需要锁定该服务时执行
systemctl mask firewalld
防火墙屏蔽IP或IP段
#禁止IP(123.56.161.140)访问机器
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="123.56.161.140" drop'
#禁止一个IP段,比如禁止123.56.*.*
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="123.56.0.0/16" drop'
#禁止一个IP段,比如禁止123.56.161.*
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="123.56.161.0/24" drop'
#禁止机器IP(123.56.161.140)从防火墙中删除
firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address="123.56.161.140" drop'
IP白名单设置
#开启某个端口(指定IP可访问)
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.1.1.14/32" port protocol="tcp" port="80" accept"
#删除策略
firewall-cmd --permanent --zone=public --remove-rich-rule="rule family="ipv4" source address="10.1.1.14/32" port protocol="tcp" port="80" accept"
关闭selinux
云服务器默认关闭SELinux,如若未关闭SELinux:修改/etc/selinux/config配置文件SELINUX=disabled
cat /etc/selinux/config
运行setenforce 0 临时 SELinux
永久关闭,参考以下指令关闭
sed -i "/SELINUX=enforcing/s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
命令讲解查找SELINUX=enforcing所在行,把字符串:SELINUX=enforcing 替换为字符串:SELINUX=disabled
规则和优先级介绍
这是 CentOS 7/8 防火墙(FirewallD)的规则配置文件中的一组规则,用于描述如何允许或拒绝进出本机的网络流量。具体解释如下:
- target: 表示此规则的动作是什么,例如 default 表示按照系统默认的策略处理(可能是允许或拒绝)。
- icmp-block-inversion: 表示是否禁止 ICMP 协议的阻止规则,no 表示不禁止。
- interfaces: 表示应用此规则的网络接口,例如 eth0 表示应用于 eth0 网卡。
- sources: 表示允许或拒绝的源地址,如果为空则表示所有来源。
- services: 表示允许或拒绝的服务,例如 dhcpv6-client 和 ssh。
- ports: 表示允许或拒绝的端口,可以指定协议类型(如 tcp/udp)和端口范围(如 1-65535)。
- protocols: 表示允许或拒绝的网络协议,如 tcp、udp、icmp。
- masquerade: 表示是否开启网络地址转换(NAT),yes 表示开启。
- forward-ports: 表示转发端口的规则。
- source-ports: 表示源端口的规则。
- icmp-blocks: 表示 ICMP 协议的阻止规则。
- rich rules: 表示使用高级规则(rich rules)匹配复杂的条件。
FirewallD 按照优先级从高到低的顺序匹配规则,直到找到第一条匹配的规则为止。因此,如果有多个规则匹配到了同一个数据包,那么按照规则文件中的顺序,匹配到的第一条规则将决定该数据包的处理方式。