通过 WireGuard 转发 VPS 流量

通过 WireGuard 转发 VPS 流量

因此,在过去的 24 小时里,我一直在绞尽脑汁解决这个问题。

长话短说,我的家庭互联网通过 4G 移动网络运行,因此这意味着我无法通过主路由器进行端口转发。我有一些内部服务想要提供,例如 HTTP 服务器、RD 网关等。各种各样的东西。

图表 在此处输入图片描述 最终,我的最终目标是利用我在云中的 VPS 将端口转发到我家庭网络内的服务。我有一个具有公共 IP 的 Ubuntu VPS 云服务器(现在假设它是 111.111.111.111...)运行 WireGuard,连接到我家庭网络内的 VM 中运行的另一个 Ubuntu Box。我已设法建立并运行 WireGuard 连接。我可以通过 WireGuard 隧道 ping 我的 VPS 和内部 Ubuntu VM。需要说明的是,我不想通过 WireGuard VPN 转发我家庭网络的互联网流量;我只想将到达我 VPS 特定端口的请求转发到我家庭网络上的特定设备,然后我的家庭网络服务能够回复它。

假设我家里的网络中有三种不同的服务需要访问

  • HTTP 服务器 - 位于我的家庭网络内,地址为 192.168.1.252。它将在端口 80 上接受 HTTP 流量
  • 另一个 HTTP 服务器 - 这次它直接位于我家庭网络内的 Ubuntu VM 上。它可以通过 IP 192.168.1.247 从我的内部网络访问。由于我的 WireGuard,当我的 VPS 连接到 192.168.4.4:80 时,它已经可以从我的 VPS 服务器访问。目前无法从外部世界访问它。我也知道我们在这里看到端口冲突,因为我的另一个 HTTP 服务器也在监听端口 80。这里的主要目的是当 VPS 上的端口 8080 被命中时,我希望它命中这个 HTTP 服务器。如果这让一切变得复杂,那么我不介意放弃这个 HTTP 服务器并只保留第一个 HTTP 服务器。
  • RDP 服务器 - 这将在 192.168.1.251 上运行,通过端口 3389。我已经知道您对 3389 重定向的想法,但这只是为了举例。最后,我将通过端口 443 整理出 RD 网关服务器。我有点想使用这个示例,然后在后面将其塑造成 RD 网关服务器。我现在只想启动并运行 3389 RDP。

我尝试了所有可能的 iptables 命令来启动它,但都没有成功。我搜索了所有网络,但找不到任何答案。我设法在我的 VPS 上的 wg0.conf 文件中收集了相当长的 PostUp 和 PostDown 规则列表(顺便说一下,我已经将它们全部注释掉了……)。我知道我还必须在内部 Ubuntu VM 上创建类似的 PostUp 和 PostDown iptables 命令才能使其正常工作。

最接近实现此目的的方法是使用名为 Caddy 的反向代理程序。尽管我设法使我的内部 Ubuntu HTTP 服务器可从互联网访问,但我无法使其连接到我的其他 HTTP 服务器和我的 RDP 盒。

提醒一下,我不太擅长 Linux。我知道如何绕过某些部分,但这需要每一步都用 Google 搜索。我有点惊讶自己能走到这一步。

提醒一下,我的 VPS 上的 /etc/sysctl.conf 文件中已经设置了 net.ipv4.ip_forward=1

如果您能帮助我设置这个端口转发系统,我将不胜感激!

答案1

经过许多、许多小时,在 Mircea 的帮助下,我终于解决了这个问题,他为我指明了正确的方向。

唯一的问题是我真的希望我完全理解我刚才做了什么,但无论如何我都会尝试一下并发布我所做的事情。

原来是 iptables 的问题。我不仅需要提供 PREROUTING 规则,还需要设置 FORWARD 规则。为此,我为每个传入端口创建 FORWARD 规则,并设置允许 FORWARD 规则的接口。

之后,我按照 Mircea 指出的那样设置了 PREROUTING 规则。

最后,我必须设置 POSTROUTING 规则。

提醒一下,在上面的例子中,我说我的主要 HTTP 服务器位于 192.168.1.251。在下面的代码中,我实际上将其设置为 192.168.1.190 上的另一个 HTTP 服务器(仅用于测试)。RDP 服务器也是如此。它被描述为 192.168.1.252,但我实际上将它连接到 192.168.1.241 上的另一个 RDP 服务器

以下是我的 wg0.conf 文件的片段,它从云 VPS 端执行我的所有 iptable 规则

[Interface]
Address = 192.168.4.1/32
ListenPort = xxxx
PrivateKey = xxxx

PostUp = iptables -P FORWARD DROP

##FORWARD Port 80, 8080, 3389
PostUp = iptables -A FORWARD -i ens192 -o wg0 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT
PostUp = iptables -A FORWARD -i ens192 -o wg0 -p tcp --syn --dport 8080 -m conntrack --ctstate NEW -j ACCEPT
PostUp = iptables -A FORWARD -i ens192 -o wg0 -p tcp --syn --dport 3389 -m conntrack --ctstate NEW -j ACCEPT

