У меня есть файл iptables, который выглядит примерно так:
iptables -F
iptables -A INPUT -s 192.168.56.0/24 -j ACCEPT
iptables -A OUTPUT -d 192.168.56.0/24 -j ACCEPT
iptables -A INPUT -s 10.0.0.0/8 -j ACCEPT
iptables -A OUTPUT -d 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -s 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -d 127.0.0.1 -j ACCEPT
iptables -A INPUT -s $(dig +short somedomain.com) -j ACCEPT
iptables -A OUTPUT -d $(dig +short somedomain.com) -j ACCEPT
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
У меня есть cron, который запускает это каждый час. Что меня беспокоит, так это вероятность утечки пакетов между iptables -F и концом скрипта. Есть ли другой способ запустить это без запуска iptables -F с самого начала?
Следуя предложению использовать ipset, которое мне кажется лучшим решением, давайте сначала подготовим набор:
ipset create netset hash:net
ipset add netset 192.168.56.0/24
ipset add netset 10.0.0.0/8
ipset add netset 127.0.0.1
ipset add netset somedomain.com
Вы можете проверить, какой результирующий набор, с
ipset save netset
Теперь таблицы:
iptables -F
iptables -A INPUT -m set --match-set netset src -j ACCEPT
iptables -A OUTPUT -m set --match-set netset dst -j ACCEPT
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
Теперь обновление:
ipset create newnetset hash:net
ipset add newnetset 192.168.56.0/24
ipset add newnetset 10.0.0.0/8
ipset add newnetset 127.0.0.1
ipset add newnetset somedomain.com
ipset swap newnetset netset
ipset destroy newnetset
Обратите внимание, что использование DNS в правилах брандмауэра обычно считается не самым безопасным. Я предполагаю, что вы пытаетесь разрешить связь с хостом, который находится в резидентном интернет-соединении, и вы пытаетесь полагаться на какой-то динамический DNS, чтобы поддерживать правила в актуальном состоянии при изменении IP-адреса. Использование VPN в случае сбоя порта может быть лучшим решением.
Что меня беспокоит, так это вероятность того, что между iptables -F и концом скрипта произойдет утечка некоторых пакетов.
Что ж, сейчас вы DROP все пакеты через правило. Если вы установите политика ваших цепочек INPUT / OUTPUT в DROP, что политика не будет сброшена сбросом.
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
Хотя использование ipset или цепочки для ваших динамических правил вместо очистки всей таблицы, вероятно, было бы лучшим решением.