Windows 没有公网 IP,Ubuntu 有公网 IP
想要远程访问 Windows 的远程桌面 (3389) 或其他服务
Ubuntu 作为中转网关,把流量转给内网 Windows
# 临时开启 echo 1 > /proc/sys/net/ipv4/ip_forward # 永久开启 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p
假设:
Ubuntu 外网 IP:1.2.3.4
Windows 内网 IP:192.168.1.100
# DNAT:把发往 Ubuntu 3389 端口的流量转给 Windows iptables -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT --to-destination 192.168.1.100:3389 # SNAT:确保回程流量能回来(重要!) iptables -t nat -A POSTROUTING -d 192.168.1.100 -p tcp --dport 3389 -j MASQUERADE # FORWARD 放行 iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 3389 -j ACCEPT
# 查看规则 iptables -t nat -L -n -v --line-numbers # 保存规则(Ubuntu) iptables-save > /etc/iptables/rules.v4
在 Windows 上允许远程桌面连接,或添加入站规则放行 3389 端口-9。
| 项目 | 值 |
|---|---|
| Ubuntu 公网 IP | 1.2.3.4 |
| Windows 内网 IP | 192.168.1.100 |
| 转发的端口 | 3389(远程桌面) |
配置完成后,在任何地方使用远程桌面连接 1.2.3.4:3389,即可访问 Windows。
| 问题 | 原因 | 解决 |
|---|---|---|
| 连接不上 | IP 转发未开启 |
sysctl net.ipv4.ip_forward 检查 |
| 连上就断 | 缺 SNAT 规则 |
加上 -j MASQUERADE |
| Ubuntu 重启失效 | 规则没保存 |
执行 iptables-save 持久化 |
如果不想记 iptables 语法,可以用 80km无痕网关(曾用名:80KM端口流量转发程序),JSON 配置即可完成转发。
forwarder.json:
{ "listen": "0.0.0.0:3389", "routers": [ {"from": "0.0.0.0/0", "to": "192.168.1.100:3389"} ] }
80km-forwarder -config forwarder.json
优势:无需记忆 iptables、热加载、自带监控界面。
一句话总结:sysctl -w net.ipv4.ip_forward=1 → iptables DNAT + MASQUERADE → 搞定。或者直接用 80km无痕网关。