Назад | Перейти на главную страницу

Перенаправление RDP через машину Linux с использованием iptables: не работает

У меня есть машина Linux и машина Windows за маршрутизатором, который реализует NAT (диаграмма может быть излишней, но была весело делать):

Я перенаправляю порт RDP (3389) на маршрутизаторе на компьютер Linux, потому что хочу проверить соединения RDP. Чтобы машина 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 это делать?

Добавить порт в правила 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 блокируют соединение.

Вы можете также

cat /proc/net/nf_conntrack

и посмотри там контент. У каждого переадресующего соединения есть записи.

Заметка: MASQUERADE также требуется, если исходящий маршрут из окон по умолчанию не проходит через iptables коробка; см. комментарии ниже (возможно, вам придется показать).

Я видел, как вы решили проблему с MASQUERADE. Я не заметил, что последний комментарий был скрыт, поэтому мне пришлось решить вопрос самостоятельно, благодаря замечательному учебнику Iptables (ищите его в Freshmeat). Я сделал почти то же самое, что и вы, но сделал SNAT вместо MASQUERADE, так как у Linux-бокса статический локальный IP-адрес. MASQUERADE был бы более подходящим, если бы IP-адрес Linux-бокса был задан 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 применяет эти правила при загрузке - многие руководства в Интернете.