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

Не удается переадресовать порт с помощью iptables KVM NAT

У меня есть хост debian 10, и я запускаю гостевой debian 10 с использованием NAT. Я использую libvirt / KVM / QEMU

публичный IP хоста: x.x.x.x гостевой IP: 192.168.122.99

Я пытаюсь перенаправить порт 22221 на порт 22 гостя, чтобы получить доступ к гостю через ssh извне. Я хочу подключиться к гостю через ssh напрямую, используя ssh -p 22221 x.x.x.x

Я следую этому руководству: https://wiki.libvirt.org/page/Networking#Forwarding_Incoming_Connections

Я также пробовал бесчисленное количество других руководств, но ни один из них не помог. В частности, я понятия не имею, почему следующее не работает:

(внутри хоста)

1- Я выключил гостевую виртуальную машину с помощью virt-manager

2- Я вручную вызываю таблицы ip скрипта перехвата для перенаправления порта

sudo iptables -D FORWARD -o virbr0 -d  192.168.122.99 --dport 22 -j ACCEPT
sudo iptables -t nat -D PREROUTING -p tcp --dport 22221 -j DNAT --to 192.168.122.99:22

3- Я запускаю гостевую виртуальную машину и проверяю, что ssh 192.168.122.99 работает

4- Теперь пытаюсь подключиться с помощью ssh -p 22221 localhost и он отказывается от связи.

Еще пробовал проверить порт nmap -p 22221 localhost и он говорит, что заблокирован.

iptables -L (хост)

Chain INPUT (policy ACCEPT)
target     prot opt source               destination                                                                       
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootps
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:67
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             192.168.122.99
ACCEPT     all  --  anywhere             192.168.122.0/24     ctstate RELATED,ESTABLISHED                                                                    
ACCEPT     all  --  192.168.122.0/24     anywhere
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable                                                              
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable  

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: enp2s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:25:90:97:dc:6e brd ff:ff:ff:ff:ff:ff
    inet x.x.x.x/23 brd y.y.y.y scope global enp2s0f0
       valid_lft forever preferred_lft forever
    inet6 fe80::225:90ff:fe97:dc6e/64 scope link 
       valid_lft forever preferred_lft forever
3: enp2s0f1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:25:90:97:dc:6f brd ff:ff:ff:ff:ff:ff
4: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 52:54:00:60:e8:80 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:60:e8:80 brd ff:ff:ff:ff:ff:ff
7: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN group default qlen 1000
    link/ether fe:54:00:e4:c2:52 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc54:ff:fee4:c252/64 scope link 
       valid_lft forever preferred_lft forever

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: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:e4:c2:52 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.99/24 brd 192.168.122.255 scope global dynamic enp1s0
       valid_lft 2500sec preferred_lft 2500sec
    inet6 fe80::5054:ff:fee4:c252/64 scope link 
       valid_lft forever preferred_lft forever

Замеченный шаг после добавления / редактирования iptable: 3- Я запускаю гостевую виртуальную машину и проверяю, что ssh 192.168.122.99 работает

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

ssh напрямую в / из 192.168.122.99 МОЖЕТ заставить систему автоматически корректировать изменения iptables, которые вы сделали на предыдущем шаге.

Если бы я устранял это, я бы

# ssh -p 22221 localhost 

или

# ssh 192.168.122.99 -p 22221 

перед

#ssh 192.168.122.99

iptables будет «сохранять» рабочие настройки дольше, чем новые настройки, которые, по его мнению, конфликтуют с «установленными» соединениями.

В примере сценария на вики-странице libvirt, похоже, отсутствует "-p" в строках FORWARD, правильный способ выполнить это:

sudo iptables -I FORWARD -o virbr0 -d  192.168.122.99 -p tcp --dport 22 -j ACCEPT
sudo iptables -t nat -I PREROUTING -p tcp --dport 22221 -j DNAT --to 192.168.122.99:22

Локальные соединения не проходят через PREROUTING крючки. Поэтому, если вы хотите проверить переадресацию портов из хост-системы, вам следует добавить DNAT править в nat/OUTPUT цепь.

Что-то такое:

iptables -t nat -I OUTPUT -p tcp --dport 22221 --dst X.X.X.X -j DNAT --to 192.168.122.99:22

Для устранения неполадок проверьте счетчики правил, tcpdump и инструмент conntrack.