You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

借助WireGuard通过云VPS实现家庭内网服务的端口转发配置求助

借助WireGuard通过云VPS实现家庭内网服务的端口转发配置求助

我太懂你这种抓头发的感觉了——4G宽带没法做端口转发,想把家里服务暴露出去确实绕得慌。不过你已经把WireGuard隧道打通了,这最关键的一步搞定了,剩下的就是iptables的端口转发和路由调整,其实没你想的那么复杂,咱们一步步来:

先确认前提信息

先对齐一下基础配置,避免踩坑:

  • 假设你的VPS WireGuard内网IP是192.168.4.1,家里Ubuntu VM的WireGuard IP是192.168.4.4(你提到的),隧道网段是192.168.4.0/24
  • 你已经在VPS上开启了IPv4转发(net.ipv4.ip_forward=1),这个没问题

第一步:VPS端的WireGuard + iptables配置

直接把端口转发规则写到VPS的wg0.conf里的PostUpPostDown段,这样WireGuard启动/关闭时会自动加载/清理规则,不用手动敲命令。

打开VPS的/etc/wireguard/wg0.conf,添加或修改以下内容:

PostUp = iptables -A FORWARD -i wg0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT; iptables -A FORWARD -i eth0 -o wg0 -j ACCEPT; iptables -t nat -A PREROUTING -d 111.111.111.111 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.252:80; iptables -t nat -A PREROUTING -d 111.111.111.111 -p tcp --dport 8080 -j DNAT --to-destination 192.168.4.4:80; iptables -t nat -A PREROUTING -d 111.111.111.111 -p tcp --dport 3389 -j DNAT --to-destination 192.168.1.251:3389; iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT; iptables -D FORWARD -i eth0 -o wg0 -j ACCEPT; iptables -t nat -D PREROUTING -d 111.111.111.111 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.252:80; iptables -t nat -D PREROUTING -d 111.111.111.111 -p tcp --dport 8080 -j DNAT --to-destination 192.168.4.4:80; iptables -t nat -D PREROUTING -d 111.111.111.111 -p tcp --dport 3389 -j DNAT --to-destination 192.168.1.251:3389; iptables -t nat -D POSTROUTING -o wg0 -j MASQUERADE

规则解释(怕你懵,简单说下):

  • FORWARD规则:允许公网流量进入WireGuard隧道,也允许隧道回来的响应流量出去
  • PREROUTING的DNAT:把VPS公网IP对应端口的请求,转发到你家里的目标服务地址
  • POSTROUTING的MASQUERADE:把转发到隧道的请求源地址改成VPS的隧道IP,这样家里的服务知道该把回复发回哪里

第二步:家里Ubuntu VM的配置(关键!不然回复包走丢)

家里的其他设备(比如192.168.1.252、192.168.1.251)默认网关是家庭路由器,它们不知道要把发往VPS公网IP的回复包通过WireGuard VM转发,所以得做两个配置:

1. 开启VM的IPv4转发

和VPS一样,编辑VM的/etc/sysctl.conf,设置net.ipv4.ip_forward=1,然后执行:

sysctl -p

2. 解决回复包路由问题(二选一)

方案A:家庭路由器加静态路由(推荐)

如果你的家庭路由器支持添加静态路由,就加一条:

  • 目标地址:111.111.111.111(VPS公网IP)
  • 下一跳:192.168.1.247(家里VM的内网IP)
    这样家里设备的回复包会直接发到VM,再通过WireGuard隧道回VPS。

方案B:VM上做SNAT(路由器不支持静态路由时用)

如果路由器没法加路由,就在VM上执行这条iptables命令(可以加到开机自启里,比如用iptables-persistent保存规则):

iptables -t nat -A POSTROUTING -d 192.168.1.0/24 -o eth0 -j MASQUERADE

这条规则会把从隧道过来、发往家里内网的请求源地址改成VM的内网IP,这样家里设备的回复会直接回VM,不用走路由器。


第三步:VPS防火墙放行端口

别忘了VPS的防火墙(比如ufw)要允许这些端口的入站流量,不然请求会被直接挡住:

ufw allow 80/tcp
ufw allow 8080/tcp
ufw allow 3389/tcp
ufw reload

第四步:测试验证

  1. 重启WireGuard服务,让规则生效:
    • VPS:wg-quick down wg0 && wg-quick up wg0
    • 家里VM:同样执行上面的命令
  2. 用外部设备测试:
    • 访问http://111.111.111.111,应该能打开192.168.1.252的HTTP服务
    • 访问http://111.111.111.111:8080,应该能打开家里VM上的HTTP服务
    • 用远程桌面连接111.111.111.111:3389,应该能连上192.168.1.251的RDP服务

额外提醒

  • 关于RD Gateway:之后换成443端口的话,只需要把上面规则里的3389换成443,目标地址改成RD Gateway的IP和端口就行,思路完全一样
  • 如果你想用Caddy转发TCP(比如RDP),其实也可以,只需要在Caddyfile里加TCP转发的配置,但iptables更轻量直接,适合你的场景
  • 如果测试不通,可以先在VPS上用tcpdump抓包,看看请求有没有进来,或者在VM上用tcpdump看隧道里有没有流量,一步步排查

备注:内容来源于stack exchange,提问作者Flakie

火山引擎 最新活动