我正在运行 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 的项目讨论中。以下是操作步骤。
- 运行
wg-easy
容器(例子来自文档) - 进入仪表板并登录
- 添加新客户端并下载其配置
- 进入主机并安装 wireguard:
sudo apt install wireguard -y
- 添加新的 WireGuard 配置:
sudo nano /etc/wireguard/wg0.conf
- 在此处粘贴从仪表板获取的文件配置
- 像下面这样编辑您的配置
- AllowedIPs = 0.0.0.0/0, ::/0
+ AllowedIPs = 10.8.0.0/24
- 运行你的 wireguard 隧道:
sudo wg-quick up wg0
- 现在您可以从 WireGuard 隧道访问对等点:
ping 10.8.0.1
我认为该解决方案是最好的,因为不需要管理多个iptable
代理规则,并且只需手动更改主机网络即可。