Centos7之上的操作系统默认使用firewalld作为防火墙组件,相比之前的iptables来说,firewalld在进行网络管理的时候,更加便利,今天我们来探究一下firewalld的使用方法。
一
防火墙启动
- 演示机器:10.200.19.146 (打开防火墙)
- 系统:CentOS Linux release 7.4.1708
- 10.199.137.114(源端访问发起机器)
注:后文验证,防火墙策略都是在10.200.19.146添加,访问从10.199.137.114发起。
Centos7之上操作系统使用systemctl对组件进行管理。
登录10.200.19.146,检查firewalld状态
systemctl status firewalld.service
[root@localhost ~]# systemctl status firewalld.service● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1)
可以看到防火墙是inactive状态
systemctl start/stop firewalld.service #启动/停止防火墙,然后检查状态。
[root@localhost ~]# systemctl status firewalld.service● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: active (running) since Wed 2020-07-08 15:42:37 CST; 1s ago Docs: man:firewalld(1) Main PID: 18267 (firewalld) Tasks: 1 Memory: 25.5M CGroup: /system.slice/firewalld.service └─18267 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopidJul 08 15:42:35 localhost systemd[1]: Starting firewalld - dynamic firewall daemon...Jul 08 15:42:37 localhost systemd[1]: Started firewalld - dynamic firewall daemon.
firewalld跟iptables比起来至少有两大好处:
- firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效;
- firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。
firewalld跟iptables相比,默认规则是不同的,firewalld启动后除了ssh端口,其他访问默认是拒绝,而iptables里默认是每个服务是允许,需要拒绝的才去限制。
下面验证一下
8091是10.200.19.146上apache服务端口,146防火墙已经打开,我们在146上抓包,114上telnet 10.200.19.146 8091看看包的访问情况。
发起端访问,telnet不通
[root@10-199-137-114 ~]# telnet 10.200.19.146 8091Trying 10.200.19.146...
目标端抓包
tcpdump -i any host 10.200.19.146 and port 8091 -nn -vvv
[root@localhost ~]# tcpdump -i any host 10.200.19.146 and port 8091 -nn -vvvtcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes15:16:03.036467 IP (tos 0x10, ttl 63, id 24397, offset 0, flags [DF], proto TCP (6), length 60) 10.199.137.114.20311 > 10.200.19.146.8091: Flags [S], cksum 0xf110 (correct), seq 4163943542, win 29200, options [mss 1460,sackOK,TS val 729211707 ecr 0,nop,wscale 7], length 015:16:04.038764 IP (tos 0x10, ttl 63, id 24398, offset 0, flags [DF], proto TCP (6), length 60) 10.199.137.114.20311 > 10.200.19.146.8091: Flags [S], cksum 0xed27 (correct), seq 4163943542, win 29200, options [mss 1460,sackOK,TS val 729212708 ecr 0,nop,wscale 7], length 015:16:06.041784 IP (tos 0x10, ttl 63, id 24399, offset 0, flags [DF], proto TCP (6), length 60) 10.199.137.114.20311 > 10.200.19.146.8091: Flags [S], cksum 0xe553 (correct), seq 4163943542, win 29200, options [mss 1460,sackOK,TS val 729214712 ecr 0,nop,wscale 7], length 015:16:10.049588 IP (tos 0x10, ttl 63, id 24400, offset 0, flags [DF], proto TCP (6), length 60) 10.199.137.114.20311 > 10.200.19.146.8091: Flags [S], cksum 0xd5ab (correct), seq 4163943542, win 29200, options [mss 1460,sackOK,TS val 729218720 ecr 0,nop,wscale 7], length 015:16:18.065025 IP (tos 0x10, ttl 63, id 24401, offset 0, flags [DF], proto TCP (6), length 60) 10.199.137.114.20311 > 10.200.19.146.8091: Flags [S], cksum 0xb65b (correct), seq 4163943542, win 29200, options [mss 1460,sackOK,TS val 729226736 ecr 0,nop,wscale 7], length 015:16:34.080527 IP (tos 0x10, ttl 63, id 24402, offset 0, flags [DF], proto TCP (6), length 60) 10.199.137.114.20311 > 10.200.19.146.8091: Flags [S], cksum 0x77cb (correct), seq 4163943542, win 29200, options [mss 1460,sackOK,TS val 729242752 ecr 0,nop,wscale 7], length 0
从抓包情况我们可以看出,由于10.200.19.146上防火墙打开,从114上访问146的8091端口,146一直没有响应,可以看出firewalld默认是拒绝访问,所以一般情况下,我们会关闭防火墙服务,在服务访问不通的情况下,你不妨去检查下防火墙的状态。
二
命令汇总
常用命令
#进程与状态相关systemctl start firewalld.service #启动防火墙 systemctl stop firewalld.service #停止防火墙 firewall-cmd --state #查看防火墙状态 firewall-cmd --reload #更新防火墙规则 firewall-cmd --state #查看防火墙状态 firewall-cmd --reload #重载防火墙规则 firewall-cmd --list-ports #查看所有打开的端口 firewall-cmd --list-services #查看所有允许的服务 firewall-cmd --get-services #获取所有支持的服务#区域相关firewall-cmd --list-all-zones #查看所有区域信息 firewall-cmd --get-active-zones #查看活动区域信息 firewall-cmd --set-default-zone=public #设置public为默认区域 firewall-cmd --get-default-zone #查看默认区域信息 firewall-cmd --zone=public --add-interface=eth0 #将接口eth0加入区域public#接口相关firewall-cmd --zone=public --remove-interface=eth0 #从区域public中删除接口eth0 firewall-cmd --zone=default --change-interface=eth0 #修改接口eth0所属区域为default firewall-cmd --get-zone-of-interface=eth0 #查看接口eth0所属区域#端口控制firewall-cmd --add-port=80/tcp --permanent #永久添加80端口例外(全局)firewall-cmd --remove-port=80/tcp --permanent #永久删除80端口例外(全局)firewall-cmd --add-port=65001-65010/tcp --permanent #永久增加65001-65010例外(全局)firewall-cmd --zone=public --add-port=80/tcp --permanent #永久添加80端口例外(区域public)firewall-cmd --zone=public --remove-port=80/tcp --permanent #永久删除80端口例外(区域public)firewall-cmd --zone=public --add-port=65001-65010/tcp --permanent #永久增加65001-65010例外(区域public)#地址控制firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.199.137.114" accept" -------添加允许单个地址firewall-cmd -permanent --add-rich-rule="rule family="ipv4" source address="10.199.137.0/24" accept"-------添加允许ip段firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="10.199.137.114" accept"-------删除添加的ip段firewall-cmd -permanent -add-rich-rule="rule family="ipv4" source address="10.199.137.0/24" port protocol="tcp" port="5432" accept"-------控制访问的ip段和端口
命令含义:--zone #作用域--add-port=80/tcp #添加端口,格式为:端口/通讯协议--permanent #永久生效,没有此参数重启后失效
三
实战
当前114访问146是拒绝访问的,由于业务交互,我们需要给114添加白名单,允许其访问146,目前有如下几种方法。
- 放开8091端口,允许所有地址访问 #单独添加端口是针对全局的
- 放开10.199.137.114地址,允许其访问所有端口
- 放开10.199.137.114地址和8091端口
在添加规则之前我们需要了解,firewalld出去的策略默认(相当于iptables的output链)是放开的,所以我们只需要控制进来的策略就好了。上面三种方法都可以解决访问问题,实际生产环境中,我们可以根据要求进行调整,方法1和2限制比较少,而方法三限制到了地址和端口,控制的比较严格,下面我们按照方法三进行演示。
- 操作步骤
查看当前规则
[root@localhost ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens33 sources: services: ssh dhcpv6-client ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
当前没有规则,只有默认放开了ssh服务
添加策略,放开地址端口
[root@localhost ~]# firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.199.137.114" port protocol="tcp" port="8091" accept"success[root@localhost ~]# firewall-cmd --reload success[root@localhost ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens33 sources: services: ssh dhcpv6-client ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="10.199.137.114" port port="8091" protocol="tcp" accept
如上,添加白名单成功,我们在114上访问146测试
[root@10-199-137-114 ~]# telnet 10.200.19.146 8091Trying 10.200.19.146...Connected to 10.200.19.146.Escape character is '^]'.
总结
1、策略添加完成后需要firewall-cmd --reload才能生效;
2、--permanent生产环境需要添加,无此参数重启会失效;
3、firewalld开启后,进入策略默认是关闭的,出去数据包无限制;
4、Firewalld存放配置文件有两个目录,/usr/lib/firewalld和/etc/firewalld,前者存放了一些默认的文件,后者主要是存放用户自定义的数据,所以我们添加的service或者rule都在后者下面进行。
THE