Wireguard 内网穿透 2025-04-30 程序之旅,记录 暂无评论 36 次阅读 ## Wireguard 内网穿透 > 最近电信宽带需要续费,原来开通的动态IPv4被收回,导致服务集体掉线。打电话向电信投诉,对方称现在没有动态IP了,需要办理专线。实在没办法,只能重新折腾来恢复网络基础服务,折腾了好几天终于弄好了。 ### Wireguard 搭建 原本想直接使用 N2N,但调研了一下,发现 Wireguard 更加稳定和简单搭建,依据怎么简单怎么来的原则,直接选了 Wireguard 作为最佳方案。 WireGuard 是一种现代、高效且安全的 VPN 协议,配置简单且性能优异。以下是搭建 WireGuard 的详细步骤,涵盖服务端和客户端的配置。 --- ### **1. 安装 WireGuard** #### **Linux 系统(服务端/客户端)** ```bash # Ubuntu/Debian sudo apt update && sudo apt install wireguard resolvconf -y # CentOS/RHEL sudo yum install epel-release -y sudo yum install wireguard-tools -y # Arch Linux sudo pacman -S wireguard-tools ``` #### **Windows/macOS 客户端** - 从官网下载 GUI 客户端:[WireGuard 下载页](https://www.wireguard.com/install/) --- ### **2. 生成密钥对** 在服务端和客户端分别生成公私钥: ```bash cd /etc/wireguard # 生成私钥 wg genkey | tee privatekey | wg pubkey > publickey # 查看密钥 cat privatekey # 保密! cat publickey # 可共享 ``` --- ### **3. 服务端配置** #### **配置文件路径** ```bash sudo vim /etc/wireguard/wg0.conf ``` #### **示例配置** ```ini [Interface] Address = 10.0.0.1/24 # 服务端虚拟IP ListenPort = 51820 # 监听端口 PrivateKey = <服务端私钥> # 替换为你的私钥 PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE MTU = 1280 # 客户端配置(每个客户端一个 [Peer] 段) [Peer] PublicKey = <客户端公钥> # 替换为客户端公钥 AllowedIPs = 10.0.0.2/32 # 客户端虚拟IP ``` #### **启用 IP 转发** ```bash echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf sudo sysctl -p ``` #### **启动 WireGuard** ```bash sudo systemctl enable --now wg-quick@wg0 sudo wg-quick up wg0 # sudo wg-quick down wg0 关闭 sudo wg show # 查看状态 ``` --- ### **4. 客户端配置** #### **Linux 客户端** 创建配置文件(如 `/etc/wireguard/wg0.conf`): ```ini [Interface] PrivateKey = <客户端私钥> # 替换为你的私钥 Address = 10.0.0.2/24 # 客户端虚拟IP DNS = 8.8.8.8 # 可选DNS MTU = 1280 [Peer] PublicKey = <服务端公钥> # 替换为服务端公钥 Endpoint = <服务端公网IP>:51820 # 服务端地址 AllowedIPs = 10.0.0.0/24 # 路由所有流量0.0.0.0/0(或指定子网如 10.0.0.0/24) PersistentKeepalive = 25 # 保持连接 ``` 启动客户端: ```bash sudo wg-quick up wg0 sudo wg show # 查看状态 ``` --- ### **5. 防火墙规则(可选)** 如果服务端启用防火墙(如 `ufw`),需放行端口: ```bash sudo ufw allow 51820/udp sudo ufw enable ``` --- ### **6. 测试连接** - **服务端**:`ping 10.0.0.2`(客户端IP) - **客户端**:`ping 10.0.0.1`(服务端IP) - 使用 iperf3 测试端到端的sudo --- ### **常见问题** 1. **无法连接**: - 检查服务端公网 IP 和端口是否暴露。 - 确认防火墙/安全组放行 UDP 51820。 2. **流量未路由**: - 确保 `AllowedIPs` 包含正确子网。 - 服务端启用 IP 转发(`net.ipv4.ip_forward=1`)。 3. **速度不稳定** - Wireguard 端到端使用的是 UDP,且可能会被 Qos,所以建议套一层 TCP,我这里使用的是 udp2raw 4. **网络传输速度慢** - 根据 udp2raw 修改配置,加到socket和减少校验 - /home/mufeng/udp2raw/udp2raw_amd64 -c -l127.0.0.1:2820 -r<服务端公网IP>:16384 -k "<密码>" --raw-mode faketcp --cipher-mode aes128cbc -a --sock-buf 10240 --fix-gro --seq-mode 0 >/dev/null 2>&1 & --- ## FQA ### iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 的作用 在 WireGuard 的 `PostUp` 配置中,以下两条 `iptables` 规则的作用是启用 **流量转发(NAT)**,使得客户端可以通过 VPN 服务器访问外部网络(如互联网): ```bash iptables -A FORWARD -i %i -j ACCEPT iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE ``` ### **逐条解释** #### **1. `iptables -A FORWARD -i %i -j ACCEPT`** - **作用**:允许通过 VPN 接口(`%i` 会被替换为 `wg0` 等 WireGuard 接口名)转发的流量。 - **详细说明**: - `-A FORWARD`:在 `FORWARD` 链(负责转发流量)中添加规则。 - `-i %i`:匹配从 WireGuard 接口(如 `wg0`)进入的流量。 - `-j ACCEPT`:允许这些流量通过。 - **为什么需要**: - 默认情况下,Linux 可能禁止转发流量(`net.ipv4.ip_forward=1` 只是允许内核转发,但防火墙仍需放行)。 - 这条规则确保 VPN 客户端的流量能被转发到其他网络(如互联网)。 #### **2. `iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE`** - **作用**:对从 `eth0`(服务器公网网卡)出去的流量进行 **源地址伪装(SNAT)**,使返回的流量能正确路由到 VPN 客户端。 - **详细说明**: - `-t nat`:操作 `nat` 表(用于网络地址转换)。 - `-A POSTROUTING`:在 `POSTROUTING` 链(数据包发出前的最后处理阶段)添加规则。 - `-o eth0`:匹配从 `eth0`(服务器公网接口)出去的流量。 - `-j MASQUERADE`:将流量的源 IP 替换为 `eth0` 的 IP(实现 SNAT)。 - **为什么需要**: - 当 VPN 客户端(如 `10.0.0.2`)访问互联网时,外部服务器看到的是服务器公网 IP(而非客户端 IP)。 - 返回的流量会被自动路由到服务器,再由服务器转发给客户端。 - 类似家用路由器 NAT 的功能。 --- ### **整体流程(以客户端访问互联网为例)** 1. 客户端发送请求(如 `curl example.com`),数据包通过 WireGuard 隧道到达服务器。 2. 服务器收到数据包后: - **FORWARD 规则**:允许从 `wg0` 转发的流量继续处理。 - **POSTROUTING 规则**:将数据包源 IP 从 `10.0.0.2` 替换为服务器的公网 IP(如 `203.0.113.1`)。 3. 数据包从 `eth0` 发出,到达目标服务器(如 `example.com`)。 4. 返回的流量发送到服务器的公网 IP,服务器根据 NAT 表将其转发给客户端。 --- ### **注意事项** 1. **接口名称**: - `eth0` 需替换为服务器的实际公网网卡名(可能是 `ens3`、`enp0s3` 等,通过 `ip a` 查看)。 2. **IPv6 支持**: - 如需支持 IPv6,需额外添加 `ip6tables` 规则。 3. **持久化规则**: - 如果重启后规则丢失,需保存 iptables 规则(如 `iptables-save > /etc/iptables.rules`)。 --- ### **简化理解** - **FORWARD 规则**:开门允许 VPN 流量进入转发流程。 - **MASQUERADE 规则**:给流量“易容”,让它出去时看起来像是服务器自己发的。 这两条规则共同实现了 VPN 客户端的 **网络共享(NAT)** 功能。 打赏: 微信, 支付宝 标签: none 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。