我想将同一主机内的端口 500 转发到端口 2500,并且以下操作在 Lubuntu 16.04 上运行,但重新启动并重新运行 iptables 命令后,我无法使其工作:
iptables -t nat -A PREROUTING -p udp -d 192.168.1.10 –dport 500 -j DNAT –to-destination 192.168.1.10:2500
iptables -A FORWARD -p udp -d 192.168.1.10 –dport 2500 -j ACCEPT
其中 192.168.1.10 是我本地主机的 IP。
为了在一个会话中进行测试,我运行了 netcat:
nc -u 192.168.1.10:500
在第二次会话运行中:
nc -l -u 500
在第 3 次会话运行中:
nc -l -u 2500
因此,我希望我在会话 1 中输入的数据能够在会话 3 中接收,而不是会话 2,我确实已经让它工作了,但无法让它再次工作。
我也尝试过:
iptables -t nat -A PREROUTING -p udp --dport 500 -j REDIRECT --to-port 2500
但数据包仍在端口 500 上接收,而不是 2500。
ufw 已被禁用,为了确保 iptables 正常工作,我尝试了:
iptables -A INPUT -p udp --dport 500 -j DROP
然后没有像预期的那样在端口 500 或 2500 上接收到数据包。端口转发已启用:
# cat /proc/sys/net/ipv4/ip_forward
1
会话输出如下:
root@mike-TravelMate-8371:~/nat/out# iptables -t nat -S;iptables -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A PREROUTING -d 192.168.1.10/32 -p udp -m udp --dport 500 -j DNAT --to-destination 192.168.1.10:2500
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -d 192.168.1.10/32 -p udp -m udp --dport 2500 -j ACCEPT
root@mike-TravelMate-8371:~/nat/out# nohup nc -l -u 2500 > nc_2500.out &
[1] 29806
root@mike-TravelMate-8371:~/nat/out# nohup: ignoring input and redirecting stderr to stdout
root@mike-TravelMate-8371:~/nat/out# nohup nc -l -u 500 > nc_500.out &
[2] 29810
root@mike-TravelMate-8371:~/nat/out# nohup: ignoring input and redirecting stderr to stdout
root@mike-TravelMate-8371:~/nat/out# jobs
[1]- Running nohup nc -l -u 2500 > nc_2500.out &
[2]+ Running nohup nc -l -u 500 > nc_500.out &
root@mike-TravelMate-8371:~/nat/out# nc -u 192.168.1.10 500
test forwarding UDP port 500 to 2500
^C
[2]+ Done nohup nc -l -u 500 > nc_500.out
root@mike-TravelMate-8371:~/nat/out# head nc*.out
==> nc_2500.out <==
==> nc_500.out <==
test forwarding UDP port 500 to 2500
root@mike-TravelMate-8371:~/nat/out# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp2s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether 00:1e:33:24:98:86 brd ff:ff:ff:ff:ff:ff
3: wlp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:22:fb:64:bd:42 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.10/24 brd 192.168.1.255 scope global dynamic wlp1s0
valid_lft 85651sec preferred_lft 85651sec
inet6 fd58:7f66:569d:5300:c5df:415:6c56:50d6/64 scope global temporary dynamic
valid_lft 6788sec preferred_lft 3188sec
inet6 fd58:7f66:569d:5300:75d:bbe9:652e:6587/64 scope global mngtmpaddr noprefixroute dynamic
valid_lft 6788sec preferred_lft 3188sec
inet6 fe80::e214:14f8:d95c:73a7/64 scope link
valid_lft forever preferred_lft forever
4: vboxnet0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether 0a:00:27:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 192.168.56.1/24 brd 192.168.56.255 scope global vboxnet0
valid_lft forever preferred_lft forever
inet6 fe80::800:27ff:fe00:0/64 scope link
valid_lft forever preferred_lft forever
root@mike-TravelMate-8371:~/nat/out# ip route
default via 192.168.1.1 dev wlp1s0 proto static metric 600
192.168.1.0/24 dev wlp1s0 proto kernel scope link src 192.168.1.10 metric 600
192.168.56.0/24 dev vboxnet0 proto kernel scope link src 192.168.56.1 linkdown
我想要转发端口的原因是我想在外部服务器和在 Virtual Box 中运行的客户机之间设置 VPN。Vbox 客户机使用“NAT”网络,因此 Vbox 有自己的端口转发功能,可将端口转发到 IP 为 10.0.2.15 的 VM,因此在 Vbox 中,端口转发规则如下:
- TCP 主机 2222 至 Vbox 客户机 22
- UDP 主机 4500 至 Vbox 客户机 4500
- UDP 主机 2500 至 Vbox 客户机 500
第一个意思是我可以使用“ssh -p 2222[电子邮件保护]“
第二种意味着我可以在 4500 上发送 UDP 数据包,因此我可以使用“nc -u 192.168.1.10 4500”从主机发送数据包,并且我可以使用“nc -l -u 4500”看到它们在 Vbox 客户机上被接收(如果在主机上运行“nc -l -u 4500”,则看不到数据包)
第三,因为 Vbox 不会转发 1024 以下的保留端口,所以我无法转发端口 500,因此使用此规则,我可以在主机上使用“nc -u 192.168.1.10 2500”,并使用“nc -l -u 500”在 Vbox 客户机上接收 UDP 数据包。
因此,我想将主机上的 UDP 500 端口转发到端口 2500,这样 Vbox 就会将这些端口转发到客户机上的端口 500,并且这样做是可行的,但在重新启动并重新运行 iptables 命令后,它不起作用,经过几个小时的工作,我仍然无法弄清楚我做了什么不同的事情。
我尝试过设置带有 TCP 转发的 iptables(和 Vbox),但这也不起作用,我尝试过 ufw,也尝试过在运行和不运行 Vbox 的情况下转发本地端口,但端口从未被转发。
我也尝试过将端口转发到不存在的 IP:
iptables -t nat -A PREROUTING -p udp -d 192.168.1.10 --dport 500 -j DNAT --to-destination 192.168.1.30:500
iptables -A FORWARD -p udp -d 192.168.1.30 --dport 500 -j ACCEPT
因此这里 IP 192.168.1.30 不存在,但如果我在一个会话中运行“nc -u 192.168.1.10 500”,那么我仍然可以接收在主机(IP 为 192.168.1.10)上监听的数据包。
我尝试将 TCP 端口 3222 转发到端口 22,这样我就可以在不使用 netcat 的情况下进行测试,但这不起作用
root@mike-TravelMate-8371:~/nat# iptables -t nat -S;iptables -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A PREROUTING -d 192.168.1.10/32 -p tcp -m tcp --dport 3222 -j DNAT --to-destination 192.168.1.10:22
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -d 192.168.1.10/32 -p tcp -m tcp --dport 22 -j ACCEPT
root@mike-TravelMate-8371:~/nat# telnet 192.168.1.10 22
Trying 192.168.1.10...
Connected to 192.168.1.10.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.4
^C
Connection closed by foreign host.
root@mike-TravelMate-8371:~/nat# telnet 192.168.1.10 3222
Trying 192.168.1.10...
telnet: Unable to connect to remote host: Connection refused
root@mike-TravelMate-8371:~/nat#
因此在这里我可以使用端口 22 直接访问 ssh 端口,但是不能通过 3222 访问,所以转发不起作用。
答案1
Iptables 规则在重启后不会保留。您可能必须在重启后重新添加规则或使用 iptables-save / iptables-persistent。请参阅此链接。 如何使一组特定的 iptables 规则永久生效?
答案2
有同样的需求,并使用这两个命令使其工作。我只需要重定向本地呼叫,但127.0.0.1
可以用外部 IP 代替
sudo iptables -t nat -A PREROUTING -s 127.0.0.1 -p tcp --dport 1234 -j REDIRECT --to 1235
sudo iptables -t nat -A OUTPUT -s 127.0.0.1 -p tcp --dport 1234 -j REDIRECT --to 1235