这两天一直在研究怎么安全高性能的远程挂载,发现基本都在推荐Wireguard+NSF, 所以研究了一下把完整的过程记录下载
博客
注意
- Wireguard有加密但无混淆,特征较为明显,谨慎用于其他用途
- Wireguard使用UDP传输,部分云服务商限制了UDP会导致性能较差
- 由于海外和国内网络互联较差, 使用了一个带优化线路的中转节点来中转国内和海外服务器, 降低连接延迟, 提高传输速度
特性
ListenPort 监听和发送端口的问题
当给Interface配置ListenPort之后,这个端口既承担了监听端口的功能,又承担了对外发送端口的功能,这会导致一些问题
当我给家里的各个设备(经过NAT后由同一个公网IP发送)分配好IP, 并且每台设备ListenPort都相同。然后就出问题了
家里的设备互相能访问,那些配置了IP和端口的Peer也能直连访问,但是中转服务器和那些需要中转的服务器就访问不了了(有时候家里部分设备能访问,但我猜可能是他们提前把端口抢过来了)
然后通过wg show查看中转,发现他们连接到中转服务器的端口就是ListenPort监听的端口,也就是说他们接收和发送都用的同一个UDP端口,这可能会导致端口冲突
因此,要么NAT下设备不配置ListenPort, 要么配置不同的ListenPort
安装
apt install -y wireguard
生成密钥
wg genkey | tee privatekey | wg pubkey > publickey
启动
# 启动
wg-quick up wg0
# 开机启动
systemctl enable wg-quick@wg0
# 查看状态
wg show
开放防火墙(如果没有启用防火墙则跳过)
如果想通过内网IP来访问, 那么需要在防火墙中配置允许这个内网IP段访问
# 通过ufw开放
ufw allow from 10.0.0.0/16 to any comment wg0
测试
ping 10.0.0.1
ping 10.0.0.2
ping 10.0.0.100
ping 10.0.0.3
ping 10.0.0.4
配置文件
/etc/wireguard/wg0.conf
示例服务器
- ABC在公网
- DE在某个NAT下的内网(如家里的设备
- AB互相直连访问
- DE互相直连访问
- AB和DE互相通过C中转访问
| 服务器 | 公网/NAT IP | 内网 WireGuard IP |
|---|---|---|
| A | X.X.X.A | 10.0.0.1 |
| B | X.X.X.B | 10.0.0.2 |
| C | X.X.X.C | 10.0.0.100 |
| D | X.X.X.D | 10.0.0.3 |
| E | X.X.X.E | 10.0.0.4 |
A - 公网服务器
vim /etc/wireguard/wg0.conf
- 直连C, 同时将
10.0.0.0/16网段的请求转发到C - 直连B
- 通过C中转连接DE
[Interface]
PrivateKey = <A>
Address = 10.0.0.1/16
ListenPort = 51820
#############
# center #
#############
[Peer]
PublicKey = <C>
Endpoint = X.X.X.C:51820
AllowedIPs = 10.0.0.0/16
PersistentKeepalive = 15
#############
# direct #
#############
[Peer]
PublicKey = <B>
Endpoint = X.X.X.B:51820
AllowedIPs = 10.0.0.2/32
PersistentKeepalive = 15
B - 公网服务器
vim /etc/wireguard/wg0.conf
- 直连C, 同时将
10.0.0.0/16网段的请求转发到C - 直连A
- 通过C中转连接DE
[Interface]
PrivateKey = <B>
Address = 10.0.0.2/16
ListenPort = 51820
#############
# center #
#############
[Peer]
PublicKey = <C>
Endpoint = X.X.X.C:51820
AllowedIPs = 10.0.0.0/16
PersistentKeepalive = 15
#############
# direct #
#############
[Peer]
PublicKey = <A>
Endpoint = X.X.X.A:51820
AllowedIPs = 10.0.0.1/32
PersistentKeepalive = 15
C - 公网服务器 - 中转节点
vim /etc/wireguard/wg0.conf
- 中转ABDE节点
#############
# center #
#############
# C
[Interface]
PrivateKey = <C>
Address = 10.0.0.100/16
ListenPort = 51820
PostUp = sysctl -w net.ipv4.ip_forward=1; iptables -A FORWARD -i wg0 -j ACCEPT
PostDown = sysctl -w net.ipv4.ip_forward=0; iptables -D FORWARD -i wg0 -j ACCEPT
#############
# direct #
#############
#############
# redir #
#############
# A
[Peer]
PublicKey = <A>
AllowedIPs = 10.0.0.1/32
# B
[Peer]
PublicKey = <B>
AllowedIPs = 10.0.0.2/32
# D
[Peer]
PublicKey = <D>
AllowedIPs = 10.0.0.3/32
# E
[Peer]
PublicKey = <E>
AllowedIPs = 10.0.0.4/32
D - NAT下服务器
vim /etc/wireguard/wg0.conf
- 直连C, 同时将
10.0.0.0/16网段的请求转发到C - 直连E
- 通过C中转连接AB
[Interface]
PrivateKey = <D>
Address = 10.0.0.3/16
ListenPort = 51820
#############
# center #
#############
[Peer]
PublicKey = <C>
Endpoint = X.X.X.C:51820
AllowedIPs = 10.0.0.0/16
PersistentKeepalive = 15
#############
# direct #
#############
[Peer]
PublicKey = <E>
Endpoint = X.X.X.E:51821
AllowedIPs = 10.0.0.4/32
PersistentKeepalive = 15
E - NAT下服务器
vim /etc/wireguard/wg0.conf
- 直连C, 同时将
10.0.0.0/16网段的请求转发到C - 直连D
- 通过C中转连接AB
[Interface]
PrivateKey = <E>
Address = 10.0.0.4/16
ListenPort = 51821
#############
# center #
#############
[Peer]
PublicKey = <C>
Endpoint = X.X.X.C:51820
AllowedIPs = 10.0.0.0/16
PersistentKeepalive = 15
#############
# direct #
#############
[Peer]
PublicKey = <D>
Endpoint = X.X.X.D:51820
AllowedIPs = 10.0.0.3/32
PersistentKeepalive = 15