在FriewallD中禁止对外访问

手里的服务器大部份都从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。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注