Я отлаживаю настройку 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