Короче говоря, все работает, пока я не попытаюсь получить доступ к своему серверу apache в контейнере докера из Интернет. Входящие пакеты достигают контейнера докеров, но исходящие пакеты отбрасываются интерфейсом NAT на машине-докере.
Моя установка
что я могу сделать
что я пробовал
Я сузил проблему (используя tcpdump и другие эксперименты), когда я подключаюсь к веб-серверу в контейнере с компьютера в моей локальной сети, пакеты проходят через мостовой интерфейс (192.168.1.102) в докер-машине. Когда я подключаюсь из Интернета, входящий пакет проходит через 192.168.1.102, а пакет возврата - нет. Вместо этого он проходит через интерфейс NAT на докер-машине и сбрасывается. Я доказал это, выполнив команду «ifconfig eth0 down» на интерфейсе NAT изнутри docker-машины. Теперь, очевидно, это портит мою докер-машину, потому что я больше не могу запускать команды докера, и это убивает мой текущий сеанс ssh. Но когда я это сделал, подключение к веб-серверу в контейнере из Интернета работает! Итак, я доказал, что проблема в обратном пакете.
Сейчас, Могу ли я использовать iptables внутри docker-machine для правильной маршрутизации пакета, чтобы он выходил через мостовой интерфейс вместо интерфейса NAT? Я пробовал безуспешно. Вот мои правила iptables на докер-машине. Я хочу маршрутизировать любые пакеты, поступающие из моего контейнера, с исходным портом 11111 и направлять их на eth1 (мостовой интерфейс).
sudo iptables -I FORWARD 1 -i docker0 -o eth1 -p tcp --syn --sport 11111 -m conntrack --ctstate NEW -j ACCEPT
docker@default:~$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp spt:11111 flags:FIN,SYN,RST,ACK/SYN ctstate NEW
DOCKER-ISOLATION all -- anywhere anywhere
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain DOCKER (1 references)
target prot opt source destination
Chain DOCKER-ISOLATION (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
Я все неправильно делаю? Есть ли стандартный способ настройки, который я еще не изучал?