
沒有流量將是外部的(面向互聯網),所有流量將是內部的。
我想要實現的是從 WINDOWS PC 1 進行 RDP,將來自 WINDOWS PC 1 的 RDP 流量偽裝成 Linux 伺服器 IP 位址 (10.0.2.5),並從那裡繼續到達目標 WINDOWS PC 2。
這是一張圖片來進一步說明:
WINDOWS PC 1 (10.0.2.122)
|
[RDP]
|
V
LINUX SERVER (10.0.2.5)
|
[FW 3389]
|
V
WINDOWS PC 2 (10.0.2.188)
我嘗試過的
- 我已經在核心中啟用了連接埠轉送:
sysctl net.ipv4.ip_forward=1
- 我已經嘗試了許多論壇的幾個答案,但仍然不行:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 3389 -j DNAT --to 10.0.2.188:3389
iptables -A FORWARD -p tcp --dport 3389 -d 10.0.2.188 -j ACCEPT
- 我觀察了 iptables 計數器,沒有看到任何活動:
watch 'iptables -vL'
答案1
看完你的評論後,看來這兩台電腦是同一台電腦的一部分區域網路(LAN)。這就是為什麼您看不到來自 Linux Box 的流量的原因。
本教程將教您 LAN 的基礎知識,但使其變得簡單:
- 這些計算機將透過以下方式相互了解ARP;
- 他們會「看到」他們屬於同一個區域網路並且會直接交談
- 如果您的 Linux 機器是網關,它將僅用於路由不屬於該 lan 的流量(超出
10.0.2.0/24
或您定義的任何遮罩)
太,博士:這些電腦位於同一個 LAN 上,因此,要查看來自 Linux 機器的一些流量(並且您將無法“攔截/破壞”,只能查看”),您必須將 Linux 網路卡置於 promisc 模式:ip link set dev eth0 promisc on
好的。透過所有這些理論知識,當您在同一個區域網路內建立一個DNAT
內部時,您將必須使用 SNAT「強制」將封包傳回其起源。這是一種特殊情況,即在執行 NAT 時同一 LAN 上有 2 台電腦。
iptables -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT --to-destination 10.0.2.188:3389
iptables -t nat -A POSTROUTING -p tcp -d 10.0.2.188 --dport 3389 -j SNAT --to-source 10.0.2.122
透過這種方式,您將強制執行,當封包返回到您的 Linux 機器時,將執行 Source nat10.0.2.122
其他替代方案:
做一個具有 HA 代理的 RDP 代理並將這些主機放在不同的網路上。這是一種過度殺傷力(創建單一成員 rdp 代理餘額),但它是一種替代方案。
答案2
HAProxy解決方案
比照。Microsoft 遠端桌面服務 (RDS) 負載平衡
sudo apt install haproxy
cat << EOF | sudo tee -a /etc/haproxy/haproxy.cfg
frontend ft_rdp
mode tcp
bind :3389 name rdp
timeout client 1h
log global
option tcplog
tcp-request inspect-delay 2s
tcp-request content accept if RDP_COOKIE
default_backend bk_rdp
backend bk_rdp
mode tcp
balance leastconn
persist rdp-cookie
timeout server 1h
timeout connect 4s
log global
option tcp-check
tcp-check connect port 3389 ssl
default-server inter 3s rise 2 fall 3
server windows_pc_2 10.0.2.188:3389 weight 10 verify none
EOF
sudo systemctl restart haproxy
systemctl list-units | grep haproxy