我正在尝试使用 wireguard 设置 VPN 服务器。
我在docker compose中有以下设置:
version: "3.1"
services:
wireguard:
image: linuxserver/wireguard
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Berlin
- SERVERURL=someoffice.com
- SERVERPORT=51820
- PEERS=6
- PEERDNS=10.0.10.1
- INTERNAL_SUBNET=10.13.13.0
volumes:
- /home/fredrik/Servers/wireguard:/config
- /lib/modules:/lib/modules
#ports:
# - 51800:51820/udp # our router does this part, since we're using macvlan
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
- net.ipv4.ip_forward=1
restart: unless-stopped
networks:
wireguard_vlan:
ipv4_address: 10.0.10.16
networks:
wireguard_vlan:
external: true
wireguard_vlan 创建如下:
docker network create -d macvlan --subnet 10.0.10.0/24 --gateway 10.0.10.1 --ip-range 10.0.10.15/32 -o parent=eth0 wireguard_vlan
受到这个视频的启发后,我基本上是想让 wireguard 访问网络:Docker 网络教程//解释所有网络类型!
这是对等配置:
$ cat ~/Desktop/peer1.conf
[Interface]
Address = 10.13.13.2
PrivateKey = <key>
ListenPort = 51820
DNS = 10.0.10.1
[Peer]
PublicKey = <key>
PresharedKey = <key>
Endpoint = someoffice.com:51800
AllowedIPs = 0.0.0.0/0, ::/0
它似乎正在工作,因为我可以 ping 通 wireguard 服务器10.0.10.16从我们的本地网络。我还可以从 wireguard 容器 ping 本地网络上的其他机器。但是,我无法 ping10.0.10.16来自docker主机(但并不重要)。
当我在 Windows 上连接 wireguard 客户端 UI 时,我可以在互联网上 ping 通服务器,但如果我尝试 ping 10.0.10.0/24 网络上的任何内容,我会得到以下信息:
$ ping 10.0.10.1
Pinging 10.0.10.1 with 32 bytes of data:
General failure.
General failure.
General failure.
Ping statistics for 10.0.10.1:
Packets: Sent = 3, Received = 0, Lost = 3 (100% loss),
这是wg0.conf
[Interface]
Address = 10.13.13.1
ListenPort = 51820
PrivateKey = <key>
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth+ -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth+ -j MASQUERADE
[Peer]
# peer1
PublicKey = <key>
PresharedKey = <key>
AllowedIPs = 10.13.13.2/32
在容器中我可以看到以下接口:
root@16328831e502:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.13.13.1/32 scope global wg0
valid_lft forever preferred_lft forever
98: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:22:01:01:0a:10 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.10.16/24 brd 10.0.10.255 scope global eth0
valid_lft forever preferred_lft forever
这eth+在 PostUp 中,我对此感到怀疑,因为接口被称为eth0@if2但我试着说清楚eth0@if2在里面wg0.conf,但这似乎并不重要。
我认为 PostUp 和/或 PostDown 应该做一些允许 VPN 客户端访问的事情,但我不太明白那一行。
所以,总而言之,我似乎找不到一种方法来让外部访问 10.0.10.0/24。任何帮助和/或指示都将不胜感激 :-)
答案1
我似乎终于发现了自己所犯的错误。
这些配置似乎有效:
对等体1.conf
[Interface]
PrivateKey = <key>
ListenPort = 51820
Address = 10.0.10.17/32
DNS = 10.0.10.1
[Peer]
PublicKey = <key>
PresharedKey = <key>
AllowedIPs = 10.0.10.0/24, 10.13.13.0/24
Endpoint = someoffice.com:51800
wg0.conf
[Interface]
Address = 10.13.13.1
ListenPort = 51820
PrivateKey = <key>
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth+ -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth+ -j MASQUERADE
[Peer]
# peer1
PublicKey = <key>
PresharedKey = <key>
AllowedIPs = 10.0.10.17/32
我最初使用的配置全部设置在 10.13.13.0/24 范围内。Wireguard 在服务器端收到数据包后不会更改其 IP。我们的路由器和/或 wireguard 不希望或允许来自 10.13.13.0/24 范围的流量发送到 eth0@if2 适配器。
因此,无论是在服务器端还是在对等端,对等端的 IP 都将设置为 10.0.10.0/24 范围内的 IP。10.13.13.0/24 网络中的流量也将由 wireguard 路由,可能不会导致任何有用的地方。
答案2
偶然发现了这个老问题,因为它现在与我相关。iptables 规则应该在 wg0.conf 中完成这个技巧:
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
所以我的解决方案可能对其他人也有帮助。
我的完整配置(使用 ipvlan 而不是 macvlan)
docker-compose.yml
version: "2.1"
networks:
docker_ext:
external: true
services:
wireguard:
image: lscr.io/linuxserver/wireguard:latest
container_name: wireguard
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Vienna
- SERVERURL=dyn.leidinger.xyz
- SERVERPORT=51820 #optional
- PEERS=<peer_1>,<peer_2>,<peer_x>
- PEERDNS=8.8.8.8 #optional
- ALLOWEDIPS=192.168.0.0/24,192.168.1.0/24 #optional
volumes:
- /opt/wireguard/config:/config
- /lib/modules:/lib/modules
ports:
- 51820:51820/udp
networks:
docker_ext:
ipv4_address: 192.168.1.100
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.proxy_arp=1
restart: unless-stopped
wg0.conf
[Interface]
Address = 10.13.13.1
ListenPort = 51820
PrivateKey = <key>
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
# peer_wienIPhoneLukas
PublicKey = <key>
PresharedKey = <key>
AllowedIPs = 10.13.13.5/32