Признаюсь в начале, что задаю этот вопрос только после того, как найду ответ и хочу поделиться им со всеми остальными. Если это дурной тон, тогда я искренне извиняюсь, и я открыт для предложений о том, как правильно поделиться этой с трудом завоеванной информацией. Если это повторение, пожалуйста, закройте его и укажите посетителям исходный вопрос.
Итак, как я могу настроить 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.
Но любые локальные сервисы, пытающиеся получить доступ к другим локальным сервисам через локальную сеть, были заблокированы. Что еще хуже, даже если firewalld настроен на запись пропущенных пакетов, исходящие отбрасывания не регистрировались.