手里的服务器大部份都从CentOS 6升级到了CentOS 7了,而作为运维人员,感觉系统最大的变化莫过于防火墙套件从之前的iptables更换到了FirewallD。身边的同事对该套件的语法真的是叫苦不迭,我也抽空研究了一些,觉得有利有弊吧。
在https://firewalld.org/中,对firewalld的描述为“提供了动态管理的防火墙”并且“同时支持了IPv4和IPv6”,“运行时和动态配置分离”,而给我印象最深的,就是支持了直接的配置管理,从而方便的防火墙规则与应用程序的统一管理。
在使用firewalld中,进行单纯的inbound管理是非常方便的,普通的
firewall-cmd [--permanent] --add-service firewall-cmd [--permanent] --add-port firewall-cmd [--permanent] --add-rich-rule
满足大多数要求吧。
今天正好遇到群里有个兄弟问到一个问题,怎么使用firewalld禁止服务器对外访问?
第一个反应就是“能不能使用richrule实现这个需求?”
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' destination address='180.97.33.108' port port=443 protocol='tcp' drop"
提示success了,但是尝试连接,似乎没有生效,然后
firewall-cmd --reload && firewall-cmd --list-all
可以看到规则也静静的待在了rich rule里面,但就是没有屏蔽住。
查阅文档,发现firewalld提供了–direct的用法,可以直接使用iptables或者ip6tables的用法。
在察看了firewall-cmd的帮助信息中可以看到,direct选项可以实现更多类似iptables的用法,这也要求使用者有一定的iptables经验。
而相关的应用方式如下
firewall-cmd [--permanent] --direct --get-all-chains firewall-cmd [--permanent] --direct --get-chains { ipv4 | ipv6 | eb } table firewall-cmd [--permanent] --direct --add-chain { ipv4 | ipv6 | eb } table chain firewall-cmd [--permanent] --direct --remove-chain { ipv4 | ipv6 | eb } table chain firewall-cmd [--permanent] --direct --query-chain { ipv4 | ipv6 | eb } table chain
firewall-cmd [--permanent] --direct --get-all-rules firewall-cmd [--permanent] --direct --get-rules { ipv4 | ipv6 | eb } table chain firewall-cmd [--permanent] --direct --add-rule { ipv4 | ipv6 | eb } table chain priority args firewall-cmd [--permanent] --direct --remove-rule { ipv4 | ipv6 | eb } table chain priority args firewall-cmd [--permanent] --direct --remove-rules { ipv4 | ipv6 | eb } table chain firewall-cmd [--permanent] --direct --query-rule { ipv4 | ipv6 | eb } table chain priority args
firewall-cmd [--permanent] --direct --passthrough { ipv4 | ipv6 | eb } args firewall-cmd [--permanent] --direct --get-all-passthroughs firewall-cmd [--permanent] --direct --get-passthroughs { ipv4 | ipv6 | eb } firewall-cmd [--permanent] --direct --add-passthrough { ipv4 | ipv6 | eb } args firewall-cmd [--permanent] --direct --remove-passthrough { ipv4 | ipv6 | eb } args firewall-cmd [--permanent] --direct --query-passthrough { ipv4 | ipv6 | eb } args
那么根据之前说的需求,要使用firewalld来禁止服务器对外的访问,我们使用如下命令:
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -d 180.97.33.108 -p tcp --dport 443 -j DROP
命令成功执行返回了success状态,再次尝试连接,可以发现已经会无法连接而超时了。
扩展的,我们进入firewalld的配置文件进行察看,direct相关规则的配置文件位于/etc/firewalld/direct.xml,可以看到因为我们之前的命令,当前配置已经变成了
<?xml version="1.0" encoding="utf-8"?> <direct> <rule priority="0" table="filter" ipv="ipv4" chain="OUTPUT">-d 180.97.33.108 -p tcp --dport 443 -j DROP</rule> </direct>
所以,我们也可以通过仿写xml配置文件的方式,很方便的动态管理direct规则。不过,在进行文件修改后,还请不要忘记了firewall-cmd –reload。