关于WireGuard的碎碎念

最近的尝试

大概是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访问不了光猫了。因为光猫和路由器所处的子网不一样,而不能直接跨越过去访问。
因此,这时候就需要了路由转发。

Peerens1wg0
A114.51.41.9110.100.100.1
B192.168.23.510.100.100.2
C192.168.24.410.100.100.3

B若想通过A来访问C上的192.168.24.1(路由器)设备,则需要C中相应的开启转发,将来自wg0的流量给转到ens1上面去。
依旧A为服务器。A和C都要做相应的修改.
在Linux设备下,添加net.ipv4.ip_forward=1net.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

推荐去看看这两篇,十分详细,列举了大量例子。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