Как переадресовать порты на сервере с libvirt / KVM на указанные порты на виртуальных машинах при использовании NAT?
Например, хост имеет публичный IP 1.2.3.4. Я хочу перенаправить порт 80 на 10.0.0.1 и порт 22 на 10.0.0.2.
Я предполагаю, что мне нужно добавить правила iptables, но я не уверен, где это уместно и что именно должно быть указано.
Вывод 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:bootps
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere 10.0.0.0/24 state RELATED,ESTABLISHED
ACCEPT all -- 10.0.0.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
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Вывод ifconfig
eth0 Link encap:Ethernet HWaddr 00:1b:fc:46:73:b9
inet addr:192.168.1.14 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::21b:fcff:fe46:73b9/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:201 errors:0 dropped:0 overruns:0 frame:0
TX packets:85 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:31161 (31.1 KB) TX bytes:12090 (12.0 KB)
Interrupt:17
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
virbr1 Link encap:Ethernet HWaddr ca:70:d1:77:b2:48
inet addr:10.0.0.1 Bcast:10.0.0.255 Mask:255.255.255.0
inet6 addr: fe80::c870:d1ff:fe77:b248/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:468 (468.0 B)
Я использую Ubuntu 10.04.
Ответы:
Последним стабильным выпуском libvirt для Ubuntu является версия 0.7.5, в которой отсутствуют некоторые новые функции (например, перехват скриптов и сетевые фильтры), упрощающие автоматическую настройку сети. Тем не менее, вот как включить переадресацию портов для libvirt 0.7.5 в Ubuntu 10.04 Lucid Lynx.
Эти правила iptables должны помочь:
Конфигурация NAT KVM по умолчанию предоставляет правило, аналогичное 3-му, которое я дал выше, но оно пропускает состояние NEW, которое необходимо для приема входящих соединений.
Если вы пишете сценарий запуска, чтобы добавить эти правила, и не будете осторожны, libvirt 0.7.5 переопределяет их, вставляя свои собственные. Итак, чтобы убедиться, что эти правила применяются правильно при запуске, вы должны убедиться, что libvirt инициализирована, прежде чем вставлять свои правила.
Добавьте следующие строки в /etc/rc.local перед строкой
exit 0
:sleep 10
Выше хак , чтобы убедиться , что Libvirt демон имел возможность инициализировать свои правила Iptables , прежде чем добавить наши собственные. Я не могу ждать, пока они выпустят libvirt версии 0.8.3 для Ubuntu.источник
Существует способ настроить перенаправление портов на лету, когда гость использует работу в режиме пользователя , я написал об этом здесь:
http://blog.adamspiers.org/2012/01/23/port-redirection-from-kvm-host-to-guest/
Вы можете видеть детали там, но для удобства вот решение, которое я выяснил:
Этот однострочник намного проще, чем другие ответы, но работает только в некоторых сценариях (сетевой стек пользовательского режима).
источник
Более "официальный" [1] способ сделать это - создать скрипт-хук, как описано на сайте libvirt:
http://wiki.libvirt.org/page/Networking#Forwarding_Incoming_Connections
... в основном этот сценарий будет вызываться при загрузке гостя KVM. Сам скрипт добавит соответствующие правила iptable (аналогично ответу Исаака Сазерленда выше) с правильно добавленным состоянием соединения «NEW». Обратите внимание, что вы должны изменить скрипт с правильными значениями для ваших хостов и портов.
[1] хотя сама документация libvirt говорит, что это что-то вроде хака, пойди разберись
источник
«Единственный» способ, которым мы можем сделать переадресацию порта с помощью KVM (libvirt) с «сетью по умолчанию» (virbr0), - это использование хака / обходного пути, сообщенного @Antony Nguyen. Или проще - вы можете использовать libvirt-hook-qemu .
В этой теме есть полное объяснение того, как решить эту проблему для CentOS 7 (и, конечно, для других дистрибутивов) с помощью libvirt-hook-qemu: https://superuser.com/a/1475915/195840 .
источник
источник