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

конфигурация iptables для контейнеров докеров

Я использую Docker 0.7.0 для создания контейнеров в RedHat Enterprise Linux 6.5. Когда брандмауэр выключен, контейнеры могут общаться с внешним миром, но когда брандмауэр включен, доступ к контейнеру извне невозможен.

Вот как я запускаю докер и сопоставляю порт с хоста на контейнер

$ docker run -i  -t -p 3838:3838  shiny  "shiny-server"

Без брандмауэра я могу получить доступ к серверу Node.js, работающему внутри контейнера на порту 3838, из внешней сети как http://servername:3838, но не с включенным брандмауэром.

Это мои правила брандмауэра по умолчанию -


# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Я попытался открыть порт 3838, добавив правило, как показано ниже, но оно не работает.

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3838 -j ACCEPT

Docker создает виртуальный NAT на хост-машине, я чувствую, что каким-то образом брандмауэр блокирует пересылку пакетов с eth0 на docker 0

Мне нужна помощь в настройке iptables, чтобы к контейнерам докеров можно было получить доступ из внешней сети без необходимости отключать весь брандмауэр.

Это результат $ ifconfig (я замаскировал IP-адрес сервера)

docker0   Link encap:Ethernet  HWaddr 00:00:00:00:00:00  
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::87d:8dff:fed0:f16d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:408321 errors:0 dropped:0 overruns:0 frame:0
          TX packets:681809 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:126511933 (120.6 MiB)  TX bytes:924200959 (881.3 MiB)

eth0      Link encap:Ethernet  HWaddr 00:25:64:A8:5B:8F  
          inet addr:XXX.XXX.XXX.XXX  Bcast:XXX.XXX.XXX.XXX  Mask:255.255.240.0
          inet6 addr: XXXX::XXX:XXXX:XXXX:XXXX/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:29786186 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1137982 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:4209047011 (3.9 GiB)  TX bytes:234657696 (223.7 MiB)
          Interrupt:17 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:8444 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8444 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:4701771 (4.4 MiB)  TX bytes:4701771 (4.4 MiB)

Вывод версии $ docker:

Client version: 0.7.0
Go version (client): go1.1.2
Git commit (client): 0ff9bc1/0.7.0
Server version: 0.7.0
Git commit (server): 0ff9bc1/0.7.0
Go version (server): go1.1.2
Last stable version: 0.7.2, please update docker

Вывод информации $ docker:

Containers: 321
Images: 278
Driver: devicemapper
 Pool Name: docker-8:17-13239310-pool
 Data file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
 Data Space Used: 56464.5 Mb
 Data Space Total: 102400.0 Mb
 Metadata Space Used: 59.5 Mb
 Metadata Space Total: 2048.0 Mb

У меня была аналогичная проблема, и в решении отсутствовал маскарадинг - также это не объясняло, почему он работает для вас вообще без правил фильтрации.

Как насчет того, чтобы попытаться добавить следующие правила:

*filter
[...]
-A FORWARD -d 172.17.42.0/16 -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 172.17.42.0/16 -i docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o docker0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i docker0 -j REJECT --reject-with icmp-port-unreachable

*nat
[...]
-A POSTROUTING -s 172.17.42.0/16 ! -d 172.17.42.0/16 -p tcp -j MASQUERADE --to-ports 1016-65535
-A POSTROUTING -s 172.17.42.0/16 ! -d 172.17.42.0/16 -p udp -j MASQUERADE --to-ports 1016-65535
-A POSTROUTING -s 172.17.42.0/16 ! -d 172.17.42.0/16 -j MASQUERADE

Я считаю, что вы также должны разрешить пакеты в цепочке FORWARD. Вам также необходимо убедиться, что правила ALLOW, которые вы добавляете, предшествуют правилам REJECT, поскольку iptables работает по принципу «первый матч-победа».