iptables блокирует все исходящие соединения
Я захотел сделать так, чтобы к моему ноутбуку можно было подключиться только через порт 43210. Я это сделал следующими командами (до этого таблица была абсолютно пустой и разрешала все пакеты):
iptables -A INPUT -p tcp --dport 43210 -j ACCEPT
iptables -A INPUT -j DROP
И вроде все заработало: подключение (проверил с телефона) работает только по порту 43210. Но вот проблема заключается в том, что после этого блокируются все исходящие соединения на самом ноутбуке (я даже сам к себе не могу подключиться, что уж говорить о разных сайтах, серверах, и т.п.)
Почему это происходит, и как это исправить?
Вот как выглядит таблица после этих команд:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:43210
DROP all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Ответы (2 шт):
Ну можно попробовать открыть порты на исходящий трафик. sudo iptables -P OUTPUT ACCEPT
Ещё надо первым правилом в INPUT добавить приём пакетов для установленных соединений:
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Кроме того, добавьте разрешение на работу через loopback:
iptables -I INPUT -i lo -j ACCEPT
Если со вторым правилом всё очевидно, то с первым, видимо, требуются пояснения.
Сейчас, если вы пытаетесь открыть исходящее соединение, происходит следующее (рассмотрим на примере TCP):
- Вы посылаете TCP-пакет с флагом SYN например на порт 80 адреса 123.45.67.89. Вы его посылаете со своего адреса и с какого-то случайным образом выбранного системой порта из диапазона 1024-65534.
- Удалённый хост вам отвечает пакетом с флагами SYN и ACK на ваш адрес и порт, с которого вы открывали соединение.
- Этот пакет выбрасывается вашим фаероволлом, потому что он с вероятностью "дофига" идёт НЕ на ваш порт 43210.
- Попытка исходящего соединения закрывается по тайм-ауту после пары повторов попытки.