LXC, переадресация портов и iptables

8

У меня есть контейнер 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
Роберто Алои
источник
Вы проверили INPUTцепь? Может быть, политика REJECTтам.
Михаэль Хартл,
ПолитикаACCEPT
Роберто Алои
Извините, я имел в виду FORWARDцепь. Также проверьте , если IP - экспедиторская включено: cat /proc/sys/net/ipv4/ip_forward.
Михаэль Хартл
ip_forwardнастроен на1
Роберто Алои
FORWARDПолитика такжеACCEPT
Роберто Aloi

Ответы:

3

Кажется, вы заблокировали порт 7002 на 10.0.3.1, так как ваша политика по умолчанию - DROP

Попробуйте добавить его в правила INPUT:

iptables -A INPUT -p tcp --dport 7002 -j ACCEPT
инсайдер
источник
1

Я столкнулся с той же проблемой. Я еще не нашел решения, но после я записываю некоторые наблюдения.

У меня есть хост- ${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. Хотя я разрешаю все на INPUT, нет службы прослушивания ${host}:8888. С Wireshark, я вижу, RST отправлено получено. Когда я захожу с другого физического компьютера, пакет переходит в цепочку PREROUTING и, как и ожидалось, был обработан DNAT.

Один связанный пост:

user199716
источник
0

Мне нужно было добавить правило FORWARD

iptables -A FORWARD -p tcp -d 10.0.3.2 --dport 7002 -j ACCEPT
teknopaul
источник
0

хорошо, мои 5 центов с 2018 года:

Я установил LXC и поиграл с ним. Мой контейнер IP10.0.0.10

Я добавил это правило:

iptables -t nat -A PREROUTING -p tcp -i ens192 --dport 81 -j DNAT --to-destination 10.0.0.10:22

Это не сработало. Затем я понял, что даже политика FORWARD является ACCEPT, есть правило, которое блокирует все правила 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работает.

Ник
источник
-2

Ваш контейнер доступен из локальной сети через интерфейс моста хоста и, следовательно, подключен к той же подсети, что и хост.

Вам нужно, чтобы ваш маршрутизатор перенаправлял эти порты в ваш контейнер.

mVincent
источник