用 Wireguard 随时随地”回家”

这两天外出,希望能随时无缝访问家里内网,试了一下效果确实不错,记录一下,基本上参考了这两篇文章:

https://fedoramagazine.org/configure-wireguard-vpns-with-networkmanager/

https://www.wireguard.com/#conceptual-overview

我的家里的局域网设置如下:

主路由器内网IP:192.168.0.1/24

一个Raspberry Pi(Peer A)专门作Wireguard的Gateway,内网 IP:192.168.0.4/24,有IPv6外网地址。

准备连接的笔记本电脑(Peer B),连接在外网上。

首先确保Peer A和Peer B都安装了wireguard-tools,此时应有/etc/wireguard这个文件夹,权限700。

然后通过如下方法在Peer A和Peer B上生成各自的Private Key和Public Key:

cd /etc/wireguard; wg genkey | tee privatekey | wg pubkey > publickey

先在Peer A上创建/etc/wireguard/wg0.conf。已有的内网子网是192.168.0.0/24,于是新划192.168.16.0/24作为Wireguard内部网络网段。监听端口这里设置为10000,可以更改。同时由于联通4G网络的最大MTU是1400,Wireguard自己的是1420,于是用1400减去80得到MTU 1320。这个MTU可以应该可以兼容国内的大部分移动网络,wg0.conf内容如下:

[Interface]
Address = 192.168.16.1/24
SaveConfig = true
ListenPort = 10000
PrivateKey = <Peer A's Private Key>
MTU = 1320

[Peer]
PublicKey = <Peer B's Public Key>
AllowedIPs = 192.168.16.2/24

然后通过Network Manager创建端口,允许转发路由包,并且使用FirewallD配置规则:

# 创建wg0
nmcli con import type wireguard file /etc/wireguard/wg0.conf

# 允许转发
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/99-ip-forward.conf
sysctl --system

# 创建监听Wireguard端口防火墙规则
firewall-cmd --permanent --add-port 10000/udp

# 创建允许转发路由的防火墙规则
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -d 192.168.16.0/24 -o wg0 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i wg0 -j ACCEPT

# 重新读取规则
firewall-cmd --reload

这里需要在路由器上加一条规则,以便内网到Wireguard网段的包可以正确路由:

ip route add 192.168.16.0/24 via 192.168.0.4 

然后就只只需要在Peer B上配置了,同上,创建/etc/wireguard/wg0.conf。这里AllowedIPs加入内网网段,允许通过Wireguard路由到内网。

[Interface]
Address = 192.168.16.2/24
SaveConfig = true
PrivateKey = <Peer B's Private Key>
MTU = 1320

[Peer]
PublicKey = <Peer A's Public Key>
AllowedIPs = 192.168.0.0/24, 192.168.16.0/24
Endpoint = <Peer A's address>:60000

之后建立wg0:

nmcli con import type wireguard file /etc/wireguard/wg0.conf

这样就应该可以ping通了。可以通过wg命令查看接口状态,还可以给Peer A配上DDNS,即时更新IPv6地址,将Endpoint改为域名即可。

Leave a Reply

Your email address will not be published. Required fields are marked *