centos下的firewalld实践应用
对于大多数人来说,对防火墙要求比较简单,无非就阻断不需要的,放行需要的。之前对Linux防火墙了解的不多,本来以为很简单,却是研究了很久终于才实现了自己的需求。
iptables -A INPUT -s 10.110.12.1 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 10.110.12.2 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 10.110.6.222 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT /*加入8080端口必须得有这条,否则业务无法使用*/
iptables -P INPUT DROP
service iptables save
service iptables restart /*一定不要忘了执行这个,否则很可能会不生效*/
**********以下为删除********************
iptables -D INPUT -s 10.110.12.1 -p tcp --dport 22 -j ACCEPT
iptables -D INPUT -s 10.110.12.2 -p tcp --dport 22 -j ACCEPT
iptables -D INPUT -s 10.110.6.222 -p tcp --dport 22 -j ACCEPT
iptables -D INPUT -p tcp --dport 8080 -j ACCEPT
service iptables save
service iptables restart
iptables -P INPUT ACCEPT
service iptables save
iptables -nL --line-number
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.110.12.1" port port=22 protocol="tcp" accept"
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.110.12.2" port port=22 protocol="tcp" accept"
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.110.6.222" port port=22 protocol="tcp" accept"
firewall-cmd --zone=public --remove-port=23/tcp --permanent
firewall-cmd --zone=public --remove-port=23/udp --permanent
firewall-cmd --permanent --zone=public --remove-service=ssh
firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
firewall-cmd --reload
一、设置方法一:以rich rules进行逐个IP及服务放行。
正常情况下,Firewalld默认区域是Public,默认都是阻止的,如需放行,则可将需放行的服务添加至services项内。项内本身是有SSH等默认服务的,只是让我给remove掉了,remove掉所有服务的目的是为了阻止所有服务,然后再通过rich rules逐一放行IP及服务。
注意:此处一定要先在rich rules添加放行后再将服务都remove,否则就远程不了服务器了。
1、添加rich rules,先保证有机器可以远程过来,也可以一下子将需要放行的服务及IP都添加完成。
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.1.1.7" service name="ssh" accept"
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.1.1.9" service name="ssh" accept"
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.1.1.64" service name="ssh" accept"
2、当然也可以以端口的形式添加:
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.110.1.12" port port=22 protocol="tcp" accept"
3、也可以直接添加8080端口,不做访问限制。
firewall-cmd --zone=public --add-port=8080
/tcp
--permanent
4、也可以将IP添加至黑名单,拒绝该IP的所有请求。只需将此IP加入源地址,并拒绝即可。
firewall-cmd --permanent --add-rich-rule=
"rule family=ipv4 source address=10.1.1.1 drop"
5、执行以下指令查看当前设置的rich rules,也可以使用iptables-save查看当前策略
firewall-cmd --list-rich-rules
firewall-cmd --list-all 查看默认区域的策略
firewall-cmd --list-all-zones查看所有区域的策略
6、将services内的服务全部移除。
firewall-cmd --permanent --zone=public --remove-service=ssh
firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
7、firewall-cmd --reload。重新加载一下配置,完成。
8、如需去除策略,只需将add改为remove执行即可。
二、设置方法二:使用direct rules
这种方法是开始没研究清楚方法一,所以使用的direct。使用direct的好处是可以设置策略的优先级,范围为[-32767,32767],其中数值越大,优先级越低。
所以对于全部阻止的策略建议该数值设置为最大或较大的值。
1、以下指令阻止所有tcp udp 进站请求,且优先级为10000,执行完成后一切服务都over了。所以一定要先执行放行或一定要策略全部设置完成后再reload
firewall-cmd --direct --add-rule ipv4 filter INPUT 10000 -p tcp -j DROP
firewall-cmd --direct --add-rule ipv4 filter INPUT 10000 -p udp -j DROP
2、放行指令:以下指令 放行10.1.1.7和10.1.1.8 ssh 22端口,且优先级为0,高于10000,所以会优先匹配执行。
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -s 10.1.1.7 -p tcp --dport=22 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -s 10.1.1.8 -p tcp --dport=22 -j ACCEPT
3、以上执行完成后执行firewall-cmd --reload
4、firewall-cmd --direct --get-all-rules查看direct下的所有策略。
5、如需去除策略,只需将add改为remove执行即可。
三、设置方法三:以区域的方式设置。
1、将源IP及服务添加至其他区域如,internal 或home域内,因为这样的区域是可信区域,所以会优先执行。
如有其他IP需要添加,只需要在此处不断添加即可。
2、将默认public内的服务移除
3、reload
以下为网络引用的对firewalld的解释,供参考。
FirewallD 即Dynamic Firewall Manager of Linux systems,Linux系统的动态防火墙管理器,是 iptables 的前端控制器,用于实现持久的网络流量规则。它提供命令行和图形界面,在大多数 Linux 发行版的仓库中都有。与直接控制 iptables 相比,使用 FirewallD 有两个主要区别:
- FirewallD 使用区域和服务而不是链式规则。
- FirewallD可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效。
在RHEL7里有几种防火墙共存:FirewallD、iptables、ebtables,默认是使用FirewallD来管理netfilter子系统,不过底层调用的命令仍然是iptables等。
FirewallD跟iptables比起来,不好的地方是每个服务都需要去设置才能放行,因为默认是拒绝。而iptables里默认是每个服务是允许,需要拒绝的才去限制。
FirewallD自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说FirewallD和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过FirewallD和iptables的结构以及使用方法不一样罢了。
iptables 服务在 /etc/sysconfig/iptables 中储存配置,而 FirewallD 将配置储存在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件里,使用 iptables 的时候每一个单独更改意味着清除所有旧有的规则和从 /etc/sysconfig/iptables 里读取所有新的规则,使用 firewalld 却不会再创建任何新的规则;仅仅运行规则中的不同。因此 FirewallD 可以在运行时改变设置而不丢失现行配置。
一个重要的概念:区域管理
通过将网络划分成不同的区域,制定出不同区域之间的访问控制策略来控制不同程序区域间传送的数据流。例如,互联网是不可信任的区域,而内部网络是高度信任的区域。网络安全模型可以在安装,初次启动和首次建立网络连接时选择初始化。该模型描述了主机所连接的整个网络环境的可信级别,并定义了新连接的处理方式。有如下几种不同的初始化区域:
- 阻塞区域(block):任何传入的网络数据包都将被阻止。
任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。 - 工作区域(work):相信网络上的其他计算机,不会损害你的计算机。
- 家庭区域(home):相信网络上的其他计算机,不会损害你的计算机。
- 公共区域(public):不相信网络上的任何计算机,只有选择接受传入的网络连接。
- 隔离区域(DMZ):隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。
- 信任区域(trusted):所有的网络连接都可以接受。
- 丢弃区域(drop):任何传入的网络连接都被拒绝。
任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。 - 内部区域(internal):信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
- 外部区域(external):不相信网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
注:FirewallD的默认区域是public。
FirewallD默认提供了九个zone配置文件:block.xml、dmz.xml、drop.xml、external.xml、 home.xml、internal.xml、public.xml、trusted.xml、work.xml,
他们都保存在“/usr/lib /firewalld/zones/”目录下。
配置方法
FirewallD的配置方法主要有三种:
- firewall-config
- firewall-cmd
- 直接编辑xml文件
其中 firewall-config是图形化工具,firewall-cmd是命令行工具,而对于linux来说大家应该更习惯使用命令行方式的操作,所以 firewall-config(适合用于桌面版)我们就不给大家介绍了。
安装配置
1、安装FirewallD
$ yum install firewalld firewall-config
2、运行、停止、禁用FirewallD
启动:
$ systemctl start firewalld
开机启动时加载FirewallD服务
$ systemctl enable firewalld.service
查看状态:# systemctl status firewalld 或者 firewall-cmd --state
禁用:
$ systemctl disable firewalld
停止:
$ systemctl stop firewalld
systemctl mask firewalld
systemctl unmask firewalld
4、配置firewalld
查看版本:
$ firewall-cmd --version
查看帮助:
$ firewall-cmd --help
显示状态:
$ firewall-cmd --state
查看区域信息:
$ firewall-cmd --get-active-zones
查看指定接口所属区域:
$ firewall-cmd --get-zone-of-interface=eth0
拒绝所有包:
$ firewall-cmd --panic-on
取消拒绝状态:
$ firewall-cmd --panic-off
查看是否拒绝:
$ firewall-cmd --query-panic
更新防火墙规则:
$ firewall-cmd --reload
$ firewall-cmd --complete-reload
两者的区别就是第一个无需断开连接,就是firewalld特性之一动态添加规则,第二个需要断开连接,类似重启服务
将接口添加到区域,默认接口都在public:
$ firewall-cmd --zone=public --add-interface=eth0
永久生效再加上 --permanent 然后reload防火墙
设置默认接口区域:
$ firewall-cmd --set-default-zone=public
立即生效无需重启
打开端口(貌似这个才最常用)
查看所有打开的端口:
$ firewall-cmd --zone=dmz --list-ports
加入一个端口到区域:
$ firewall-cmd --zone=dmz --add-port=8080/tcp
若要永久生效方法同上
打开一个服务,类似于将端口可视化,服务需要在配置文件中添加,/etc/firewalld 目录下有services文件夹,这个不详细说了,详情参考文档
$ firewall-cmd --zone=work --add-service=smtp
移除服务
$ firewall-cmd --zone=work --remove-service=smtp