web-dev-qa-db-ja.com

iptablesを使用してLinuxマシン経由でRDPを転送する:機能しない

NATを実装するルータの背後にLinuxマシンとWindowsマシンがあります(図はやり過ぎかもしれませんが、 作るのが楽しい )でした:)

network setup

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

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はこれを行うのですか?

4

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が必要です。以下のコメントを参照してください(表示する必要がある場合があります)。

5
ericzma

MASQUERADEで問題を解決したのを見ました。最後のコメントが隠されていることに気づかなかったので、素晴らしいIptablesチュートリアル(Freshmeatで探してください)のおかげで、自分で質問を解決する必要がありました。私はあなたとほとんど同じことをしましたが、Linuxボックスには静的ローカルIPがあるため、MASQUERADEの代わりにSNATを実行しました。 MASQUERADEは、LinuxボックスのIPがDHCPによって提供されている場合はより適切です。そうでない場合は、より多くのプロセッサを消費するタスクであると通知されます。

FORWARDルールは必要ありませんでしたが、

エコー1 | Sudo tee/proc/sys/net/ipv4/ip_forward

2
Alberto

これは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が起動時にこれらのルールを適用することを確認します-インターネット上の多くのガイド。

0
Thomas Wilkins