如何配置 firewalld 以阻止除特定端口之外的所有传出流量,同时允许 localhost 访问其自己的任何本地端口?

Joh*_* T. 5 linux centos localhost iptables firewalld

我会在一开始就承认我是在找到答案并想与其他人分享之后才提出这个问题的。如果这是不好的形式,那么我真诚地道歉,我愿意接受有关以正确方式分享这些来之不易的信息的建议。如果这是一个重复,请关闭它并将访问者指向原始问题。

那么,如何配置 firewalld(在我的情况下,使用 CentOS 7.6)来阻止除特定端口之外的所有传出流量,同时还允许 localhost 访问其自己的任何本地端口?

我从这个开始:

# First, allow outbound traffic for all allowed inbound traffic 
firewall-cmd --direct --add-rule ipv4 filter OUTPUT 0 -m state --state ESTABLISHED,RELATED -j ACCEPT 

# Allow outbound HTTP, HTTPS, DNS
firewall-cmd --direct --add-rule ipv4 filter OUTPUT 1 -p icmp -m icmp --icmp-type=ping -j ACCEPT 
firewall-cmd --direct --add-rule ipv4 filter OUTPUT 1 -p tcp -m tcp --dport 53 -j ACCEPT 
firewall-cmd --direct --add-rule ipv4 filter OUTPUT 1 -p udp --dport 53 -j ACCEPT 
firewall-cmd --direct --add-rule ipv4 filter OUTPUT 1 -p tcp -m tcp --dport 80 -j ACCEPT 

# Block all other outbound traffic 
firewall-cmd --direct --add-rule ipv4 filter OUTPUT 2 -j DROP
Run Code Online (Sandbox Code Playgroud)

这一切都可以很好地锁定服务器,使其无法访问除网站和 DNS 之外的任何内容。

但是任何试图通过 localhost 网络通信访问其他本地服务的本地服务都被阻止了。更糟糕的是,即使将 firewalld 配置为记录丢弃的数据包,也没有记录出站丢弃。

Joh*_* T. 6

我通过一些试验和错误找到了答案,因为在谷歌或其他地方搜索这个确切的(可能是奇怪的)场景是没有结果的:

# Allow all outbound traffic from localhost to localhost
firewall-cmd --direct --add-rule ipv4 filter OUTPUT 1 -o lo -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

这允许本地服务与任何其他本地服务进行通信(即使分配给目标服务的 IP 不是 127.0.0.1)。