我有运行wg-easy docker 镜像的 VPS 和 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 存储库中发现了该讨论。据我了解,有答案如何代理确切的端口。但我发现这种方式有点困难,因为如果我需要添加更多端口,我必须附加更多样板并且不要出错。
我还发现了--network host
争论。我尝试在虚拟机中使用它。它添加了一个真实的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容器网络呢?
我发现了所提到的方法的一些优点和缺点。我还认为我找到了代理请求的最佳方法。
将容器网络更改为
host
一方面,对于初学者来说,这是最简单的暴露内网的方式。另一方面它是不安全的,因为容器内网络的每次变化都会影响主机网络。
代理确切端口
代理请求的最困难的方法。如果我只需要为一个对等点代理一个端口,这是我使用它的唯一方法。
这是解决方案的缺点:
WG_POST_DOWN
iptables
将主机连接到 WireGuard 隧道
当我研究我的问题时,我还在项目的 GitHub 讨论中发现了该评论。所以这是步骤,以及如何做。
wg-easy
容器(文档中的示例)sudo apt install wireguard -y
sudo nano /etc/wireguard/wg0.conf
sudo wg-quick up wg0
ping 10.8.0.1
我认为该解决方案是最好的,因为不需要管理多个
iptable
代理规则,并且对主机网络的唯一更改是由您的双手进行的。