wireguard vpn
实测 nat内的设备会影响到整体的数据转发,太罗嗦了,还不如n2n好使。
基于公钥私钥来实现,可以理解为 ssh 密钥登陆组成的vpn,好理解。
1. 安装wireguard
新版本5.6以上内核自带了,不用多余考虑
直接install即可
2. 配置服务端
服务端只是有公网而已,配置上需要加一条路由转发。不适合打洞 p2p。
他需要中间节点组流量的转发,所以看中间节点的带宽能力
需要注意的点
- 默认端口51820
- 自定义端口范围
2.1. 生成密钥
公钥私钥都得用。私钥留自己上,公钥是对端的。
genkey 生成私钥
pubkey 生成公钥
umask 007
wg genkey >server.key
cat server.key
root@C20240617226357:~# cat server.key
sGgJgpF5PtnMcjf4P4EDI6NneUtadfgUHj6sUQLFZVQ=
root@C20240617226357:~# wg pubkey <server.key >publicserver
root@C20240617226357:~# cat publicserver
3VZkORC05ApYqSUmzxZ6Wpf+P2LWj/rye3OsyYH+8wg=
2.2. 配置wg-quick
没人用命令行配置,都是用配置文件
root@C20240617226357:~# vim /etc/wireguard/wg0.conf
root@C20240617226357:~# cat /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.1.1/24
ListenPort = 57362
PrivateKey = sGgJgpF5PtnMcjf4P4EDI6NneUtadfgUHj6sUQLFZVQ=
[Peer]
PublicKey = /T6T4soNPXyd4mmp2k22+1CnE/X5DKzFvKc9UT7eb3g=
AllowedIPs = 10.0.1.2/24
ListenPort端口不指定每次都是随机的,所以最好指定一下。开防火墙。
2.3. 放行防火墙
添加udp的放行端口
root@C20240617226357:~# ufw allow 57362/udp
Rule added
Rule added (v6)
3. 配置客户端
ivo@debian:~$ wg genkey >clientcloud
ivo@debian:~$ wg pubkey <clientcloud >publickey
ivo@debian:~$ cat publickey
/T6T4soNPXyd4mmp2k22+1CnE/X5DKzFvKc9UT7eb3g=
ivo@debian:~$ cat clientcloud
cJrv8lK1cim9Q8dj9hDR5uOXXzZNnsJlb/tT4DEaqXU=
3.1. 配置 wg-quick
ivo@debian:~$ sudo vim /etc/wireguard/wg0.conf
ivo@debian:~$ sudo cat /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.1.2/24
ListenPort = 57362
PrivateKey = cJrv8lK1cim9Q8dj9hDR5uOXXzZNnsJlb/tT4DEaqXU=
[Peer]
PublicKey = 3VZkORC05ApYqSUmzxZ6Wpf+P2LWj/rye3OsyYH+8wg=
AllowedIPs = 10.0.1.1/24
Endpoint = 198.222.222.222:57362
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
参数解释
在WireGuard配置文件中,[Peer]
部分用于定义与另一个WireGuard节点的连接参数。下面是对您提供的参数的详细解释:
-
PublicKey: 这是您想要与之建立连接的WireGuard节点的公钥。在这个例子中,
<A的公钥>
表示了您正在从B或C的视角配置,以连接到公网主机A。您需要将<A的公钥>
替换为A的实际公钥字符串。 -
Endpoint: 这是公网主机A的IP地址和端口号,用于内网主机B或C知道如何通过网络找到A。
198.222.222.222:57362
是A的公网IP地址和WireGuard监听的端口(默认是51820,但可以根据需要更改)。这个参数对于内网主机来说是必需的,因为它们需要通过NAT或路由才能访问公网。对于公网主机A来说,通常不需要设置Endpoint
,因为它直接监听在公网上。 -
AllowedIPs: 这个参数定义了从该连接中接受哪些IP地址的流量。在这个例子中,
0.0.0.0/0
表示接受来自任何IP地址的流量。这通常在内网主机上设置,以便它们可以通过WireGuard连接访问整个互联网(当然,这取决于您的网络设置和防火墙规则)。然而,在这个特定的场景中,由于B和C只是希望与A以及彼此之间通信,使用0.0.0.0/0
可能不是最安全的做法。更安全的做法是将AllowedIPs
设置为它们实际需要的网络范围,例如10.0.0.0/24
(如果您的内部网络是这个范围)。但是,请注意,由于B和C需要通过A进行通信,它们仍然需要能够接收来自A的转发流量,这通常意味着A的AllowedIPs
应该包括B和C的IP地址。 -
PersistentKeepalive: 这个参数定义了每隔多少秒发送一个keepalive消息以维持连接。这有助于NAT和防火墙保持连接状态打开,尤其是在连接可能由于长时间没有活动而被关闭的环境中。
25
秒是一个常见的值,但您可以根据网络环境和需求进行调整。
需要注意的是,对于公网主机A来说,它的[Peer]
配置应该不包括Endpoint
,并且其AllowedIPs
应该包括内网主机B和C的IP地址(以及任何其他它希望通过WireGuard网络访问的IP地址)。同时,内网主机B和C的AllowedIPs
设置应该根据它们的具体需求进行调整,以限制不必要的流量。
另外,虽然0.0.0.0/0
在内网主机上可以作为测试使用,但在生产环境中,为了安全起见,应该限制AllowedIPs
的范围。
4. 启动wg-quick
这里有2个命令
wg-quick up wg0 #启动虚拟网卡
wg-quick down wg0 #关闭虚拟网卡
然后也可以用systemd 开机启动
systemctl enable wg-quick@wg0
5. gpt给出的配置,参考用
为了配置WireGuard以实现一个公网主机(A)与两个内网主机(B和C)之间的互通,我们需要遵循以下步骤。这包括在每个主机上生成密钥对、配置WireGuard接口,并确保网络路由正确设置。
5.1. 第一步:生成密钥对
在每个主机(A, B, C)上,你需要安装WireGuard并生成密钥对。这里假设你已经有了WireGuard的二进制文件或者已经通过包管理器安装了它。
# 在所有主机上执行
sudo wg genkey | sudo tee /etc/wireguard/privatekey | sudo chmod 600 /etc/wireguard/privatekey
sudo wg pubkey < /etc/wireguard/privatekey | sudo tee /etc/wireguard/publickey
5.2. 第二步:配置WireGuard接口
5.2.1. 公网主机A的配置
假设公网主机A的公网IP是x.x.x.x
,内部IP分配为10.0.0.1/24
。
# /etc/wireguard/wg0.conf
[Interface]
PrivateKey = <A的私钥>
Address = 10.0.0.1/24
ListenPort = 51820
[Peer]
PublicKey = <B的公钥>
AllowedIPs = 10.0.0.2/32
[Peer]
PublicKey = <C的公钥>
AllowedIPs = 10.0.0.3/32
5.2.2. 内网主机B的配置
假设内网主机B的内部IP为10.0.0.2/24
,并配置为通过NAT或路由连接到公网。
# /etc/wireguard/wg0.conf
[Interface]
PrivateKey = <B的私钥>
Address = 10.0.0.2/24
ListenPort = 51820
[Peer]
PublicKey = <A的公钥>
Endpoint = x.x.x.x:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
5.2.3. 内网主机C的配置
假设内网主机C的内部IP为10.0.0.3/24
,配置类似于B。
# /etc/wireguard/wg0.conf
[Interface]
PrivateKey = <C的私钥>
Address = 10.0.0.3/24
ListenPort = 51820
[Peer]
PublicKey = <A的公钥>
Endpoint = x.x.x.x:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
5.3. 第三步:启动WireGuard并验证连接
在每个主机上,启动WireGuard服务并检查状态。
sudo systemctl start wg-quick@wg0
sudo systemctl enable wg-quick@wg0
sudo wg
5.4. 第四步:确保路由和防火墙设置
确保公网主机A的防火墙允许UDP端口51820的入站和出站流量。对于内网主机B和C,确保NAT或路由设置正确,以便它们可以访问公网。
5.5. 第五步:测试连通性
从每个主机上,使用ping
命令测试到其他主机的连通性。
ping 10.0.0.1 # 从B或C到A
ping 10.0.0.2 # 从A或C到B
ping 10.0.0.3 # 从A或B到C
5.6. 注意事项
- 确保所有主机的防火墙和网络策略允许WireGuard的流量。
- 如果内网主机不能直接访问公网,请确保有适当的NAT设置或VPN服务器(如OpenVPN或SoftEther)在公网主机上运行,并配置内网主机通过该服务器连接到WireGuard。
- 根据实际情况调整
AllowedIPs
,特别是在多子网或复杂网络环境中。