LINUX.ORG.RU

Проброс портов из-под NAT в KVM

 , , ,


0

2

Есть локальная сеть, есть в ней сервер под управлением Ubuntu 16.04 с локальным адресом 192.168.1.100. На сервере поставлен KVM по стандартному мануалу. После установки он мне добавил подсеть с адресами 192.168.122.x. Я создал в этом KVM виртуалку со статическим IP 192.168.122.5. С сетью все в порядке, интернет в виртуалке есть. С сервера можно на нее зайти, введя ssh 192.168.122.5.
Проблема в том, что мне никак не удается зайти на нее из общей локалки, например с адреса 192.168.1.2. Т.е если заходить с сервера, то заходит. Если заходить из общей локалки, то не заходит и не пингует. Гуглил на тему проброса портов, но решения так и не нашел.
Конфиг iptables сейчас такой. Я его вручную не менял.

# Generated by iptables-save v1.6.0 on Tue Apr 19 09:07:37 2016
*mangle
:PREROUTING ACCEPT [22799:3456813]
:INPUT ACCEPT [22761:3453877]
:FORWARD ACCEPT [38:2936]
:OUTPUT ACCEPT [21834:4483951]
:POSTROUTING ACCEPT [21974:4510126]
-A POSTROUTING -o virbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
COMMIT
# Completed on Tue Apr 19 09:07:37 2016
# Generated by iptables-save v1.6.0 on Tue Apr 19 09:07:37 2016
*nat
:PREROUTING ACCEPT [621:41044]
:INPUT ACCEPT [618:40808]
:OUTPUT ACCEPT [199:23175]
:POSTROUTING ACCEPT [199:23175]
-A POSTROUTING -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
COMMIT
# Completed on Tue Apr 19 09:07:37 2016
# Generated by iptables-save v1.6.0 on Tue Apr 19 09:07:37 2016
*filter
:INPUT ACCEPT [22754:3453440]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [21839:4484807]
-A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT
COMMIT
# Completed on Tue Apr 19 09:07:37 2016

Помогите, пожалуйста!

★★★★★

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

А с адреса 192.168.1.2 ты на нее как заходил? 192.168.100:$GUESTSSHPORT ? где $VIRTSSHPORT == $PORT1


   На роутере говорим следующие команды(от рута)

        # iptables -t nat -A PREROUTING -p tcp -d $EXT_R_IP --dport $PORT1 -j DNAT --to-destination $LOCAL_IP:$PORT2
        # iptables -A FORWARD -i eth0 -d $LOCAL_IP -p tcp --dport $PORT2 -j ACCEPT

https://www.opennet.ru/base/net/nat_redirect.txt.html

Первая ссылка в гугле. Хз как ты там гуглил.

Если ты стучал на 192.168.122.5 с машины 192.168.1.2, то убедись что у тебя на ней маршрут до 192.168.122.5 есть. Ну и ты про нат говоришь, значит это решение не для тебя будет.

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

Ну вот пытаюсь пробросить SSH порт виртуальной машины (22-й) на сервер в качестве 2201-го порта. Для чего вввел

iptables -t nat -A PREROUTING -p tcp -d 192.168.1.100 --dport 2201 -j DNAT --to-destination 192.168.122.5:22
iptables -A FORWARD -i eth0 -d 192.168.122.5 -p tcp --dport 22 -j ACCEPT
После чего пытаюсь соединиться с виртуалкой по ssh, используя команду
ssh -p 2201 192.168.1.100
Не получается. Пишет «connection refused».

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

Не получается. Пишет «connection refused».

Потому что цепочка FORWARD зарезана.
Нужно вставить разрешающее правило или удалить запрещающие.
Причём именно вставить, а не добавить.
И подозреваю, что вам придётся это делать после каждого запуска виртуалки.
Для libvirt задача решается hook-скриптами.

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

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

Rinaldus ★★★★★
() автор топика
Ответ на: комментарий от Rinaldus
# cat /etc/libvirt/hooks/qemu 
#!/usr/bin/bash

HOOK="$0"
OBJECT="$1"

source "$(dirname "$HOOK")/$OBJECT.sh"

exit 0

# cat /etc/libvirt/hooks/srv22.sh 
#!/usr/bin/bash

OPERATION="$2"
SUB_OPERATION="$3"
EXTRA_ARGUMENT="$4"

