Я пытаюсь перенаправить трафик с порта 22 на хост-машине на порт 22 на виртуальной машине.
На моем хосте работает Ubuntu.
Я попытался выполнить эту команду на своем хосте: iptables -t nat -A PREROUTING -d 192.168.1.161 -p tcp --dport 22 -j DNAT --to 192.168.122.2:22
, который не имел возврата. Нет ошибок или другой информации.
При беге tcpdump -i eno1 port 22
и попробуйте подключиться к порту 22, я действительно вижу пакеты, поступающие на хост. Запуск эквивалента на виртуальной машине не показывает входящих пакетов.
192.168.1.161 - это локальный IP-адрес eno1. 192.168.122.2 - это IP-адрес виртуальной машины.
Я проверил, могу ли я подключиться с хоста к виртуальной машине.
cat /proc/sys/net/ipv4/ip_forward
возвращается 1
Если я попытаюсь подключиться к виртуальной машине по ssh с хоста (ssh user@192.168.122.2
) работает нормально. Если я попробую со своей рабочей станции (в той же сети, что и хост) ssh user@192.168.1.161
время истекает. Как упоминалось в tcpdump, я вижу пакеты, поступающие на хост, но, похоже, не перенаправляются на виртуальную машину. У меня есть SSH для самого хоста, работающего на нестандартном порту.
Хост работает под управлением Ubuntu 17.10. Гость работает под управлением Debian GNU / Linux 9
Виртуальная машина управляется KVM, и я управляю ею с помощью virt-manager.
ifconfig
хозяина:
eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.161 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 2a00:7660:142d:0:8a51:fbff:fe4a:9ed1 prefixlen 64 scopeid 0x0<global>
inet6 2a00:7660:142d::140 prefixlen 128 scopeid 0x0<global>
inet6 fe80::8a51:fbff:fe4a:9ed1 prefixlen 64 scopeid 0x20<link>
ether 88:51:fb:4a:9e:d1 txqueuelen 1000 (Ethernet)
RX packets 62604 bytes 10855077 (10.8 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 69941 bytes 36442632 (36.4 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 20 memory 0xf7f00000-f7f20000
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 10625 bytes 27445185 (27.4 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 10625 bytes 27445185 (27.4 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:04:bb:9b txqueuelen 1000 (Ethernet)
RX packets 1155 bytes 142293 (142.2 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1667 bytes 650997 (650.9 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
vnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::fc54:ff:fe12:71ae prefixlen 64 scopeid 0x20<link>
ether fe:54:00:12:71:ae txqueuelen 1000 (Ethernet)
RX packets 1155 bytes 158463 (158.4 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4349 bytes 794450 (794.4 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Я обнаружил, что это работает: https://ubuntuforums.org/showthread.php?t=2261173&p=13210545#post13210545
TL; DR
iptables -t nat -I PREROUTING -p tcp -d x.x.104.49 --dport 22 -j DNAT --to-destination 192.168.122.20:22
iptables -I FORWARD -m state -d 192.168.122.20/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT
Я обнаружил, что эти ответы работали, за исключением того, что они не работали от самого хоста к виртуальной машине. Поэтому я предлагаю добавить к ответу правило OUTPUT для маршрутизации с хост-машины на виртуальную машину.
iptables -t nat -I OUTPUT -p tcp -d 192.168.1.161 --dport 22 -j DNAT --to-destination 192.168.122.2:22
iptables -t nat -I PREROUTING -i eno1 -p tcp --dport 22 -j DNAT --to 192.168.122.2:22
iptables -I FORWARD -m state -d 192.168.122.2/24 -state NEW,ESTABLISHED,RELATED -j ACCEPT
Ключ был найден здесь: Перенаправление порта iptables не работает для localhost указывает, что PREROUTING не используется интерфейсом обратной связи.
Какова политика по умолчанию для ваших iptables (можно проверить с помощью iptables -L
)? Если он установлен на DROP, вам также необходимо включить пересылку на виртуальную машину:
iptables -A FORWARD -p tcp -d 192.168.1.161 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Изменить: я предполагаю маскировка включен, поскольку вы используете virt-manager, который использует libvirt, и это поведение по умолчанию с режимом NAT. Вы должны изменить свои правила iptables на:
iptables -t nat -A PREROUTING -i eno1 -p tcp --dport 22 -j DNAT --to 192.168.122.2:22
iptables -A FORWARD -p tcp -i eno1 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Если маскировка не включена, ваша виртуальная машина должна иметь маршрут к вашей домашней сети, чтобы отвечать.