У меня следующая сетевая схема:
Итак, я применил это, чтобы заставить NAT работать:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Теперь каждый компьютер может подключиться к Интернету. Я применял правила к основному компьютеру (компьютер A), например, отключал подключения к некоторым портам, например ssh:
iptables -A INPUT -p tcp --dport 22 -j DROP
Но, например, сейчас я бы хотел только разрешить соединения для портов 20,21,22,53 и 80 на компьютере C и игнорировать внешний трафик, если он не связан с этими портами. Разрешенные соединения должны быть от компьютера C к внешнему, но не извне к компьютеру C (я имею в виду - компьютер C не размещает HTTP или SSH, но он собирается использовать их как клиент).
Думаю, это можно было бы сделать так:
iptables -A OUTPUT -i eth2 -o eth0 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth2 -o eth0 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
Последнее правило (отбрасывание любого другого трафика, отличного от указанного) находится в конце настройки, поэтому -A должна работать правильно.
Дело в том ... что он не работает. Если я поставлю последнее правило так:
iptables -A FORWARD -i eth2 -o eth0 -j DROP
Он просто отбрасывает все, и, например, порт 21 (ранее открытый, как вы можете видеть выше) тоже не работает.
Вы можете сказать мне, что я мог сделать не так? Я уже некоторое время борюсь с этой проблемой и не могу ее решить. Спасибо!
Вы разрешаете исходящие новые / установленные соединения для TCP 21 и разрешаете входящие установленные соединения для TCP 21. Но вы отбрасываете каждый трафик в цепочке пересылки.
Я думаю, что проблема возникает отсюда, вам следует добавить правило пересылки, чтобы разрешить исходящий и входящий трафик.