wireguard 教程
实验环境为 debian虚拟机, 两个路由器以及两个不能互相访问的内网(路由器之间可以访问)
主要内容
- 网络拓扑结构
- 安装wireguard
- 生成密钥对
- 交换公钥
- 启动wg0
- 连通测试
网络拓扑结构
实验中的虚拟机都采用debian13, 宿主机是fedora43 workstation, 使用virt-manager
共有4个虚拟机, 两台当作路由器, 两台当作内网的主机, 分别记作 R1, R2, H1, H2
- R1 配置
- 网卡一: 连接宿主机上的模拟公网(192.168.122.0/24), ip=192.168.122.100/24
- 网卡二: 作为内网一(192.168.100.0/24)的网关, ip=192.168.100.1/24
路由配置
user@router1:~$ ip route
default via 192.168.122.1 dev enp1s0 onlink
192.168.100.0/24 dev enp7s0 proto kernel scope link src 192.168.100.1
192.168.122.0/24 dev enp1s0 proto kernel scope link src 192.168.122.100
- R2 配置
- 网卡一: 连接宿主机上的模拟公网(192.168.122.0/24), ip=192.168.122.200/24
- 网卡二: 作为内网二(192.168.200.0/24)的网关, ip=192.168.200.1/24
路由配置
user@router2:~$ ip route
default via 192.168.122.1 dev enp1s0 onlink
192.168.122.0/24 dev enp1s0 proto kernel scope link src 192.168.122.200
192.168.200.0/24 dev enp7s0 proto kernel scope link src 192.168.200.1
- H1 配置
- 网卡一: 位于内网一(192.168.100.0/24), ip=192.168.100.100/24
路由配置
- 网卡一: 位于内网一(192.168.100.0/24), ip=192.168.100.100/24
user@r1-inner1:~$ ip route
default via 192.168.100.1 dev enp1s0 onlink
192.168.100.0/24 dev enp1s0 proto kernel scope link src 192.168.100.100
- H2 配置
- 网卡二: 位于内网二(192.168.200.0/24), ip=192.168.200.100/24
路由配置
- 网卡二: 位于内网二(192.168.200.0/24), ip=192.168.200.100/24
user@r2-inner1:~$ ip route
default via 192.168.200.1 dev enp1s0 onlink
192.168.200.0/24 dev enp1s0 proto kernel scope link src 192.168.200.100
安装wireguard
我们需要在R1 和 R2 上面配置隧道, 使得内网1 和内网2 可以通过这个隧道进行互通
- 安装wireguard(R1 和 R2 上都执行)
sudo apt update && sudo apt install wireguard -y
生成密钥对
wireguard 依赖密钥对进行加密隧道的构建, 所以在 R1 和 R2 上都进行密钥生成的操作
(umask 0077 && wg genkey | sudo tee /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key)
这个时候会输出公钥, 我们下面分别用 R1-pub.key 和 R2-pub.key 表示
私钥需要手动来查看, 使用 sudo cat /etc/wireguard/private.key 查看私钥
sudo cat /etc/wireguard/private.key
下面我们用 R1-pri.key 和 R2-pri.key表示私钥
交换公钥
- 创建配置文件 wg0.conf
sudo vim /etc/wireguard/wg0.conf
- 加入以下的配置 (用具体的公钥和私钥替换Rx-pub.key, Rx-pri.key)
R1 的配置 /etc/wireguard/wg0.conf
[Interface]
PrivateKey = {{R1-pri}} # 替换成具体的私钥
Address = 10.0.0.1/30 # 在组网中R1的ip地址
ListenPort = 51820 # ← 固定监听端口
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT
[Peer]
PublicKey = {{R2-pub}} # 替换成具体的公钥
AllowedIPs = 10.0.0.2/32, 192.168.200.0/24 # 填写R2的ip地址
Endpoint = 192.168.122.200:51820
PersistentKeepalive = 25
R2的配置 /etc/wireguard/wg0.conf
[Interface]
PrivateKey = {{R2-pri}} # 替换成具体的私钥
Address = 10.0.0.2/30 # 这是组网中R2的ip地址
ListenPort = 51820 # ← 固定监听端口
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT
[Peer]
PublicKey = {{R1-pub}} # 替换成具体的公钥
AllowedIPs = 10.0.0.1/32, 192.168.100.0/24 # 填写R1的ip地址
Endpoint = 192.168.122.100:51820 # ← 对应 router1 的固定端口
PersistentKeepalive = 25
-
PostUp: 接口启动后自动执行的命令。此处用于开启内核 IP 转发,并允许 WireGuard 接口转发的流量通过防火墙。
-
PostDown: 服务结束之后自动执行的命令, 这里是关闭wg0的转发
-
PersistentKeepalive = 25: 每25秒发送一个包保UDP
启动wg0
wireguard 官方提供了 wg-quick脚本进行快速启动服务
-
执行这个脚本相当于执行下面的所有命令
- ip link add wg0 type wireguard
- wg setconf wg0 /dev/fd/63
- ip -4 address add 10.0.0.x/30 dev wg0
- ip link set mtu 1420 up dev wg0
- ip -4 route add 192.168.xxx.0/24 dev wg0
- sysctl -w net.ipv4.ip_forward=1
- iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT
-
所以只需要执行下面的这个命令(在两个路由器上面分别执行)
sudo wg-quick up wg0
- 两个都启动之后, 就会开始握手并建立隧道
连通测试
- 在R1上尝试pingH2
ping 192.168.200.100
# 应该可以ping通, 如果前面按照要求操作的话
- 在H1上尝试pingH2
ping 192.168.200.100
如果两个都通了, 就证明隧道开通成功.
为了对比, 也可以关闭隧道之后再尝试一下
- 在R1 或者 R2上执行
sudo wg-quick down wg0
然后再次进行测试, 应该是ping不通的
开机自启动
- 在路由器上面执行
sudo systemctl enable wg-quick@wg0