Iptables

將流量從埠 22 轉發到 ubuntu 上的虛擬電腦

  • August 4, 2020

我正在嘗試將流量從主機上的埠 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 時,我確實看到包進入主機。在 VM 上執行 equivilent 顯示沒有傳入的 package.s

192.168.1.161是eno1的本地ip。192.168.122.2 是虛擬機的ip。

我已經檢查過我可以從主機連接到虛擬機。

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

如果我嘗試從主機 ( ssh user@192.168.122.2) SSH 進入虛擬機,它工作正常。如果我從我的工作站(與主機相同的網路)嘗試ssh user@192.168.1.161它會超時。正如 tcpdump 中提到的,我可以看到包到達主機,但似乎沒有轉發到 VM。我有 SSH 到在非預設埠上執行的主機本身。

主機執行的是 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

我發現這是可行的: https ://ubuntuforums.org/showthread.php?t=2261173&p=13210545#post13210545

TL;博士

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 port redirect not working for localhost表示環回介面沒有使用 PREROUTING。

引用自:https://serverfault.com/questions/913246