Вот простой скрипт для сброса моих iptables

iptables -F

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

iptables -I INPUT  -p tcp --dport 8000 -j ACCEPT
iptables -I OUTPUT -p tcp --dport 8000 -j ACCEPT

После этого, если я

curl another-machine:8000/filename

соединение зависает, кажется, что происходит DROP, а не ACCEPT. Если я

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT

тогда приведенная выше команда curl работает.

Но порт 8000 явно установлен на ACCEPT даже когда DROP является политикой.

Так почему же не проходит соединение?

1 ответ1

2

Удаленный порт и порт назначения не одно и то же. Если исходящий пакет имеет 8000 в качестве порта назначения, то входящий ответ будет иметь его в качестве порта источника (т.е. зеркального отображения):

                local                   remote

 src 192.168.1.71:36932  --OUTPUT-->  151.101.1.69:8000 dest  TCP [SYN]

dest 192.168.1.71:36932  <--INPUT---  151.101.1.69:8000 src   TCP [SYN, ack]

Другими словами, только -A INPUT -p tcp --sport 8000 будет соответствовать ему.

Более обычный способ справиться с этим с помощью брандмауэра с отслеживанием состояния :

-A INPUT -m state --state ESTABLISHED -j ACCEPT

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .