LINUX.ORG.RU

Почему проброс порта через ssh работает, а через iptables нет?

 ,


0

1

Проброс порта VNC из lxc контейнера наружу:

ssh:

ssh -fNL 0.0.0.0:9500:10.0.3.74:5900 localhost


iptables:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 9500 -j DNAT --to 10.0.3.74:5900


В варианте ssh нормально подключаюсь, а iptables - connecting... и все

Что я делаю не так?

★★★★★

Последнее исправление: Qwentor (всего исправлений: 2)

То есть, ты делаешь telnet localhost 9500 и удивляешься, почему не срабатывает prerouting-правило, в котором написано -i eth0? Если же ты телнетишься к внешнему IP, то не хватает MASQUERADE правила, без которого сеть внутри контейнера не будет понимать, а кому же отправлять ответ.

Вообще такое хорошо отлаживать с tmpdump/wireshark, запускаемых на

  1. хосте, откуда осуществляется коннект
  2. роутере
  3. принимающей стороне
kawaii_neko ★★★★
()

Что я делаю не так?

В правиле iptables добавьте ip машины, с которой соединяетесь:

iptables -t nat -A PREROUTING -i eth0 -p tcp -d $IP --dport 9500 -j DNAT --to 10.0.3.74:5900

Где $IP - адрес сервера, к которому Вы подключаетесь.

Serge10 ★★★★★
()
Ответ на: комментарий от Qwentor

с десктопа из сети eth0_NET на docker_host_IP:9500, так? И десктоп это не docker_host (другая машина)

А если пробросить 5900->5900 то все работает:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 5900 -j DNAT --to 10.0.3.74:5900

???

может при запуске контейнера проще -p 9500:5900?

samson ★★
()
Последнее исправление: samson (всего исправлений: 2)
Ответ на: комментарий от Serge10

Это же более частный случай изначального правила. Те все что попадает под ваше правило попадет и под изначальное.

samson ★★
()
Ответ на: комментарий от Serge10

В правиле iptables добавьте ip машины, с которой соединяетесь

Нет, он не постоянный, подключаюсь с обычного ноута

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Qwentor

Почему не проще? Ведь docker run -p 9500:5900 какраз и пробросит вам 9500 порт хоста на 5900 порт контейнера. И никаких дополнительных правил iptables не надо будет. Если я все правильно понимаю...

Как контейнер запущен (порты проброшены)?

samson ★★
()
Последнее исправление: samson (всего исправлений: 1)
Ответ на: комментарий от samson

Похоже забыл написать, что у меня не docker, а lxc

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от samson

Это же более частный случай изначального правила.

Согласен, ерунду написал. Тогда тут что-то контейнер-специфическое. Вроде прав доступа, например. Мне сложно сказать, не имел дело с контейнерами.

Кстати, как сеть организована? Контейнер как подключен?

Serge10 ★★★★★
()
Ответ на: комментарий от Serge10

Конфиг контейнера:

# Template used to create this container: /usr/share/lxc/templates/lxc-download
# Parameters passed to the template:
# Template script checksum (SHA-1): 273c51343604eb85f7e294c8da0a5eb769d648f3
# For additional config options, please look at lxc.container.conf(5)

# Uncomment the following line to support nesting containers:
lxc.include = /usr/share/lxc/config/nesting.conf
# (Be aware this has security implications)


# Distribution configuration
lxc.include = /usr/share/lxc/config/common.conf

# For Ubuntu 14.04
lxc.mount.entry = /sys/kernel/debug sys/kernel/debug none bind,optional 0 0
lxc.mount.entry = /sys/kernel/security sys/kernel/security none bind,optional 0 0
lxc.mount.entry = /sys/fs/pstore sys/fs/pstore none bind,optional 0 0
lxc.mount.entry = mqueue dev/mqueue mqueue rw,relatime,create=dir,optional 0 0
lxc.arch = linux64

# Container specific configuration
lxc.rootfs.path = dir:/var/lib/lxc/u1/rootfs
lxc.uts.name = u1

# Network configuration
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:c2:d7:12

#Mount directory
lxc.mount.entry = /home/qwentor/share/prog opt/prog none bind 0 0

