所以,我有一个运行在 Amazon Lightsail 上的 VPS,我在上面安装了 wireguard;我这样设置界面:
[Interface]
Address = 10.255.128.1/24
MTU = 1420
SaveConfig = true
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820
PrivateKey = ********************************************
然后发生了一些非常奇怪的事情:我启动 iface 并运行sudo ip addr
,然后我得到了这个输出
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 8921 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.255.128.1/24 scope global wg0
valid_lft forever preferred_lft forever
奇怪的事情?看着那(这mtu 8921
然后我转到 conf 文件,令我惊讶的是,我为 mtu 设置的值被 8921 覆盖了。
sudo systemctl status [email protected]
给出这个输出:
Nov 18 16:04:08 ip-172-26-0-77 systemd[1]: Starting WireGuard via wg-quick(8) for wg0...
Nov 18 16:04:08 ip-172-26-0-77 wg-quick[583]: [#] ip link add wg0 type wireguard
Nov 18 16:04:09 ip-172-26-0-77 wg-quick[583]: [#] wg setconf wg0 /dev/fd/63
Nov 18 16:04:09 ip-172-26-0-77 wg-quick[583]: [#] ip -4 address add 10.255.128.1/24 dev wg0
Nov 18 16:04:09 ip-172-26-0-77 wg-quick[583]: [#] ip link set mtu 8921 up dev wg0
Nov 18 16:04:09 ip-172-26-0-77 wg-quick[583]: [#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING >
Nov 18 16:04:09 ip-172-26-0-77 systemd[1]: Finished WireGuard via wg-quick(8) for wg0.
这里发生了什么?
SaveConfig = true
当接口关闭(或重新启动)时,指示wg-quick使用接口的当前设置覆盖 WireGuard 接口的配置文件。对于 WireGuard 的许多用途而言,这是不受欢迎的行为,这就是默认情况下不启用它的原因。您想要打开它的最常见原因是,如果您在 WireGuard 启动时频繁更改活动的 WireGuard 接口,并且不想在配置文件中手动复制这些更改。如果您确实使用
SaveConfig = true
,并且想要更改 WireGuard 接口,您通常会通过wg命令(用于 WireGuard 特定设置)或(在 Linux 上)ip命令(用于一般网络接口设置)来完成。例如,要设置名为 的活动 WireGuard 接口的 MTU
wg0
,请1420
运行以下命令(以 root 身份):或者,使用命令关闭 WireGuard 接口
wg-quick down wg0
(或者如果您将其作为 systemd 服务运行),更改 WireGuard 配置文件,然后使用命令(或)systemctl stop wg-quick@wg0
再次启动接口。wg-quick up wg0
systemctl start wg-quick@wg0
如果您没有为 WireGuard 接口显式配置 MTU,wg-quick 足够聪明,可以根据它期望隧道使用的(物理)网络接口的 MTU 为您做出很好的猜测。大多数 EC2 实例的网络接口使用巨型帧(MTU 为 9001)。因此,在这些 EC2 实例上,wg-quick 会猜测 WireGuard 接口应该使用 8921 的 MTU(比 9001 小 80 个字节,以允许每个数据包用 UDP/IP 和 WireGuard 标头包装)。
因此,可能发生的情况是您最初配置了 WireGuard 接口
SaveConfig = true
,但没有配置 MTU。当您使用 wg-quick 启动接口时,它为接口设置了 8921 的 MTU。然后,当接口启动时,您编辑了 WireGuard 配置文件以添加MTU = 1420
. 当您重新启动接口时,您的更改将被接口的现有 MTU 覆盖。