如何在本地重定向/轉送端口

如何在本地重定向/轉送端口

我想將同一台主機內的連接埠 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

在第三次會話中運行:

nc -l -u 2500

因此,我希望在會話 1 中輸入的資料在會話 3 上接收,而不是在會話 2 上接收,會話 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 

我想要轉送連接埠的原因是我想在外部伺服器和虛擬機器中運行的來賓之間設定 VPN。 Vbox 來賓使用「NAT」網絡,因此 Vbox 有自己的連接埠轉發,將連接埠轉發到 IP 為 10.0.2.15 的虛擬機,因此在 Vbox 中,連接埠轉送規則為:

  1. TCP 主機 2222 到 Vbox 訪客 22
  2. UDP 主機 4500 到 Vbox 訪客 4500
  3. UDP 主機 2500 到 Vbox 訪客 500

第一個意味著我可以使用“ssh -p 2222”透過 ssh 連線到達賓[電子郵件受保護]

第二個意味著我可以在4500 上發送UDP 資料包,因此我可以使用“nc -u 192.168.1.10 4500”從主機發送資料包,並且我可以使用“nc -l -u 4500”在Vbox guest 上看到它們被接收(封包如果您在主機上執行“nc -l -u 4500”,則看不到)

第三個是因為Vbox 不會轉送1024 以下的保留端口,所以我無法轉送端口500,因此通過此規則,我可以在主機上使用“nc -u 192.168.1.10 2500”,並使用“nc -l - 」在Vbox 客戶機上接收UDP 封包。你500」。

所以我想將主機上的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

相關內容