初めに、この質問をするのは答えを見つけて他の人と共有したいと思ったときに告白します。これが不適切な形式である場合は、心からお詫び申し上げます。この苦労して獲得した情報を共有するための正しい方法についての提案を私は受け入れています。これが繰り返しの場合は、閉じて、訪問者に元の質問を示してください。
では、localhostが独自のローカルポートにアクセスできるようにしながら、特定のポートを除くすべての発信トラフィックをブロックするようにfirewalld(私の場合はCentOS 7.6を使用)を構成するにはどうすればよいですか?
私はこれから始めました:
# 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
そしてこれはすべて、サーバーがWebサイトとDNS以外にアクセスできないようにロックダウンするためにうまく機能しました。
しかし、ローカルホストネットワーク通信を介して他のローカルサービスにアクセスしようとするローカルサービスはブロックされました。さらに悪いことに、ドロップされたパケットをログに記録するようにfirewalldが構成されていても、発信ドロップはログに記録されていませんでした。
答えは、試行錯誤の結果見つかりました。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以外であっても)。