一、确认 WireGuard
服务器已监听
从 wg show
输出:
interface: wg0
listening port: 51820
表明 WireGuard
服务器正在监听 51820
端口。
二、 检查 iptables
规则
sudo iptables -A INPUT -p udp --dport 51820 -j ACCEPT
sudo iptables -A INPUT -i wg0 -j ACCEPT
sudo iptables -A FORWARD -i wg0 -j ACCEPT
sudo iptables -A FORWARD -o wg0 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
注意: eth0
需要替换为你的实际外网接口,可以用 ip a
命令查看
或者ip -o -4 route show to default | awk '{print $5}'
如果你在 UFW
下管理 iptables
,可以执行:
sudo ufw allow 51820/udp
sudo ufw allow from 192.168.6.0/24
注意: 192.168.6.0
自行配置允许的网段
些命令是 iptables 规则,用于配置 WireGuard 的防火墙和 NAT(网络地址转换)规则,以确保 连接能够正常工作并允许流量转发。
这些命令的作用:
- 允许 WireGuard 端口的 UDP 流量
sudo iptables -A INPUT -p udp --dport 51820 -j ACCEPT
作用:
• -A INPUT:在 INPUT 规则链中添加一条规则,允许数据包进入本机。
• -p udp:指定协议为 UDP。
• --dport 51820:允许目的端口 51820(WireGuard 默认端口)。
• -j ACCEPT:接受符合此规则的流量。
✅ 意义:
• 这条规则允许 WireGuard 客户端通过 51820 端口与服务器建立 VPN 连接。
• 如果你的 WireGuard 配置使用的是非默认端口(例如 51821),需要修改 --dport 51821。
- 允许 wg0 接口的流量
sudo iptables -A INPUT -i wg0 -j ACCEPT
作用:
• -A INPUT:在 INPUT 规则链中添加一条规则。
• -i wg0:匹配来自 wg0(WireGuard 虚拟网络接口)的流量。
• -j ACCEPT:允许这些流量。
✅ 意义:
• 这允许从 wg0 接口进入本机的流量,不被防火墙阻止。
• 如果不加这条规则, WireGuard 客户端的流量可能会被防火墙拦截。
- 允许通过 wg0 接口的流量进行转发
sudo iptables -A FORWARD -i wg0 -j ACCEPT
作用:
• -A FORWARD:在 FORWARD 规则链中添加一条规则(影响数据包的转发行为)。
• -i wg0:匹配进入 wg0 接口的数据包。
• -j ACCEPT:允许这些数据包被转发。
✅ 意义:
• 这允许 WireGuard 客户端的流量可以被转发到服务器的其他网络(例如互联网或局域网)。
• 如果没有这条规则, WireGuard 客户端可能连得上 WireGuard,但无法访问服务器之外的其他设备或互联网。
- 允许通过 wg0 接口的流量进行转发
sudo iptables -A FORWARD -o wg0 -j ACCEPT
作用:
• -A FORWARD:在 FORWARD 规则链中添加一条规则。
• -o wg0:匹配流出 wg0 接口的数据包。
• -j ACCEPT:允许这些数据包被转发。
✅ 意义:
• 这允许服务器把其他网络(如互联网或局域网)的数据包转发回 WireGuard客户端。
• 如果没有这条规则, WireGuard客户端可能能访问服务器,但无法访问互联网或其他设备。
- 配置 NAT 使 WireGuard 客户端能访问互联网
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
作用:
• -t nat:在 nat(网络地址转换)表中添加规则。
• -A POSTROUTING:在 POSTROUTING 规则链中添加规则(作用于即将离开本机的流量)。
• -o eth0:匹配发送到 eth0(物理网卡)的数据包。
• -j MASQUERADE:对这些数据包进行地址伪装,使它们看起来像是从服务器本机发送的。
✅ 意义:
• 这条规则 使 WireGuard客户端可以通过服务器访问互联网。
• 如果没有这条规则, WireGuard 客户端可能连得上 VPN,但无法访问互联网。
• eth0 是服务器的主网卡。如果你的服务器使用的是 ens33、eth1 或其他网卡名称,你需要替换 eth0。
这些 iptables 规则的主要作用是:
- 允许 WireGuard 服务器接收 VPN 连接(UDP 端口 51820)。
- 允许 WireGuard 客户端流量通过 wg0 进入服务器。
- 允许 WireGuard客户端访问服务器之外的网络(局域网或互联网)。
- 启用 NAT(网络地址转换),使 WireGuard 客户端可以通过服务器访问互联网。
持久化 iptables 规则
iptables 规则在系统重启后会丢失。如果你希望规则永久生效,可以执行以下步骤:
方法 1:使用 iptables-save 持久化
保存当前 iptables 规则:
sudo iptables-save > /etc/iptables.rules
在系统启动时自动加载 iptables 规则:编辑 /etc/crontab 或 /etc/rc.local 文件,在最后添加:
iptables-restore < /etc/iptables.rules
方法 2:使用 iptables-persistent(推荐)
安装 iptables-persistent:
sudo apt install iptables-persistent
保存 iptables 规则:
sudo netfilter-persistent save
sudo netfilter-persistent reload
这样,即使服务器重启,WireGuard 的防火墙规则也不会丢失。
确保 iptables 规则已正确应用:
sudo iptables -L -v -n
sudo iptables -t nat -L -v -n
确保 IP 转发已启用
如果 iptables 规则生效但 WireGuard 仍无法访问互联网,可能还需要启用 IP 转发:
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p