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

KVM Guest с NAT + Мостовая сеть

В настоящее время у меня есть несколько гостей KVM на выделенном сервере с мостовой сетью (это работает), и я могу успешно пропинговать внешние IP-адреса, которые я назначаю через ifconfig (в гостевой системе).

Однако из-за того, что у меня есть только 5 общедоступных IP-адресов ipv4, я хотел бы перенести такие службы переадресации:

hostip: порт -> kvm_guest: порт

ОБНОВИТЬ

Я узнал, что KVM имеет интерфейс NAT "по умолчанию", поэтому добавил виртуальный сетевой адаптер в гостевую конфигурацию virsh, а затем настроил его в гостевом режиме, у него есть IP-адрес:

192.168.122.112

Я могу успешно пропинговать 192.168.122.112 и получить доступ ко всем портам на 192.168.122.112 с узла KVM, поэтому я попытался перенаправить порт следующим образом:

iptables -t nat -I PREROUTING -p tcp --dport 5222 -j DNAT --to-destination 192.168.122.112:2521
iptables -I FORWARD -m state -d 192.168.122.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT

telnet KVM_HOST_IP 5222 просто висит на "попытках"

telnet 192.168.122.112 2521 работает

[root@node1 ~]# tcpdump port 5222
tcpdump: WARNING: eth0: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
23:43:47.216181 IP 1.152.245.247.51183 > null.xmpp-client: Flags [S], seq 1183303931, win 65535, options [mss 1400,nop,wscale 3,nop,nop,TS val 445777813 ecr 0,sackOK,eol], length 0
23:43:48.315747 IP 1.152.245.247.51183 > null.xmpp-client: Flags [S], seq 1183303931, win 65535, options [mss 1400,nop,wscale 3,nop,nop,TS val 445778912 ecr 0,sackOK,eol], length 0
23:43:49.415606 IP 1.152.245.247.51183 > null.xmpp-client: Flags [S], seq 1183303931, win 65535, options [mss 1400,nop,wscale 3,nop,nop,TS val 445780010 ecr 0,sackOK,eol], length 0

7 пакетов получено фильтром 0 пакетов отброшено ядром

[root@node1 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             192.168.122.0/24    state NEW,RELATED,ESTABLISHED 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   


[root@node1 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 976 packets, 57008 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   11   640 ACCEPT     all  --  *      *       0.0.0.0/0            192.168.122.0/24    state NEW,RELATED,ESTABLISHED 

Chain OUTPUT (policy ACCEPT 673 packets, 40901 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@node1 ~]# iptables -nvL -t nat
Chain PREROUTING (policy ACCEPT 549 packets, 34067 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    1    64 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:5222 to:192.168.122.112:2521 
    3   192 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:5222 to:192.168.122.112:2521 
    1    64 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:5225 to:192.168.122.112:2521 
    1    64 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:5222 to:192.168.122.112:2521 

Chain POSTROUTING (policy ACCEPT 45 packets, 3169 bytes)
 pkts bytes target     prot opt in     out     source               destination         

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

Любая помощь приветствуется.

Спасибо.

если вы запустите kvm таким образом:

kvm -drive... -net nic -net tap .... 

вы станете новым интерфейсом (на корневом хосте) с именем tapX (где X - число). Этот интерфейс обычно настраивается по умолчанию через скрипт, расположенный где-то в /etc (/etc/kvm/kvm-ifup, /etc/qemu-ifup или иначе) вы можете изменить их с помощью: kvm -drive... -net nic -net tap,script=mynatbrigescript...

Оттуда этот интерфейс должен быть настроен для каждой точки:

ifconfig tapX 192.168.124.1/30

и в клиентской ОС:

ifconfig eth0 192.168.124.2/30

поэтому, если вы нажмете (на корневом хосте), вы увидите новую локальную сеть (при условии, что ваш общедоступный IP-адрес равен 1.2.3.4):

ip r s
1.2.3.4 dev eth0 ...
192.168.124.0/30 dev tapX  proto kernel  scope link src 192.168.124.1

Оттуда вы должны иметь возможность подключиться к 192.168.124.2 с корневого хоста. Тогда ты мог бы DNAT ваши входящие tcp пакеты с:

iptables -t nat -A PREROUTING -i eth0 -d 192.168.122.31 --dport 5222 -j DNAT --to-destination 192.168.124.2:2521

и SNAT пакеты ответов в обратном направлении:

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.124.2 -j SNAT --to-source 192.168.122.31

теперь, если для корневого узла, это работает:

telnet 192.168.124.2 2521

Затем с вашего локального домена это должно сделать то же самое:

telnet 1.2.3.4 5222

Вообще, ваш корневой хост должен пересылать IP-пакеты, это можно проверить:

cat /proc/sys/net/ipv4/ip_forward 
1

или

sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding = 1

Это может быть установлено:

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

или

sysctl net.ipv4.conf.all.forwarding=1

Во-первых, ваше правило DNAT должно быть обновлено, чтобы включить целевой IP-адрес узла KVM. Как бы то ни было, даже трафик, идущий с вашей виртуальной машины в Интернет (через порт 5222), получит DNAT.

iptables -t nat -F PREROUTING
iptables -t nat -A PREROUTING 1 -d KVM_HOST_IP -p tcp --dport 5222 -j DNAT --to-destination 192.168.122.112:2521

В остальном ваша конфигурация iptables выглядит нормально. Единственное, что я могу предложить, это убедиться, что ваша система поддерживает переадресацию IP:

sysctl -w net.ipv4.ip_forward=1

Если выполнение указанной выше команды решает проблему, вам следует обновить /etc/sysctl.conf так что он сохраняется после перезагрузки.

Как предлагали другие, бег tcpdump -nn -i any port 5222 or port 2521 на хосте KVM может подсказать, пересылается пакет или нет. Когда вы пытаетесь telnet KVM_HOST_IP 5222 вы должны увидеть два пакета. Один собирается KVM_HOST_IP.5222, а другой собирается 192.168.122.112.2521.