Назад | Перейти на главную страницу

Почему моя конфигурация iptables не принимает подключения от указанного источника iP?

С машины 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