将流量从端口 22 转发到 ubuntu 上的虚拟计算机

将流量从端口 22 转发到 ubuntu 上的虚拟计算机

我正在尝试将流量从主机上的端口 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是eno1的本地ip。192.168.122.2是虚拟机的ip。

我已经检查过我可以从主机连接到虚拟机。

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

如果我尝试从主机 ( ) ssh 进入虚拟机,它会正常工作。如果我从我的工作站 (与主机位于同一网络) 尝试,它会超时。正如 tcpdump 中提到的,我可以看到包到达主机,但似乎没有转发到虚拟机。我已在非默认端口上运行到主机本身的 SSH。ssh [email protected]ssh [email protected]

主机运行的是 Ubuntu 17.10。客户机运行的是 Debian GNU/Linux 9

VM 由 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

答案1

我发现这是有效的: https://ubuntuforums.org/showthread.php?t=2261173&p=13210545#post13210545

总结

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

答案2

我发现这些答案都有效,只是从主机本身到虚拟机不起作用。所以我建议在答案中添加一条 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 端口重定向不适用于本地主机表示环回接口没有使用PREROUTING。

答案3

你的 iptables 的默认策略是什么(可以用 检查iptables -L)?如果设置为 DROP,你也需要启用到 VM 的转发:

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

如果未启用伪装,您的虚拟机必须具有到您的家庭网络的路由才能做出响应。

相关内容