NATを実装するルータの背後にLinuxマシンとWindowsマシンがあります(図はやり過ぎかもしれませんが、 作るのが楽しい )でした:)
RDP接続を監査したいので、ルーターのRDPポート(3389)をLinuxマシンに転送しています。 LinuxマシンがRDPトラフィックを転送するために、次のiptablesルールを記述しました。
iptables -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT --to-destination win-box
iptables -A FORWARD -p tcp --dport 3389 -j ACCEPT
ポートはWindowsマシンでリッスンしています:
C:\Users\nimmy>netstat -a
Active Connections
Proto Local Address Foreign Address State
(..snip..)
TCP 0.0.0.0:3389 WIN-BOX:0 LISTENING
(..snip..)
そして、ポートはLinuxマシンで転送しています:
# tcpdump port 3389
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
01:33:11.451663 IP shieldsup.grc.com.56387 > linux-box.myapt.lan.ms-wbt-server: Flags [S], seq 94663035, win 8192, options [mss 1460], length 0
01:33:11.451846 IP shieldsup.grc.com.56387 > win-box.myapt.lan.ms-wbt-server: Flags [S], seq 94663035, win 8192, options [mss 1460], length 0
ただし、外部からRDP接続が成功していません。ポートも応答していません:
C:\Users\outside-nimmy>telnet example.com 3389
Connecting To example.com...Could not open connection to the Host, on port 3389: Connect failed
何か案は?
@Zhiqiang Maによると、私はnf_conntrack
接続試行中のprocファイルとこれが私が見るものです(192.168.3.1 = linux-box、192.168.3.5 = win-box):
# cat /proc/net/nf_conntrack | grep 3389
ipv4 2 tcp 6 118 SYN_SENT src=4.79.142.206 dst=192.168.3.1 sport=43142 dport=3389 packets=6 bytes=264 [UNREPLIED] src=192.168.3.5 dst=4.79.142.206 sport=3389 dport=43142 packets=0 bytes=0 mark=0 secmark=0 zone=0 use=2
ルーターでtcpdump
を取得し、win-boxがRSTパケットを送信しているようです:
21:20:24.767792 IP shieldsup.grc.com.45349 > linux-box.myapt.lan.3389: S 19088743:19088743(0) win 8192 <mss 1460>
21:20:24.768038 IP shieldsup.grc.com.45349 > win-box.myapt.lan.3389: S 19088743:19088743(0) win 8192 <mss 1460>
21:20:24.770674 IP win-box.myapt.lan.3389 > shieldsup.grc.com.45349: R 721745706:721745706(0) ack 755785049 win 0
なぜWindowsはこれを行うのですか?
Iptablesルールにポートを追加しますか?:
iptables -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT --to-destination win-box:3389
iptables -A FORWARD -p tcp --dport 3389 -j ACCEPT
それが理由なのかよくわかりません。しかし、私は通常、次のようにします。 http://www.systutorials.com/816/port-forwarding-using-iptables/
最初にテーブルをフラッシュしてみてください。iptables-t nat -F; iptables -Fを実行してから、iptablesの他のルールが接続をブロックする場合に備えて、これら2つのルールを追加します。
あなたも
cat /proc/net/nf_conntrack
そこのコンテンツを見てください。各転送接続には、そこにエントリがあります。
注:Windowsからのアウトバウンドルートがデフォルトでiptables
ボックスを通過しない場合も、MASQUERADEが必要です。以下のコメントを参照してください(表示する必要がある場合があります)。
MASQUERADEで問題を解決したのを見ました。最後のコメントが隠されていることに気づかなかったので、素晴らしいIptablesチュートリアル(Freshmeatで探してください)のおかげで、自分で質問を解決する必要がありました。私はあなたとほとんど同じことをしましたが、Linuxボックスには静的ローカルIPがあるため、MASQUERADEの代わりにSNATを実行しました。 MASQUERADEは、LinuxボックスのIPがDHCPによって提供されている場合はより適切です。そうでない場合は、より多くのプロセッサを消費するタスクであると通知されます。
FORWARDルールは必要ありませんでしたが、
エコー1 | Sudo tee/proc/sys/net/ipv4/ip_forward
これはCentOS 7での私の方法でした:
まず、IPv4転送を有効にします。/etc/sysctl.confで、次の行があることを確認します。
net.ipv4.ip_forward=1
次に、iptablesを構成します。
iptables -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT --to-destination <WINDOWS SERVER IP>
iptables -A FORWARD -p tcp --dport 3389 -j ACCEPT
iptables -t nat -A POSTROUTING -j MASQUERADE
最後に、iptablesが起動時にこれらのルールを適用することを確認します-インターネット上の多くのガイド。