LXC, переадресация портов и iptables
У меня есть контейнер LXC (10.0.3.2
Бег на хосте. Служба работает внутри контейнера в порту 7000
,
От хозяина (10.0.3.1
, lxcbr0
), Я могу связаться с сервисом:
$ telnet 10.0.3.2 7000
Trying 10.0.3.2...
Connected to 10.0.3.2.
Escape character is '^]'.
Я хотел бы сделать сервис, работающий внутри контейнера, доступным для внешнего мира. Поэтому хочу перенаправить порт 7002
на хост в порт 7000
на контейнере:
iptables -t nat -A PREROUTING -p tcp --dport 7002 -j DNAT --to 10.0.3.2:7000
Что приводит к (iptables -t nat -L
):
DNAT tcp -- anywhere anywhere tcp dpt:afs3-prserver to:10.0.3.2:7000
Тем не менее, я не могу получить доступ к службе с хоста, используя перенаправленный порт:
$ telnet 10.0.3.1 7002
Trying 10.0.3.1...
telnet: Unable to connect to remote host: Connection refused
Я чувствую, что мне здесь не хватает чего-то глупого. Какие вещи я должен проверить? Какова хорошая стратегия для устранения этих ситуаций?
Для полноты вот как iptables
установлены на хосте:
iptables -F
iptables -F -t nat
iptables -F -t mangle
iptables -X
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o lxcbr0 -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp --dport 7002 -j DNAT --to 10.0.3.2:7000
6 ответов
Кажется, вы заблокировали порт 7002 на 10.0.3.1, так как ваша политика по умолчанию - DROP
Попробуйте добавить его в правила INPUT:
iptables -A INPUT -p tcp --dport 7002 -j ACCEPT
Я столкнулся с той же проблемой. Я пока не нашел решения, но вслед за этим отмечу некоторые наблюдения.
У меня есть хозяин ${host}
(Ubuntu 12.04), и он запускает гостевую машину через LXC. Гость на IP 10.0.3.248
и шлюз 10.0.3.1
, Я запускаю веб-сервер в гостевой системе и хочу перенести прямой трафик с ${host}:8888
в 10.0.3.248:80
, Ниже приведены соответствующие записи iptables:
-A PREROUTING -p tcp --dport 8888 -j DNAT --to-destination 10.0.3.248:80
-A POSTROUTING -j MASQUERADE
В текущей конфигурации я могу успешно зайти на веб-сервер 10.0.3.248:80 с другого физического компьютера. Тем не менее, это не удается, когда я пытаюсь посетить 10.0.3.248:80 из ${host}
, Может быть, вы можете попробовать посетить этот сервис внутри LXC с другой машины.
Насколько я понимаю, когда я приезжаю из ${host}
пакет проходит через петлевой интерфейс и напрямую попадает в цепочку INPUT. Хотя я разрешаю все на входе, нет службы прослушивания ${host}:8888
, С Wireshark, я вижу, RST отправлено получено. Когда я захожу с другого физического компьютера, пакет переходит в цепочку PREROUTING и, как и ожидалось, был обработан DNAT.
Один связанный пост:
Следуя руководству lxcware , я выполнил свою работу. Я думаю, что большинству пользователей будет проще использоватьlxc
вместо этого команды. Краткий обзор, предполагая, что имя вашего контейнераcontainer1
и вы пересылаете с вашего хоста7002
в контейнер7000
:
$ lxc profile create proxy-80
$ lxc profile device add proxy-80 hostport80 proxy \
connect="tcp:127.0.0.1:7000" listen="tcp:0.0.0.0:7002"
$ lxc profile add container1 proxy-80
Убедитесь, что оно правильно применено к вашему контейнеру:
$ lxc config show container1 -e
Хорошо , мои 5 центов с 2018 года:
Я установил LXC и поиграл с ним. IP моего контейнера 10.0.0.10
Я добавил это правило:
iptables -t nat -A PREROUTING -p tcp -i ens192 --dport 81 -j DNAT --to-destination 10.0.0.10:22
Это не сработало. Затем я понял, что даже политика FORWARD ПРИНЯТА, есть правило, которое блокирует все правила FORWARD.
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * virbr0 0.0.0.0/0 10.0.0.0/24 ctstate RELATED,ESTABLISHED
0 0 ACCEPT all -- virbr0 * 10.0.0.0/24 0.0.0.0/0
0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0
5 268 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Поэтому мне пришлось ввести правило наверху:
iptables -I FORWARD -p tcp -d 10.0.0.10 --dport 22 -j ACCEPT
Сейчас вперед host:81
-> 10.0.0.10:22
работает.
Мне нужно было добавить правило FORWARD
iptables -A FORWARD -p tcp -d 10.0.3.2 --dport 7002 -j ACCEPT
Ваш контейнер доступен из локальной сети через интерфейс моста хоста и, следовательно, подключен к той же подсети, что и хост.
Вам нужно, чтобы ваш маршрутизатор перенаправил эти порты в ваш контейнер.