#Enable VPN
lxc.mount.entry = /dev/net dev/net none bind,create=dir
lxc.cgroup.devices.allow = a
lxc.mount.auto=proc:rw sys:rw

Qwentor ★★★★★
() автор топика

Потому что FORWARD не разрешил

targitaj ★★★★★
()
Ответ на: комментарий от Serge10

Вот только что заметил секцию # For Ubuntu 14.04

А у меня 18.04. И на хосте и в контейнере

Но это вписывал не я, автоматом при создании прописалось.
Я вписывал только секции #Mount directory и #Enable VPN

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Qwentor

ip_forwarding включен? eth0 не в бридже случайно?

покажите

# ip a
# brctl show
# iptables -vnL -t nat
# cat /proc/sys/net/ipv4/ip_forward

в случае с ssh forwarding не нужен. а вот с iptables нужен

samson ★★
()
Последнее исправление: samson (всего исправлений: 1)
Ответ на: комментарий от samson

ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 96:00:00:2e:60:47 brd ff:ff:ff:ff:ff:ff
    inet {ext_ipv4}/32 brd 116.203.99.131 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 {ext_ipv6}/64 scope global deprecated
       valid_lft forever preferred_lft 0sec
    inet6 fe80::9400:ff:fe2e:6047/64 scope link
       valid_lft forever preferred_lft forever
3: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:16:3e:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 10.0.3.1/24 scope global lxcbr0
       valid_lft forever preferred_lft forever
    inet6 fe80::216:3eff:fe00:0/64 scope link
       valid_lft forever preferred_lft forever
19: vethLG12KT@if18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master lxcbr0 state UP group default qlen 1000
    link/ether fe:4d:fa:89:82:c0 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::fc4d:faff:fe89:82c0/64 scope link
       valid_lft forever preferred_lft forever


brctl show

bridge name     bridge id               STP enabled     interfaces
lxcbr0          8000.00163e000000       no              vethLG12KT


iptables -vnL -t nat

Chain PREROUTING (policy ACCEPT 19 packets, 1120 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DNAT       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:9500 to:10.0.3.74:5900

Chain INPUT (policy ACCEPT 3 packets, 160 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 365 packets, 21936 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 365 packets, 21936 bytes)
 pkts bytes target     prot opt in     out     source               destination
13309  799K MASQUERADE  all  --  *      *       10.0.3.0/24         !10.0.3.0/24


cat /proc/sys/net/ipv4/ip_forward

1
Qwentor ★★★★★
() автор топика
Последнее исправление: Qwentor (всего исправлений: 1)
Ответ на: комментарий от samson
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
 525K  821M ACCEPT     all  --  *      lxcbr0  0.0.0.0/0            0.0.0.0/0
 410K   53M ACCEPT     all  --  lxcbr0 *       0.0.0.0/0            0.0.0.0/0
Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Qwentor

Кстати, счетчики всегда 0?

Chain PREROUTING (policy ACCEPT 19 packets, 1120 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DNAT       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:9500 to:10.0.3.74:5900

можно еще в FORWARD добавить два отдельных правила и посмотреть счетчики. Да и в snat/postrouting тоже отдельное правило перед masquerade можно добавить...

samson ★★
()

PREROUTING есть. А где POSTROUTING? Ну и

echo "1" >  /proc/sys/net/ipv4/ip_forward
:)

Bootmen ☆☆☆
()

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

Если у тебя транзитная машина не является шлюзом, а тем более комп с которого ты подключаешься, транзитная машина и система на которую села проброс порта в одной сети, то тебе нужно писать в начале правило dnat в prerouting, а потом правило snat в postrouting или masquerade.

anonymous
()
Ответ на: комментарий от samson

Блин, я вот вас всех заставил думать, а опять, оказывается, не всю информацию сказал.

У меня же в контейнере VPN запущен.

Короче так,
ВНУТРИ контейнера:

ip rule add table 128 from 10.0.3.74
ip route add table 128 to 10.0.3.0/24 dev eth0
ip route add table 128 default via 10.0.3.1


И все работает
Чет я вчера жестко тупил, извините

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Qwentor

10.0.3.1 - маршрут по умолчанию в контейнере?

да

не внимательны вы;)

samson ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.