С машины 192.168.1.2 у меня есть эта конфигурация iptables:
$ hostname -I
192.168.1.2
$ iptables -L -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- eth0 * 192.168.1.3 0.0.0.0/0 tcp dpt:6379
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 * 0.0.0.0/0 0.0.0.0/0
943 118K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
20 988 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy DROP 5 packets, 300 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 160 packets, 18263 bytes)
pkts bytes target prot opt in out source destination
Когда я пытаюсь подключиться к указанному выше компьютеру с 192.168.1.3 через порт 6379, он просто зависает, пока я его не убью:
$ hostname -I
192.168.1.3
$ nc -z 192.168.1.2 6379
^C
Что я делаю неправильно, что не позволяет мне подключиться с 192.168.1.3 к 192.168.1.2 через порт 6379?
Возможно, вы добавили правило ACCEPT вскоре после попытки подключения, которое было отклонено политикой. В этом случае для потока могла быть создана запись отслеживания соединения, которая включала решение о фильтрации. Таблица отслеживания соединений действует как своего рода кеш для netfilter; он не оценивает все правила для всех пакетов. Если есть соответствующая запись отслеживания соединения, он будет обращаться к ней.
Обязательно удаляйте записи conntrack трафика, который вы пытаетесь сопоставить с новыми правилами, например с помощью инструмента conntrack (8). В вашем случае вы могли бы сделать что-то вроде
conntrack -D -s 192.168.1.3
Я сбросил iptables, а затем изменил строку в моем скрипте, которая устанавливает это конкретное правило iptables:
iptables -A INPUT -s 192.168.1.3 -i eth0 -p tcp -m tcp --dport 6379 -j ACCEPT
к этому:
iptables -A INPUT -i eth0 -p tcp --dport 6379 -s 192.168.1.3 -j ACCEPT
и теперь это волшебно работает, хотя iptables -L -n -v
выглядит идентично тому, что было раньше:
$ iptables -L -n -v
Chain INPUT (policy DROP 6 packets, 360 bytes)
pkts bytes target prot opt in out source destination
1 60 ACCEPT tcp -- eth0 * 192.168.1.3 0.0.0.0/0 tcp dpt:6379
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 * 0.0.0.0/0 0.0.0.0/0
311 544K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
1 60 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 255 packets, 28839 bytes)
pkts bytes target prot opt in out source destination
Не могу сказать, что это не поведение, которое я раньше не видел с iptables.
изменить: для всех, кому интересно, я использую iptables-persistent
, и это полный файл, который я использовал:
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i eth0 -p tcp --dport 6379 -s 192.168.1.3 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i docker0 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
COMMIT