##Generic Forwards
PostUp = iptables -A FORWARD -i ens192 -o wg0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
PostUp = iptables -A FORWARD -i wg0 -o ens192 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

##Drop FORWARD Port 80, 8080, 3389
PostDown = iptables -D FORWARD -i ens192 -o wg0 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT
PostDown = iptables -D FORWARD -i ens192 -o wg0 -p tcp --syn --dport 8080 -m conntrack --ctstate NEW -j ACCEPT
PostDown = iptables -D FORWARD -i ens192 -o wg0 -p tcp --syn --dport 3389 -m conntrack --ctstate NEW -j ACCEPT

##Drop Generic Forwards
PostDown = iptables -D FORWARD -i ens192 -o wg0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
PostDown = iptables -D FORWARD -i wg0 -o ens192 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT



##Port 80
PostUp = iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.4.4:80
PostDown = iptables -t nat -D PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.4.4:80

PostUp = iptables -t nat -A POSTROUTING -o wg0 -p tcp --dport 80 -d 192.168.4.4 -j SNAT --to-source 192.168.4.1
PostDown = iptables -t nat -A POSTROUTING -o wg0 -p tcp --dport 80 -d 192.168.4.4 -j SNAT --to-source 192.168.4.1


##Port 8080
PostUp = iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.4.4:8080
PostDown = iptables -t nat -D PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.4.4:8080

PostUp = iptables -t nat -A POSTROUTING -o wg0 -p tcp --dport 8080 -d 192.168.4.4 -j SNAT --to-source 192.168.4.1
PostDown = iptables -t nat -A POSTROUTING -o wg0 -p tcp --dport 8080 -d 192.168.4.4 -j SNAT --to-source 192.168.4.1


##Port 3389
PostUp = iptables -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT --to-destination 192.168.4.4:3389
PostDown = iptables -t nat -D PREROUTING -p tcp --dport 3389 -j DNAT --to-destination 192.168.4.4:3389

PostUp = iptables -t nat -A POSTROUTING -o wg0 -p tcp --dport 3389 -d 192.168.4.4 -j SNAT --to-source 192.168.4.1
PostDown = iptables -t nat -A POSTROUTING -o wg0 -p tcp --dport 3389 -d 192.168.4.4 -j SNAT --to-source 192.168.4.1


[Peer]
PublicKey = xxxxx
AllowedIPs = 192.168.4.4/32

至于我的内部 WireGuard VM,这是它的 wg0.conf 文件

[Interface]
PrivateKey = xxxx
Address = 192.168.4.4/32

PostUp = iptables -P FORWARD DROP

##FOWARD 8080, 3389
PostUp = iptables -A FORWARD -i wg0 -o ens34 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT
PostUp = iptables -A FORWARD -i wg0 -o ens34 -p tcp --syn --dport 3389 -m conntrack --ctstate NEW -j ACCEPT

#Generic Forwards - Setting up Interfaces for Forwarding
PostUp = iptables -A FORWARD -i wg0 -o ens34 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
PostUp = iptables -A FORWARD -i ens34 -o wg0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

#Drop FORWARD 8080, 3389
PostDown = iptables -D FORWARD -i wg0 -o ens34 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT
PostDown = iptables -D FORWARD -i wg0 -o ens34 -p tcp --syn --dport 3389 -m conntrack --ctstate NEW -j ACCEPT

#Drop Generic Forwards
PostDown = iptables -D FORWARD -i wg0 -o ens34 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
PostDown = iptables -D FORWARD -i ens34 -o wg0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT



#Port 8080 Inbound to external 80
PostUp = iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.190:80
PostDown = iptables -t nat -D PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.190:80

PostUp = iptables -t nat -A POSTROUTING -o ens34 -p tcp --dport 80 -d 192.168.1.190 -j SNAT --to-source 192.168.1.247
PostDown = iptables -t nat -A POSTROUTING -o ens34 -p tcp --dport 80 -d 192.168.1.190 -j SNAT --to-source 192.168.1.247


#Port 3389
PostUp = iptables -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT --to-destination 192.168.1.241:3389
PostDown = iptables -t nat -D PREROUTING -p tcp --dport 3389 -j DNAT --to-destination 192.168.1.241:3389

PostUp = iptables -t nat -A POSTROUTING -o ens34 -p tcp --dport 3389 -d 192.168.1.241 -j SNAT --to-source 192.168.1.247
PostDown = iptables -t nat -A POSTROUTING -o ens34 -p tcp --dport 3389 -d 192.168.1.241 -j SNAT --to-source 192.168.1.247



[Peer]
PublicKey = xxxx
AllowedIPs = 192.168.4.1/32
Endpoint = xxxx
PersistentKeepalive = 25

我希望这能帮助遇到类似问题的人!

答案2

您需要在 INPUT 表上使用 DNAT 规则云虚拟机

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.4.4:80

Wireguard 虚拟机您可能还需要在 INPUT 表上使用 DNAT 规则,因为我不希望 Wireguard 前缀路由出现在家庭 LAN 中所有计算机的路由表中。目前您有 2 个路由器,但没有动态路由。这意味着最简单的方法是在 wireguard 上使用 DNAT。

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.252:80

相关内容