💰 前言:为什么选择这个方案?
随着远程办公和跨地协作成为常态,我一直在寻找一个稳定、轻量且安全的异地网络互联方案。经过对比多种方案后,我选择了 WireGuard + iptables + dnsmasq 这套组合,并已稳定运行一年。
我的核心需求包括:
- ✅ 异地组网:公司电脑、家里NAS、手机随时互通
- ✅ 端口映射:把内网服务暴露到公网(像frp一样)
- ✅ 好记的域名:不想再记
10.0.8.xx这种IP
市面上方案很多,但要么重(OpenVPN),要么麻烦(frp+ddns)。
最后用 WireGuard + iptables + dnsmasq 三件套搞定,稳定运行一年,分享给大家。
🎯 本教程可实现:
| 功能 | 说明 | 体验 |
|---|---|---|
| 异地组网 | P2P直连,失败自动中继 | 延迟10-60ms,远程桌面流畅 |
| 端口映射 | iptables转发,无需额外工具 | 可转发全端口,服务器占用<10% |
| 内网DNS | 自定义域名访问内网设备 | my.pc.home 直接访问 |
📌 适合人群:有云服务器、需要远程访问内网服务、喜欢自建解决方案的玩家。
🚀 快速开始
如果你不想看长篇教程,可以直接使用一键脚本:
# 下载脚本
wget https://raw.githubusercontent.com/kira9924/wireguard-setup/refs/heads/main/wg_v2.sh
chmod +x wg.sh
# 交互式菜单
./wg.sh
脚本支持:自动初始化配置、生成客户端、端口转发管理、SSH安全加固等。
点击查看完整脚本源码
⚠️ 注意:脚本会修改SSH配置,建议先通读文档再使用!
📦 基础部署:WireGuard异地组网
1. 安装依赖(Ubuntu)
apt update
apt install -y wireguard iptables lsof
2. 生成密钥对
# 服务端密钥
wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key
# 客户端密钥(示例)
wg genkey | tee /etc/wireguard/client_private.key | wg pubkey > /etc/wireguard/client_public.key
3. 服务端配置(/etc/wireguard/wg0.conf)
[Interface]
PrivateKey = <server_private_key>
Address = 10.0.8.1/24
ListenPort = 50814
DNS = 10.0.8.1
MTU = 1420
PostUp = /etc/wireguard/iptable-up.sh
PostDown = /etc/wireguard/iptable-down.sh
[Peer]
# 客户端1
PublicKey = <client1_public_key>
AllowedIPs = 10.0.8.10/32
PersistentKeepalive = 25
[Peer]
# 客户端2
PublicKey = <client2_public_key>
AllowedIPs = 10.0.8.11/32
PersistentKeepalive = 25
💡 提示:PersistentKeepalive 是P2P连接的关键,保持25秒心跳可穿透大部分NAT。
4. 配置iptables转发脚本
创建 /etc/wireguard/iptable-up.sh 和 /etc/wireguard/iptable-down.sh
# iptable-up
#!/bin/bash
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -N WG-FORWARD-NAT 2>/dev/null
iptables -N WG-FORWARD-FW 2>/dev/null
iptables -t nat -C PREROUTING -j WG-FORWARD-NAT 2>/dev/null || iptables -t nat -A PREROUTING -j WG-FORWARD-NAT
iptables -C FORWARD -j WG-FORWARD-FW 2>/dev/null || iptables -A FORWARD -j WG-FORWARD-FW
iptables -C WG-FORWARD-FW -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 2>/dev/null || iptables -A WG-FORWARD-FW -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wg0 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o wg0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wg0 -o wg0 -j ACCEPT
# iptable-down
#!/bin/bash
sysctl -w net.ipv4.ip_forward=0
iptables -t nat -D PREROUTING -j WG-FORWARD-NAT 2>/dev/null
iptables -D FORWARD -j WG-FORWARD-FW 2>/dev/null
iptables -t nat -F WG-FORWARD-NAT 2>/dev/null
iptables -F WG-FORWARD-FW 2>/dev/null
iptables -t nat -X WG-FORWARD-NAT 2>/dev/null
iptables -X WG-FORWARD-FW 2>/dev/null
iptables -D FORWARD -i wg0 -o eth0 -j ACCEPT 2>/dev/null
iptables -D FORWARD -i eth0 -o wg0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 2>/dev/null
iptables -D FORWARD -i wg0 -o wg0 -j ACCEPT 2>/dev/null
5. 客户端配置
[Interface]
PrivateKey = <client_private_key>
Address = 10.0.8.10/32
MTU = 1420
DNS = 10.0.8.1, 8.8.8.8
[Peer]
PublicKey = <server_public_key>
Endpoint = 你的公网IP:50814
AllowedIPs = 10.0.8.0/24
PersistentKeepalive = 25
6. 启动与测试
# 启动服务端
wg-quick up wg0
# 查看状态
wg show
# 测试连通性(从客户端)
ping 10.0.8.1
🌉 进阶功能1:内网端口映射
既然设备已经组网,就可以通过iptables将内网端口暴露到公网。
- 为什么需要端口映射?
- 将家里的NAS网页界面暴露到公网
- 远程桌面访问公司电脑
- 搭建自己的网站/服务
单端口转发示例
# 将公网8080端口转发到10.0.8.10:8080
iptables -t nat -A WG-FORWARD-NAT -p tcp --dport 8080 -j DNAT --to 10.0.8.10:8080
iptables -t nat -A POSTROUTING -p tcp -d 10.0.8.10 --dport 8080 -j SNAT --to 10.0.8.1
iptables -A WG-FORWARD-FW -p tcp -d 10.0.8.10 --dport 8080 -j ACCEPT
批量端口转发
# 生成规则文件(示例:10000-10010端口)
*nat
-A WG-FORWARD-NAT -p tcp --dport 10000 -j DNAT --to 10.0.8.10:10000
-A POSTROUTING -p tcp -d 10.0.8.10 --dport 10000 -j SNAT --to 10.0.8.1
COMMIT
*filter
-A WG-FORWARD-FW -p tcp -d 10.0.8.10 --dport 10000 -j ACCEPT
COMMIT
# 导入规则
iptables-restore --noflush < rules.txt
⚠️ 重要提醒:
- 需要在云服务器控制台防火墙/安全组中放行对应端口
- 全端口转发存在安全风险,建议仅开放必要端口
- 可以使用脚本的批量转发功能,支持随机端口、范围端口等
🔗 进阶功能2:内网自定义DNS
记住 10.0.8.10 这种IP太反人类,我们需要好记的域名。
为什么需要自建DNS?
my.pc.home比10.0.8.10好记- 设备多了不用记IP表
- 浏览器直接输入域名访问
安装配置dnsmasq
# 停止系统自带的DNS服务
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
# 安装dnsmasq
sudo apt install dnsmasq -y
配置dnsmasq
编辑 /etc/dnsmasq.conf:
# 仅监听WG网络
interface=wg0
listen-address=10.0.8.1
bind-interfaces
# 自定义域名文件
addn-hosts=/etc/dnsmasq.hosts
# 外网DNS兜底
server=8.8.8.8
server=114.114.114.114
# 性能优化
cache-size=1000
no-resolv
no-poll
添加自定义域名
编辑 /etc/dnsmasq.hosts:
10.0.8.10 my.desktop.home
10.0.8.11 my.thinkpad.home
10.0.8.20 my.nas.home
验证DNS解析
# 服务端测试
nslookup my.desktop.home 10.0.8.1
# 客户端测试(需配置DNS为10.0.8.1)
nslookup my.desktop.home
🚀 技巧:你可以用 home 作为顶级域名,完全自己掌控,比如 nas.home、router.home 等。
⚙️ 一键管理脚本(wg.sh)详解
手动操作太繁琐?我写了这个全功能管理脚本。
脚本功能概览
| 功能模块 | 说明 |
|---|---|
| WG管理 | 启动/停止/重启/状态查看 |
| 客户端生成 | 一键生成多个客户端配置 |
| 端口转发 | 单端口、范围端口、随机端口转发 |
| SSH安全 | 限制SSH仅WG网络可访问 |
| 网络配置 | 自定义IP段、子网等 |
使用方法
# 1. 交互式菜单(推荐新手)
./wg.sh
# 2. 命令行快速操作
./wg.sh start # 启动WG
./wg.sh client # 生成客户端配置
./wg.sh forward # 端口转发管理
./wg.sh config-ssh # 加固SSH(仅WG网络可访问)
脚本界面预览
text
==================== WireGuard 全功能管理脚本 ====================
1. 启动 WG
2. 停止 WG
3. 重启 WG
4. 查看 WG/SSH/转发 状态
5. 端口转发管理
6. 生成客户端配置
7. 初始化/重置WireGuard配置
8. 批量添加客户端到服务器
9. 配置 SSH 仅监听 WG IP
10. 恢复 SSH 公网访问
11. 配置网络参数
12. 退出
===============================================================
请选择操作 [1-12]:
点击查看完整脚本源码
❓ 常见问题与解决方案
-
SSH被频繁扫描怎么办?
问题:云服务器22端口被爆破,日志满是失败尝试。
解决:使用脚本的
配置 SSH 仅监听 WG IP功能,让SSH只监听WG内网IP(如 10.0.8.1:22)。 这样只有连接了WG的客户端才能SSH登录,公网无法访问。 -
跨运营商P2P不通? 问题:电信-移动之间直连失败。 解决:这是NAT穿透的硬伤,两种方案:
- 开启 PersistentKeepalive = 25(已配置)
- 接受走服务器中继(延迟40-60ms,依然可用)
- 客户端连不上? 排查步骤:
- 检查服务端 wg show 命令是否有客户端握手
- 确认云服务器防火墙开放了 50814 端口(UDP)
- 检查客户端配置的Endpoint是否正确
-
端口转发不生效? 可能原因: 云服务商安全组未放行 iptables规则未正确添加 目标服务未监听或防火墙阻挡
-
DNS解析失败? 检查项:
- 客户端DNS是否配置为 10.0.8.1
- dnsmasq是否正常运行 systemctl status dnsmasq
- 域名是否添加到了 /etc/dnsmasq.hosts
📊 性能实测数据
| 场景 | 延迟 | 带宽 | 体验 |
|---|---|---|---|
| 同运营商P2P | 8-15ms | 打满家用上行 | 远程桌面无感 |
| 跨运营商中继 | 40-60ms | 打满家用上行 | 轻度游戏可玩 |
| 文件传输 | - | 7MB/s | 家用宽带基本跑满 |
📌 我的使用场景:
- ssh远程公司连公司电脑Docker开发环境, 体验接近本地
- 远程桌面家里台式机, 午休Mac也可以开一把炉石
- 搭建文件服务器映射到公网, 朋友零配置使用, 速度跑满宽带上传速度
- 访问家里Nas看电影, 流畅2k
💬 最后的话
这套方案我已经稳定使用一年多,从最初的简单组网,慢慢加入了端口映射、自定义DNS,最后写成了管理脚本。
它的优势在于:
✅ 轻量:WireGuard内核模块,资源占用极低
✅ 灵活:可按需配置流量路由
✅ 功能完整:组网、映射、DNS一站式解决
如果你在部署中遇到问题,欢迎在评论区留言。 如果觉得有用,可以收藏本文,或分享给有同样需求的朋友。