ローカルでポートをリダイレクト/転送する方法

ローカルでポートをリダイレクト/転送する方法

同じホスト内でポート 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 です。1
つのセッションでテストするには、netcat を実行します。

nc -u 192.168.1.10:500

2 回目のセッション実行では次のようになります。

nc -l -u 500

3 回目のセッション実行では次のようになります。

nc -l -u 2500

したがって、セッション 1 で入力したデータをセッション 2 ではなくセッション 3 で受信したいのですが、セッション 2 は動作していたのですが、再び動作させることができません。

私も試しました:

iptables -t nat -A PREROUTING -p udp --dport 500 -j REDIRECT --to-port 2500

しかし、パケットは引き続きポート 2500 ではなくポート 500 で受信されます。

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 のポート転送ルールは次のようになります。

  1. TCP ホスト 2222 から Vbox ゲスト 22
  2. UDP ホスト 4500 から Vbox ゲスト 4500
  3. UDP ホスト 2500 から Vbox ゲスト 500

1つ目は、「ssh -p 2222」を使用してゲストにsshできることを意味します。[メールアドレス]

2 つ目は、4500 で UDP パケットを送信できることを意味します。つまり、ホストから「nc -u 192.168.1.10 4500」を使用してパケットを送信でき、「nc -l -u 4500」を使用して Vbox ゲストで受信されたパケットを確認できます (ホストで「nc -l -u 4500」を実行すると、パケットは表示されません)。

3 番目は、Vbox は 1024 未満の予約済みポートを転送しないため、ポート 500 を転送できないためです。そのため、このルールでは、ホストで「nc -u 192.168.1.10 2500」を使用し、Vbox ゲストで「nc -l -u 500」を使用して 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 は存在しませんが、1 つのセッションで「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

同じニーズがあり、これら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

関連情報