case "$OPERATION" in
	start|reconnect)
		iptables -t "filter" -D "FORWARD" \
			-i "virbr0" -o "virbr0" -j "ACCEPT"
		iptables -t "filter" -D "FORWARD" \
			-i "virbr0" -j "REJECT" \
			--reject-with "icmp-port-unreachable"
		iptables -t "filter" -D "FORWARD" \
			-o "virbr0" -j "REJECT" \
			--reject-with "icmp-port-unreachable"
	;;
esac
ArcFi
()
Ответ на: комментарий от Rinaldus

Это рабочая болванка с одного из моих серваков.
Допишите нужные вам правила во второй скрипт и переименуйте его по имени виртуалки.

ArcFi
()
Ответ на: комментарий от erzentdededd

а сетевой мост не проще было сделать?

Да, если есть возможность избавиться от NAT, имеет смысл ей воспользоваться.

ArcFi
()

он мне добавил подсеть с адресами 192.168.122.x.

ну ты сказочный петросян, создал дефолтный интерфейс для виртуалки, который поднял виртуальную изолированную сеть и пытаешься это разрулить иптаблсом.

повесь виртуалку на мост привязанный к физическому адаптору связанному с твоей локалкой

axelroot
()
Ответ на: комментарий от Rinaldus

iptables -t nat -A PREROUTING -p tcp -d 192.168.1.100 --dport 2201 -j DNAT --to-destination 192.168.122.5:22

натом локальные сети не спаривают, для этого есть роутинг, нат подменяет адреса для скрещивания локалок с инетом

axelroot
()
Ответ на: комментарий от erzentdededd

молодца, я чет сразу в эту шизу не въехал, а ТС просто забил на чтение манов

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

отдашь его интерфейсу моста

auto br0
iface br0 inet static
bridge_ports eth0
bridge_stp off
bridge_maxwait 5
        address 192.168.1.139
        netmask 255.255.255.0
        gateway 192.168.1.1
        dns-nameservers 192.168.1.1
axelroot
()
Ответ на: комментарий от Rinaldus

А куда я дену 192.168.1.100, который сейчас висит на этом физическом адаптере?

Локалка переедет на мост, виртуалка прицепится к этому же мосту.
И тогда 192.168.122.0/24 можно выпилить.

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

Т.е мой сервер станет еще и роутером для локалки? И адреса по DHCP в пределах локалки тоже будет раздавать сервер вместо роутера, который на 192.168.1.1 ?

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

Нет, сервер не будет ничего роутить и раздавать.
Мост выступает в роли коммутатора канального уровня.

ArcFi
()
Ответ на: комментарий от Rinaldus

ой сервер станет еще и роутером для локалки? И адреса по DHCP

жесть какое модемно-коробочное мышление, какая связь между динамической раздачей адресов, роутингом, мостом и виртуалкой

...Смешались в кучу кони, люди и залпы тысячи орудий ))))

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

Вы, чего, и пальцы за меня загибать будете? ))))

vxzvxz ★★★
()

IMHO:

1. Должен быть РАЗРЕШЕН форвардинг пакетов в sysctl:

echo 1 > /proc/sys/net/ipv4/ip_forward

ну или соответствующая строчка в /etc/sysctl.conf Скорее всего, проблема именно в этом (в CentOS6, например, ip_forward под дефолту ЗАПРЕЩЕН)

2. Все тебе тут понаписанные правила FORWARD удали и дай по бошкам горе-советчикам:

:FORWARD ACCEPT [0:0]

У тебя FORWARD итак разрешен по дефолту.

3. Возможно, проблема в том, что «обратка» идет по MASQUERADE, а не SNAT. Я бы попробовал этот кусок переписать так:

iptables -t nat -I PREROUTING -s 192.168.1.0/24 -d 192.168.1.100 -p tcp --dport 2201 -j DNAT --to-destination 192.168.122.5:22

iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -d 192.168.122.5 -p tcp --dport 22 -j SNAT --to-source {IP-гипервизора-в-сети-192.168.122.0/24}

slamd64 ★★★★★
()

Когда мне такое понадобилось, я это сделал по-быстрому через xinetd, он простой как грабли. Ибо копание в iptables ниасилил искренне ненавижу.

Deleted
()

Есть локальная сеть, есть в ней сервер под управлением Ubuntu 16.04

Да, забыл спросить. Как там в будущем? :)

Deleted
()
Ответ на: комментарий от slamd64

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

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

Это как сказать. Кул-хацкеры и в локалках водятся.

А если опыта нету вот даже с iptables разобраться и позакрывать всё опасное... то DMZ - не самое худшее решение.

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