wireguard + iptables + dnsmasq实现异地组网, 端口转发, 自定义域名访问

24 阅读7分钟

💰 前言:为什么选择这个方案?

随着远程办公和跨地协作成为常态,我一直在寻找一个稳定、轻量且安全的异地网络互联方案。经过对比多种方案后,我选择了 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

⚠️ 重要提醒:

  1. 需要在云服务器控制台防火墙/安全组中放行对应端口
  2. 全端口转发存在安全风险,建议仅开放必要端口
  3. 可以使用脚本的批量转发功能,支持随机端口、范围端口等

🔗 进阶功能2:内网自定义DNS

记住 10.0.8.10 这种IP太反人类,我们需要好记的域名。

为什么需要自建DNS?

  • my.pc.home10.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]:
点击查看完整脚本源码

❓ 常见问题与解决方案

  1. SSH被频繁扫描怎么办?

    问题:云服务器22端口被爆破,日志满是失败尝试。

    解决:使用脚本的 配置 SSH 仅监听 WG IP 功能,让SSH只监听WG内网IP(如 10.0.8.1:22)。 这样只有连接了WG的客户端才能SSH登录,公网无法访问。

  2. 跨运营商P2P不通? 问题:电信-移动之间直连失败。 解决:这是NAT穿透的硬伤,两种方案:

  • 开启 PersistentKeepalive = 25(已配置)
  • 接受走服务器中继(延迟40-60ms,依然可用)
  1. 客户端连不上? 排查步骤:
  • 检查服务端 wg show 命令是否有客户端握手
  • 确认云服务器防火墙开放了 50814 端口(UDP)
  • 检查客户端配置的Endpoint是否正确
  1. 端口转发不生效? 可能原因: 云服务商安全组未放行 iptables规则未正确添加 目标服务未监听或防火墙阻挡

  2. DNS解析失败? 检查项:

  • 客户端DNS是否配置为 10.0.8.1
  • dnsmasq是否正常运行 systemctl status dnsmasq
  • 域名是否添加到了 /etc/dnsmasq.hosts

📊 性能实测数据

场景延迟带宽体验
同运营商P2P8-15ms打满家用上行远程桌面无感
跨运营商中继40-60ms打满家用上行轻度游戏可玩
文件传输-7MB/s家用宽带基本跑满

📌 我的使用场景:

  • ssh远程公司连公司电脑Docker开发环境, 体验接近本地
  • 远程桌面家里台式机, 午休Mac也可以开一把炉石
  • 搭建文件服务器映射到公网, 朋友零配置使用, 速度跑满宽带上传速度
  • 访问家里Nas看电影, 流畅2k

💬 最后的话

这套方案我已经稳定使用一年多,从最初的简单组网,慢慢加入了端口映射、自定义DNS,最后写成了管理脚本。

它的优势在于:

✅ 轻量:WireGuard内核模块,资源占用极低

✅ 灵活:可按需配置流量路由

✅ 功能完整:组网、映射、DNS一站式解决

如果你在部署中遇到问题,欢迎在评论区留言。 如果觉得有用,可以收藏本文,或分享给有同样需求的朋友。