这两天外出,希望能随时无缝访问家里内网,试了一下效果确实不错,记录一下,基本上参考了这两篇文章:
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改为域名即可。