同じホスト内でポート 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 のポート転送ルールは次のようになります。
- TCP ホスト 2222 から Vbox ゲスト 22
- UDP ホスト 4500 から Vbox ゲスト 4500
- 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