В настоящее время я использую гипервизор Xen под Ubuntu 14.04. На хост-машине я использую гостевую виртуальную машину.
Насколько я понимаю, чтобы иметь возможность принимать входящие соединения на виртуальной машине, мне нужно сначала написать ловушку, которая редактирует мои iptables
когда гость инициирован.
Я использую диспетчер виртуальных машин в качестве графического интерфейса для запуска виртуальных машин. крючок, который я настроил, находится /etc/libvirt/hooks/qemu
Я пытаюсь открыть TCP/UDP port 6969
и UDP port 17
для моей виртуальной машины с меткой "Windows
"
#!/bin/bash
# used some from advanced script to have multiple ports: use an equal number of$
# Update the following variables to fit your setup
Guest_name=Windows
Guest_ipaddr=192.168.122.99
Host_ipaddr=192.168.122.1
Host_port=( '6969' '17' )
Guest_port=( '6969' '17' )
length=$(( ${#Host_port[@]} - 1 ))
if [ "${1}" = "${Guest_name}" ]; then
if [ "${2}" = "stopped" ] || [ "${2}" = "reconnect" ]; then
for i in `seq 0 $length`; do
iptables -t nat -D PREROUTING -d ${Host_ipaddr} -p tcp --dport $$
iptables -D FORWARD -d ${Guest_ipaddr}/32 -p tcp -m state --stat$
done
fi
if [ "${2}" = "start" ] || [ "${2}" = "reconnect" ]; then
for i in `seq 0 $length`; do
iptables -t nat -A PREROUTING -d ${Host_ipaddr} -p tcp --dport $$
iptables -I FORWARD -d ${Guest_ipaddr}/32 -p tcp -m state --stat$
done
fi
fi
ifconfig - это то место, где я получил информацию
$ ifconfig
eth0 Link encap:Ethernet HWaddr d0:50:99:67:4a:b7
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:17367 errors:0 dropped:6 overruns:0 frame:0
TX packets:13439 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3494857 (3.4 MB) TX bytes:2707716 (2.7 MB)
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:65536 Metric:1
RX packets:3774 errors:0 dropped:0 overruns:0 frame:0
TX packets:3774 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1303572 (1.3 MB) TX bytes:1303572 (1.3 MB)
vif1.0 Link encap:Ethernet HWaddr fe:ff:ff:ff:ff:ff
UP BROADCAST MULTICAST MTU:1500 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:32
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
vif1.0-emu Link encap:Ethernet HWaddr fe:ff:ff:ff:ff:ff
inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1613 errors:0 dropped:0 overruns:0 frame:0
TX packets:3307 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:508517 (508.5 KB) TX bytes:1054123 (1.0 MB)
xenbr0 Link encap:Ethernet HWaddr d0:50:99:67:4a:b7
inet addr:192.168.2.100 Bcast:192.168.2.255 Mask:255.255.255.0
inet6 addr: fe80::d250:99ff:fe67:4ab7/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:14808 errors:0 dropped:0 overruns:0 frame:0
TX packets:11826 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2478850 (2.4 MB) TX bytes:2165931 (2.1 MB)
Эти iptables
, которые, кажется, выходят из клетки с крючком
$ sudo 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 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
ACCEPT all -- anywhere anywhere PHYSDEV match --physdev-out vif2.0 --physdev-is-bridged
ACCEPT all -- anywhere anywhere PHYSDEV match --physdev-in vif2.0 --physdev-is-bridged
ACCEPT all -- anywhere 192.168.122.0/24 state NEW,RELATED,ESTABLISHED
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere udp dpt:bootpc
Вот где я получил крючок: http://wiki.libvirt.org/page/Networking#Forwarding_Incoming_Connections
Некоторым людям могут быть интересны сетевые интерфейсы, поэтому вот:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual
auto xenbr0
iface xenbr0 inet static
bridge_ports eth0
address 192.168.2.100
netmask 255.255.255.0
gateway 192.168.2.1
dns-nameservers 192.168.2.1
Конфигурация сети по умолчанию:
<network>
<name>default</name>
<bridge name="virbr0"/>
<forward/>
<ip address="192.168.122.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.122.2" end="192.168.122.254"/>
</dhcp>
</ip>
</network>
Выход sudo iptables -t nat -v -x -n -L
:
Chain PREROUTING (policy ACCEPT 4326 packets, 267215 bytes)
pkts bytes target prot opt in out source destination
9 528 DNAT tcp -- * * 0.0.0.0/0 192.168.2.100 tcp dpt:6969 to:192.168.122.99:6969
0 0 DNAT tcp -- * * 0.0.0.0/0 192.168.2.100 tcp dpt:6969 to:192.168.122.0:6969
0 0 DNAT tcp -- * * 0.0.0.0/0 192.168.122.1 tcp dpt:6969 to:192.168.122.0:6969
0 0 DNAT tcp -- * * 0.0.0.0/0 192.168.122.1 tcp dpt:6969 to:192.168.122.99:6969
Chain INPUT (policy ACCEPT 3457 packets, 177928 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 2010 packets, 132685 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 2609 packets, 213516 bytes)
pkts bytes target prot opt in out source destination
5 365 RETURN all -- * * 192.168.122.0/24 224.0.0.0/24
0 0 RETURN all -- * * 192.168.122.0/24 255.255.255.255
0 0 MASQUERADE tcp -- * * 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
0 0 MASQUERADE udp -- * * 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
0 0 MASQUERADE all -- * * 192.168.122.0/24 !192.168.122.0/24
EDIT: оказывается, что OP использует мост с двумя разными подсетями. Это не было ясно из вопроса перед редактированием, и этот ответ был написан с предположением, что оба конца моста имеют одну и ту же подсеть.
Вы не используете NAT на своем компьютере с Libvirt. Я подозреваю, что у вас домашняя лаборатория, а модем вашего интернет-провайдера выполняет NAT за вас? Ваш блок Libvirt настроен с использованием моста.
Это означает, что, скорее всего, вам не нужно ничего делать и iptables
команды в вашем коде не нужны. Виртуальные машины уже доступны в вашей локальной сети. 192.168.2.0/24
, и если вы хотите сделать их доступными из Интернета, вам придется сделать это в маршрутизаторе (это не проблема Libvirt, не стоит обсуждать в этой теме).
В качестве исключения виртуальные машины может быть заблокированным от доступа, если вы используете ebtables
или это net.bridge.bridge-nf-call-iptables
включен. Однако я сомневаюсь, что здесь так.
После публикации конфигурации сети я вижу, что вы используете другую подсеть для Libvirt. Это неправильно, особенно если учесть, что вы используете 192.168.2.100
на интерфейсе моста, который вы используете для Libvirt, в то время как виртуальные машины (находящиеся на одном мосту) выделяются 192.168.122.0/24
.
В любом случае, если вы настаиваете на использовании двойного NAT, отразите это в своих настройках. Либо установите режим NAT, либо используйте один и тот же диапазон IP-адресов на обоих концах моста.
То, что вы делаете сейчас, очень сбивает с толку и в какой-то момент подойдет и укусит вас. На ваш вопрос уже был дан ответ о сбое сервера (хотя потребовалось некоторое время, чтобы выяснить, в чем на самом деле был ваш вопрос). Вот: перенаправление портов iptables на debian.