最近的尝试
大概是21年的上半年,使用单V6的VPS时候,便尝试了添加WARP来获得V4的访问能力,那时便接触到了WireGuard。只可惜没有更深入的去了解些。最近折腾了一两天,有些零零碎碎的地方想说。
以后若发现了更多,还会补充。
关于转发
网上的大多数教程文档里,会要求你开启IP转发。不过,某些用途下,应该是不需要的。只是为了访问A主机上的一些服务,我认为是没必要开启转发服务的。
假定主机A上的wg0.conf为
[Interface]
Address = 10.100.100.1/24
ListenPort = 1145
PrivateKey =
[Peer]
PublicKey =
PresharedKey =
AllowedIPs = 10.100.100.2/32
[Peer]
PublicKey =
PresharedKey =
AllowedIPs = 10.100.100.3/32
[Peer]
PublicKey =
PresharedKey =
AllowedIPs = 10.100.100.4/32
创建了个为wg0的网卡,包括了10.100.100.1/24
对于Peer B,Peer C Peer D,只是和Peer A上面那两个IP进行通讯。
Linux上多数服务所监听的范围是0.0.0.0/0和::/0,这也把wg0的网卡也包含在内了。
所以我想,如果只是为了安全,私人访问主机A上的某些服务,转发可不用开。(当然开了也不会影响性能
关于家庭网络
若我想访问某个Peer的子网中的其他设备,便涉及到了跨网段访问。在把光猫改桥接用路由拨号后,我们或许会遇到,通过192.168.1.1访问不了光猫了。因为光猫和路由器所处的子网不一样,而不能直接跨越过去访问。
因此,这时候就需要了路由转发。
Peer | ens1 | wg0 |
---|---|---|
A | 114.51.41.91 | 10.100.100.1 |
B | 192.168.23.5 | 10.100.100.2 |
C | 192.168.24.4 | 10.100.100.3 |
B若想通过A来访问C上的192.168.24.1(路由器)设备,则需要C中相应的开启转发,将来自wg0的流量给转到ens1上面去。
依旧A为服务器。A和C都要做相应的修改.
在Linux设备下,添加net.ipv4.ip_forward=1
和net.ipv6.conf.all.forwarding=1
于/etc/sysctl.d/99-sysctl.conf之中。
然后在wg配置中,于[Interface]
之中增加
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens1 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens1 -j MASQUERADE
ens1为对应的网卡名称,注意修改。
完成后大概为
[Interface]
PrivateKey =
Address =
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens1 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens1 -j MASQUERADE
以及在A中,需要在C的Peer上的AllowedIPs中增加192.168.24.0/24
全部完成后,A的配置为
[Interface]
Address = 10.100.100.1/24
ListenPort = 1145
PrivateKey =
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens1 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens1 -j MASQUERADE
[Peer]
PublicKey =
PresharedKey =
AllowedIPs = 10.100.100.2/32
[Peer]
PublicKey =
PresharedKey =
AllowedIPs = 10.100.100.3/32, 192.168.24.0/24
B的配置为
[Interface]
Address = 10.100.100.3/24
PrivateKey =
DNS =
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens1 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens1 -j MASQUERADE
[Peer]
PublicKey =
PresharedKey =
AllowedIPs = 10.100.100.0/24
Endpoint = 114.51.41.91:1145
不出意外的话,此时B便可通过A来访问C背后的的192.168.24.1了.
个人较为喜欢的配置
差不多就是关于家庭网络中相关的
Peer A:
[Interface]
Address = 10.10.10.1/24, fd00:1145:1411:111::1/64
ListenPort = 1145
PrivateKey = PeerA的私钥
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens1 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o ens1 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens1 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o ens1 -j MASQUERADE
#Peer B
[Peer]
PublicKey = PeerB的公钥
PresharedKey = peer_A-peer_B预共享密钥
AllowedIPs = 10.10.10.2/32, fd00:1145:1411:111::2/128
#Peer C
[Peer]
PublicKey = PeerC的公钥
PresharedKey = peer_A-peer_C预共享密钥
AllowedIPs = 10.10.10.3/32, fd00:1145:1411:111::3/128
#Peer D
[Peer]
PublicKey = PeerD的公钥
PresharedKey = peer_A-peer_D预共享密钥
AllowedIPs = 10.10.10.4/32, fd00:1145:1411:111::4/128, 192.168.24.0/24
生成Peer A的私钥和公钥:
wg genkey | (umask 0077 && tee peer_A.key) | wg pubkey > peer_A.pub
拆分解释:wg genkey
生成密钥,由|
符号将信息传输至后面的命令所作用的对象,umask 0077
为创建文件前所预设的权限掩码,所生成的peer_A.key权限为600,仅允许创建者访问修改。&&
意为当前面的命令执行成功后,才会执行下一条。tee peer_A.key
将前面wg genkey
所获得的信息写入名为peer_A.key
的文件中。并通过|
符号将信息传入下一条命令中,wg pubkey
根据所获得的密钥信息来生成公钥,通过>
写入peer_A.pub
文件中去。
生成预共享密钥:
(umask 0077; wg genpsk > peer_A-peer_B.psk)
(umask 0077; wg genpsk > peer_A-peer_C.psk)
(umask 0077; wg genpsk > peer_A-peer_D.psk)
小括号()
的作用为,将括号内的命令放在一个新的Shell中运行,因此,通过umask
所修改的权限掩码并不会影响当前的Shell。;
为多个命令顺序执行。
在[Peer]
上,填入相应的Peer所生成的公钥和对应的预共享密钥。
Peer B/C
Peer B和Peer C的配置差不多,并无特殊地方:
[Interface]
PrivateKey = PeerB/C的私钥
Address = 10.10.10.2/32, fd00:1145:1411:111::2/128 #B和C于PeerA设备中设定的对应地址,此处为Peer B的地址。
DNS =
[Peer]
PublicKey = PeerA的公钥
PresharedKey = peer_A-peer_B的预共享密钥
AllowedIPs = 10.10.10.0/24, fd00:1145:1411:111::/64, 192.168.24.0/24 #意为发送和接受数据时候,允许哪些IP通过,相当于代理了哪些IP吧。当添加了192.168.24.0/24,则可以访问PeerD子网中的其他设备。
Endpoint = 114.51.41.91:1145 #Peer A的公网IP和端口
Peer D
对于Peer D,因为要能访问到与Peer D处于同一子网下的设备,则需要打开转发。
具体详见于关于家庭网络中相关的。
[Interface]
PrivateKey = PeerD的私钥
Address = 10.10.10.4/32, fd00:1145:1411:111::4/128
DNS =
[Peer]
PublicKey = PeerA的公钥
PresharedKey = peer_A-peer_B的预共享密钥
AllowedIPs = 10.10.10.0/24, fd00:1145:1411:111::/64 #意为发送和接受数据时候,允许哪些IP通过,相当于代理了哪些IP吧。这里千万不能代理192.168.24.0/24。
Endpoint = 114.51.41.91:1145 #Peer A的公网IP和端口
详细解释
[Interface]
定义本地节点的VPN设置Address
定义本地的节点路由流量范围。根据此来决定是加入VPN子网还是多个节点之间的中继服务器。
例如Address = 10.10.10.1/24
此时作为一个公共的中继服务器,可以将流量中继到其他节点上面去Address = 10.10.10.2/32
此时仅仅只为自己路由流量ListenPort
当节点作为公共的中继服务器时候,根据此来侦听来自公共互联网的VPN传入连接。不作为中继的节点不应该设置此值
例如ListenPort = 51820
则侦听来自51820端口上的连接PrivateKey
这是本地节点的私钥,并不与其他节点共享。所有节点必须要拥有一个私钥。DNS
节点使用此进行DNS请求。可以设置单个DNS服务器,也可以设置多个。DNS = 1.1.1.1,8.8.8.8
MTU
定义连接到节点时候使用的最大传输单元大小。通常不用设置。PostUp
在启动后所运行的命令。PostDown
在关闭之前所运行的命令。
[Peer]
为能够为一个或多个地址路由流量的远程节点定义设置。Endpoint
远程节点的公开访问地址。
例如Endpoint = 123.123.123.123:51820
Endpoint = [2612:1324::1234:1234]:51820
AllowedIPs
定义了路由流量的范围。PublicKey
远程节点的公钥,公钥可以与任何人共享。所有节点必须要有一个公钥。PersistentKeepalive
如果连接是从NAT到公共节点,则位于NAT后面的节点需要定期发送Ping来保活。PersistentKeepalive = 10
每隔10秒发送一次ping。
尾言
这只是本人短期内粗略的了解,漏洞也许一大堆。但还是希望对想了解wireguard的人有些许帮助就好。
参考
https://github.com/pirate/wireguard-docs
https://wiki.archlinux.org/title/WireGuard
推荐去看看这两篇,十分详细,列举了大量例子。