如何将请求代理到 wg-easy docker 容器中?

如何将请求代理到 wg-easy docker 容器中?

我正在运行 VPSwg-easydocker 镜像和 Orange Pi 4B,位于家中。我想通过 WireGuard 隧道将 VPS 的请求代理到 Orange Pi,为我和我的朋友创建一个 minecraft 服务器。对于代理请求,我将使用它nginx(可能不是最好的解决方案,但至少我知道如何使用它)。

一开始,我尝试ping 10.8.0.2(WireGuard 中的 Orange Pi 的 IP),但没有反应。然后我执行了下一个命令sudo docker exec -it wg-easy ping 10.8.0.2,成功了。

vps-user@vps:~$ ping 10.8.0.2
PING 10.8.0.2 (10.8.0.2) 56(84) bytes of data.
--- 10.8.0.2 ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 4093ms

vps-user@vps:~$ sudo docker exec -it wg-easy ping 10.8.0.2
PING 10.8.0.2 (10.8.0.2): 56 data bytes
64 bytes from 10.8.0.2: seq=0 ttl=65 time=57.427 ms
64 bytes from 10.8.0.2: seq=1 ttl=65 time=56.928 ms
64 bytes from 10.8.0.2: seq=2 ttl=65 time=57.318 ms
^C
--- 10.8.0.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 56.928/57.224/57.427 ms

所以我认为我的 Orange Pi 只能在 docker 容器内访问。

当我研究这个问题时,我发现讨论在 GitHub repo 中。据我所知,有答案如何代理确切端口。但我发现这种方法有点难,因为如果我需要添加更多端口,我必须附加更多样板文件,并且不要犯错误。

我还发现了--network host争论。我尝试在 VM 中使用它。它添加了一个真实wg0接口,并使在主机内 ping 对等点成为可能。这是演示,它是如何工作的(我更改了/etc/sysctl.conf后台并删除了一些ifconfig输出,只留下了接口名称和 IP)

osboxes@osboxes:~$ ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255

enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0

osboxes@osboxes:~$ sudo docker start wg-easy
[sudo] password for osboxes: 
wg-easy

osboxes@osboxes:~$ ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255

enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0

wg0: flags=209<UP,POINTOPOINT,RUNNING,NOARP>  mtu 1420
        inet 10.8.0.1  netmask 255.255.255.0  destination 10.8.0.1

osboxes@osboxes:~$ ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from 10.8.0.1: icmp_seq=2 ttl=64 time=0.033 ms
64 bytes from 10.8.0.1: icmp_seq=3 ttl=64 time=0.035 ms
^C
--- 10.8.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2036ms
rtt min/avg/max/mdev = 0.032/0.033/0.035/0.001 ms

这个东西对我来说看起来不错,但我不确定它到底是如何工作的,在真正的服务器上使用它有点可怕。我看了 NetworkChuk 的教程关于docker网络,但是,可能,不明白,因为英语不是我的主要语言。

那么有没有更好的方法来访问内部docker容器网络?

答案1

我发现了上述方法的一些优缺点。我还认为我找到了代理请求的最佳方法。

将容器网络更改为host

一方面,这是初学者最容易暴露内部网络的方式;另一方面,这也是不安全的,因为容器内部网络的每一次变化都会影响到宿主机的网络。

sudo nano /etc/sysctl.conf
# At the end of file you have to add next two lines
net.ipv4.conf.all.src_valid_mark=1
net.ipv4.ip_forward=1

sudo sysctl -p

sudo docker run -d \
  --name=wg-easy \
  -e WG_HOST=YOUR_IP_OR_DOMAIN \
  -e PASSWORD=CHANGE_ME \
  -v ~/.wg-easy:/etc/wireguard \
  -p 51820:51820/udp \
  -p 51821:51821/tcp \
  --cap-add=NET_ADMIN \
  --cap-add=SYS_MODULE \
  --network host \
  --restart unless-stopped \
  ghcr.io/wg-easy/wg-easy

代理精确端口

代理请求最困难的方法。如果我只需要为一个对等点代理一个端口,那么这是我唯一会使用的方法。

sudo docker run -d \
  --name=wg-easy \
  -e WG_HOST=YOUR_IP_OR_DOMAIN \
  -e PASSWORD=CHANGE_ME \
  -e "WG_POST_UP=iptables -A FORWARD -i wg0 -j ACCEPT;iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 25565 -j DNAT --to-destination 10.8.0.2:25565" \ 
  -e "WG_POST_DOWN=iptables -D FORWARD -i wg0 -j ACCEPT;iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; iptables -D PREROUTING -t nat -i eth0 -p tcp --dport 25565 -j DNAT --to-destination 10.8.0.2:25565" \ 
  -v ~/.wg-easy:/etc/wireguard \
  -p 51820:51820/udp \
  -p 51821:51821/tcp \
  -p 25565:25565 \
  --cap-add=NET_ADMIN \
  --cap-add=SYS_MODULE \
  --sysctl="net.ipv4.conf.all.src_valid_mark=1" \
  --sysctl="net.ipv4.ip_forward=1" \
  --restart unless-stopped \
  ghcr.io/wg-easy/wg-easy

以下是解决方案的缺点:

  • 难以管理代理端口,你可能会忘记从 docker 公开端口,或者忘记添加命令来禁用代理WG_POST_DOWN
  • 很难为不同的 IP 地址代理多个相同的端口
  • 你必须了解如何与iptables

将主机连接到 WireGuard 隧道

当我研究我的问题时,我还发现评论在 GitHub 的项目讨论中。以下是操作步骤。

  1. 运行wg-easy容器(例子来自文档)
  2. 进入仪表板并登录
  3. 添加新客户端并下载其配置
  4. 进入主机并安装 wireguard:sudo apt install wireguard -y
  5. 添加新的 WireGuard 配置:sudo nano /etc/wireguard/wg0.conf
  6. 在此处粘贴从仪表板获取的文件配置
  7. 像下面这样编辑您的配置
- AllowedIPs = 0.0.0.0/0, ::/0
+ AllowedIPs = 10.8.0.0/24
  1. 运行你的 wireguard 隧道:sudo wg-quick up wg0
  2. 现在您可以从 WireGuard 隧道访问对等点:ping 10.8.0.1

我认为该解决方案是最好的,因为不需要管理多个iptable代理规则,并且只需手动更改主机网络即可。

相关内容