首先我要承认,我之所以问这个问题,是因为我已经找到了答案,并想与大家分享。如果这是不礼貌的行为,我深表歉意,我愿意听取大家的建议,以正确的方式分享这些来之不易的信息。如果这是重复的,请关闭它,并让访客查看原始问题。
那么,如何配置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
这一切都很好地锁定了服务器,使其无法访问网站和 DNS 以外的任何内容。
但任何试图通过 localhost 网络通信访问其他本地服务的本地服务都被阻止。更糟糕的是,即使配置了防火墙以记录丢弃的数据包,出站丢弃的数据包也不会被记录。
答案1
我通过反复试验找到了答案,因为在 Google 或其他地方搜索这个确切的(可能很奇怪)场景都无果:
# Allow all outbound traffic from localhost to localhost
firewall-cmd --direct --add-rule ipv4 filter OUTPUT 1 -o lo -j ACCEPT
这允许本地服务与任何其他本地服务进行通信(即使分配给目标服务的 IP 不是 127.0.0.1)。