Я добавил несколько основных правил:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Затем закройте все остальные порты командой:
iptables -A INPUT -j DROP
И он отлично работает, я тестировал его с помощью:
% telnet x.x.x.x 81
Trying x.x.x.x...
telnet: connect to address x.x.x.x: Operation timed out
telnet: Unable to connect to remote host
Но когда я перечисляю правила, я вижу policy ACCEPT
:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:http
DROP all -- anywhere anywhere
Я знаю, как это изменить с помощью iptables -P INPUT DROP
, тогда это становится:
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:http
DROP all -- anywhere anywhere
Но я не понимаю разницы, потому что работает как раньше. я прочел этот статья, в которой предлагается изменить политику на DROP, но зачем мне это делать? В чем разница в моих приведенных выше iptables?
Политика DROP iptables эквивалентна iptables -A INPUT -j DROP
(Правило DROP) в конце цепочки. Но это правило должен оставаться в конце цепочки, любое правило после него никогда не будет затронуто ни одним пакетом.
Если вы используете правило DROP, вы больше не можете использовать iptables -A
(добавить), вы можете использовать только iptables -I nr
(вставьте, номер - номер последнего правила) и вставьте правила перед последним. И для того, чтобы эта вставка работала, вы должны знать номер вашего последнего правила, которое, конечно же, изменится, поэтому становится сложнее писать скрипт. Вы можете избавить вас от некоторых трудностей, используя политику DROP.
И, наконец, imho, это делает все намного более читаемым, если я с самого начала знаю, как будут обрабатываться пакеты, не соответствующие ни одному правилу.
Есть еще мысли по этому поводу?