iptables направляет весь трафик в две разные цепочки?

iptables направляет весь трафик в две разные цепочки?

Я отлаживаю настройку iptables, которую я не писал. Эта настройка должна обеспечить брандмауэр вокруг некоторых контейнеров Docker (Portainer и Nginx Proxy Manager), работающих на самом маршрутизаторе, но что-то идет не так, и ни один контейнер Docker не может обслуживать веб-сайты в WAN. iptables -L -v -nВывод выглядит так:

root@FriendlyWrt:/proc/sys/net/bridge# iptables -L -v -n
# Warning: iptables-legacy tables present, use iptables-legacy to see them
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
1400K  251M DOCKER-USER  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
1397K  251M DOCKER-ISOLATION-STAGE-1  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
 5815  404K ACCEPT     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
 2580  116K DOCKER     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0           
15447 7639K ACCEPT     all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  docker0 docker0  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain DOCKER (1 references)
 pkts bytes target     prot opt in     out     source               destination         
   83  4836 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.2           tcp dpt:9443
    1    60 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.2           tcp dpt:8000
   29  1740 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.3           tcp dpt:443
    1    60 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.3           tcp dpt:81
    2   120 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.3           tcp dpt:80

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
 pkts bytes target     prot opt in     out     source               destination         
15447 7639K DOCKER-ISOLATION-STAGE-2  all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0           
1397K  251M RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all  --  *      docker0  0.0.0.0/0            0.0.0.0/0           
15447 7639K RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain DOCKER-MAN (1 references)
 pkts bytes target     prot opt in     out     source               destination         
 8395  519K RETURN     all  --  br-lan docker0  0.0.0.0/0            0.0.0.0/0           
 2805  167K DROP       all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate INVALID,NEW
  236 59251 RETURN     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
1388K  251M RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain DOCKER-USER (1 references)
 pkts bytes target     prot opt in     out     source               destination         
1400K  251M DOCKER-MAN  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
  236 59251 REJECT     all  --  eth0   docker0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
1397K  251M RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Похоже, что в начале цепочки "forward" весь трафик отправляется в цепочку "docker-user", а затем в следующем правиле весь оставшийся трафик отправляется в цепочку "docker-isolation-stage-1". Я бы предположил, что после отправки всего в "docker-user" больше не останется трафика для сортировки, а остальная часть цепочки будет полностью неиспользованной. Но похоже, что равные объемы трафика захватываются каждым правилом, а затем еще немного трафика переходит в строку 3. Что здесь происходит? Что на самом деле тестируется в первых двух строках "forward"?

решение1

На мобильном телефоне и слишком долго для комментария

Кажется, вы предполагаете, что отправка пакета в пользовательскую/новую цепочку означает, что он оттуда не вернется. Это несколько неверно.

Правила в iptables проверяются последовательно

Обработка останавливается, когда пакет соответствует правилу, которое дает окончательное решение о судьбе этого пакета (обычно ACCEPT, DROP, REJECT и, возможно, другие, которые я пропустил).

Если правилом является переход к новой/пользовательской цепочке, то:

  • эта цепочка введена
  • все правила в этой цепочке проверяются последовательно, пока не будет принято окончательное решение о судьбе этого пакета.
  • Если окончательное решение о судьбе пакета не принято:
    ВОЗВРАТ в предыдущую цепочку

Это то, что происходит в вашей цепочке DOCKER-USER, только несколько пакетов соответствуют правилу в цепочке DOCKER-MAN или последующему правилу REJECT, которые приводят к окончательному решению. Почти все входящие пакеты не соответствуют окончательному решению и возвращаются в цепочку FORWARD, где они обрабатываются следующим правилом, они войдут в цепочку DOCKER-ISOLATION-STAGE-1

Связанный контент