没有流量将是外部的(面向互联网),所有流量将是内部的。
我想要实现的是从 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