linux服务器/wireguard
docker pull linuxserver/wireguard
本自述文件已从此处找到的完整版本截断
WireGuard®是一种极其简单但快速且现代化的 VPN,采用最先进的加密技术。它的目标是比 IPsec 更快、更简单、更精简、更有用,同时避免令人头疼的问题。它的性能远高于 OpenVPN。WireGuard 被设计为通用 VPN,可在嵌入式接口和超级计算机上运行,适合许多不同的情况。它最初针对 Linux 内核发布,现在已跨平台(Windows、macOS、BSD、iOS、Android)且可广泛部署。它目前正在大力开发中,但它可能已被视为业内最安全、最易于使用且最简单的 VPN 解决方案。
应用程序设置
在容器启动过程中,它会首先检查wireguard模块是否已经安装并加载。5.6 之后的内核通常内置有wireguard 模块(以及一些较旧的自定义内核)。但是,该模块可能无法启用。确保在启动容器之前启用它。
如果内核不是内置的,或者安装在主机上,容器将检查内核头是否存在(在/usr/src),如果不存在,它将尝试从ubuntu xenial/bionic,debian/raspbian buster存储库下载必要的内核头;然后将尝试编译并安装内核模块。usr/src如果在提到的存储库中找不到内核头,容器将无限期地休眠,因为无法安装wireguard。
如果您位于基于 debian/ubuntu 的主机上,并且具有自定义或下游发行版提供的内核(即 Pop!_OS),则容器将无法从常规 ubuntu 和 debian 存储库安装内核标头。在这些情况下,您可以尝试通过(如果是发行版本)在主机上安装标头sudo apt install linux-headers-$(uname -r),然后添加卷映射/usr/src:/usr/src,或者如果是自定义构建,则映射现有标头的位置以允许容器使用主机安装的标头来构建内核模块(在 Pop!_OS 上测试成功,ymmv)。
对于 arm32/64 设备,运行官方 ubuntu 映像或 Raspbian Buster 的 Raspberry Pi 2-4 均受开箱即用支持。对于所有其他设备和操作系统,您可以尝试在主机上安装内核头文件,然后进行映射/usr/src:/usr/src,它可能会起作用(不保证)。
根据使用的参数,它可以作为服务器或客户端运行。
服务器模式
如果环境变量PEERS设置为以逗号分隔的数字或字符串列表,则容器将以服务器模式运行,并将生成必要的服务器和对等/客户端配置。LOG_CONFS如果设置为 ,则对等/客户端配置二维码将输出在 docker 日志中true。/config/peerX如果PEERS是变量和整数,或者/config/peer_X提供了名称列表而不是整数,它们还将以文本和 png 格式保存。
变量SERVERURL、SERVERPORT、INTERNAL_SUBNET、PEERDNS、INTERFACE和是用于服务器模式的可选变量ALLOWEDIPS。PERSISTENTKEEPALIVE_PEERS对这些环境变量的任何更改都将触发服务器和对等配置的重新生成。将使用现有的私钥/公钥重新创建对等/客户端配置。删除要重新创建的密钥的对等文件夹以及配置。
要稍后添加更多对等点/客户端,您可以增加PEERS环境变量或向列表添加更多元素并重新创建容器。
要再次显示活动对等点的 QR 代码,您可以使用以下命令并将对等点编号作为参数列出:docker exec -it wireguard /app/show-peer 1 4 5或docker exec -it wireguard /app/show-peer myPC myPhone myTablet(请记住,QR 代码也以 PNG 形式存储在 config 文件夹中)。
用于服务器和对等配置的模板保存在/config/templates. /config/wg0.conf高级用户可以修改这些模板并通过删除并重新启动容器来强制生成conf 。
客户端模式
不要设置PEERS环境变量。将您的客户端配置放入 config 文件夹中/config/wg0.conf并启动容器。
如果您在日志中收到与 IPv6 相关的错误并且无法建立连接,请编辑对AllowedIPs等/客户端 wg0.conf 中的行以仅包含0.0.0.0/0而不包含::/0; 并重新启动容器。
路上的勇士,漫游又回家
如果您计划在远程和本地(例如在手机上)使用 Wireguard,则需要考虑路由。大多数防火墙不会将 WAN 接口上转发的端口正确路由到开箱即用的 LAN。这意味着当您回家时,即使您可以看到 Wireguard 服务器,返回的数据包也可能会丢失。
这不是 Wireguard 特定的问题,两个普遍接受的解决方案是 NAT 反射(以正确转换内部数据包的方式设置边缘路由器/防火墙)或水平分割 DNS(将内部 DNS 设置为返回专用 DNS,而不是返回专用 DNS)。本地连接时的公共 IP)。
这两种方法都有优点和缺点,但它们的设置超出了本文档的范围,因为每个人的网络布局和设备都会不同。
维护对附加服务的本地访问
** 注意:这不是 Linuxserver.io 支持的配置 - 使用时需要您自担风险。
当使用 docker 中的选项通过 Wireguard 从另一个容器进行路由时service,您可能会失去对本地容器 WebUI 的访问权限。wg0.conf为了避免这种情况,请通过像这样的修改(根据需要修改子网)来排除通过 Wireguard 路由的 docker 子网:
[Interface]
PrivateKey = <private key>
Address = 9.8.7.6/32
DNS = 8.8.8.8
PostUp = DROUTE=$(ip route | grep default | awk '{print $3}'); HOMENET=192.168.0.0/16; HOMENET2=10.0.0.0/8; HOMENET3=172.16.0.0/12; ip route add $HOMENET3 via $DROUTE;ip route add $HOMENET2 via $DROUTE; ip route add $HOMENET via $DROUTE;iptables -I OUTPUT -d $HOMENET -j ACCEPT;iptables -A OUTPUT -d $HOMENET2 -j ACCEPT; iptables -A OUTPUT -d $HOMENET3 -j ACCEPT; iptables -A OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PreDown = HOMENET=192.168.0.0/16; HOMENET2=10.0.0.0/8; HOMENET3=172.16.0.0/12; ip route del $HOMENET3 via $DROUTE;ip route del $HOMENET2 via $DROUTE; ip route del $HOMENET via $DROUTE; iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT; iptables -D OUTPUT -d $HOMENET -j ACCEPT; iptables -D OUTPUT -d $HOMENET2 -j ACCEPT; iptables -D OUTPUT -d $HOMENET3 -j ACCEPT
站点到站点 VPN
** 注意:这不是 Linuxserver.io 支持的配置 - 使用时需要您自担风险。
AllowedIPs服务器模式下的站点到站点 VPN 需要为wg0.conf. 由于wg0.conf是在服务器变量更改时自动生成的,因此不建议手动编辑它。
为了自定义AllowedIPs中特定对等点的语句wg0.conf,您可以将环境变量设置SERVER_ALLOWEDIPS_PEER_<peer name or number>为您想要添加的其他子网,以逗号分隔并排除对等 IP(即 )"192.168.1.0/24,192.168.2.0/24"。替换<peer name or number>为对等方的名称或编号(以 var 中使用的为准PEERS)。
例如,将生成名为 的对等点的SERVER_ALLOWEDIPS_PEER_laptop="192.168.1.0/24,192.168.2.0/24"wg0.conf 条目。AllowedIPs = 10.13.13.2,192.168.1.0/24,192.168.2.0/24laptop
请记住,只有重新生成conf时才会考虑此变量。为现有对等点添加此变量不会强制重新生成。如有必要,您可以删除 wg0.conf 并重新启动容器以强制重新生成。
不要忘记在客户端的对等配置中设置必要的 POSTUP 和 POSTDOWN 规则以进行 LAN 访问。
用法
docker run -d \
--name=wireguard \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Etc/UTC \
-e SERVERURL=wireguard.domain.com `#optional` \
-e SERVERPORT=51820 `#optional` \
-e PEERS=1 `#optional` \
-e PEERDNS=auto `#optional` \
-e INTERNAL_SUBNET=10.13.13.0 `#optional` \
-e ALLOWEDIPS=0.0.0.0/0 `#optional` \
-e PERSISTENTKEEPALIVE_PEERS= `#optional` \
-e LOG_CONFS=true `#optional` \
-p 51820:51820/udp \
-v /path/to/appdata/config:/config \
-v /lib/modules:/lib/modules `#optional` \
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
--restart unless-stopped \
linuxserver/wireguard
评论区