隧道与穿透:配置受限隧道与访问路径 · WireGuard 两端配置至完整项目说明与依赖声明
本篇以隧道两端配置为例;前置是监听端、控制通道、目标服务与回程。源码与输入与下文配置共用同一份文件,示例未执行。
WireGuard 两端配置
隧道 WireGuard 两端配置将 A/B 主机的隧道地址与各自密钥对应起来,AllowedIPs 仅允许对方的 /32 主机前缀,既用于选对端,也约束接收的内层源地址。这里交付完整两端文件,示例未执行;合法密钥、可达外层端点和路由不冲突是读者前置。配置仅供 Linux wg-quick,不能把 Address 当作裸 wg 参数。
ini
# Linux wg-quick teaching configuration. Replace all key placeholders privately.
[Interface]
Address = 10.77.0.1/32
ListenPort = 51820
PrivateKey = REPLACE_WITH_A_PRIVATE_KEY
[Peer]
PublicKey = REPLACE_WITH_B_PUBLIC_KEY
AllowedIPs = 10.77.0.2/32ini
# Linux wg-quick teaching configuration. Replace documentation endpoint and keys.
[Interface]
Address = 10.77.0.2/32
PrivateKey = REPLACE_WITH_B_PRIVATE_KEY
[Peer]
PublicKey = REPLACE_WITH_A_PUBLIC_KEY
AllowedIPs = 10.77.0.1/32
Endpoint = 192.0.2.10:51820
PersistentKeepalive = 25前置、密钥交换、自跑、正常/失败预期和接口撤销步骤见完整项目说明引用的同源 README。只互访两个主机地址,不代表全网流量进入VPN;不能用握手记录代替内层路由和服务权限证据。
完整项目说明与依赖声明
以下同源文件完整列出读者前置、自跑命令、正常/失败预期和清理;正文只供阅读,示例未执行。
text
# Python >=3.11; standard library only; no third-party dependencies.完整 README(与项目文件一致)
markdown
# tunnels 离线证据推演
示例未执行。前半的 lab.py 只核对监听地址、目标地址及回程声明;后半分别列出 FRP、SSH 本地转发和 WireGuard 的独立例子。先画清入口、转发终点与双方主机,不把离线接受判定当成隧道已建立。
## 文件与前置
离线部分只需 Python 3.11 以上和标准库,无网络服务或管理员权限。从 [case.json](case.json) 对照 listener/approved_listener、destination/approved_destination 和 return_route,再阅读 [lab.py](lab.py) 的拒绝顺序。实际产品的版本、端口、双端地址与密钥前置分别列在对应配置节,不是 Python 依赖;macOS 未做原生运行验收。
## 读者自跑
先复制全部文件到自己的隔离练习目录并进入该目录。以下仅是读者步骤,本轮未执行。
Windows PowerShell:
```powershell
python .\lab.py .\case.json
```
Linux Bash(macOS若已有Python3也使用此形式):
```bash
python3 ./lab.py ./case.json
```
预期标准输出如下,进程退出0;明确拒绝是正常决策而不是输入错误。
```text
loopback: BOUNDARY_PLAN_ACCEPTED
wildcard: DENY_LISTENER_SCOPE
missing-return: CHECK_RETURN_ROUTE
```
## 失败路径
把case.json复制为broken.json,再人工删除第一条记录的name字段。使用同一命令把参数换成broken.json,预期标准错误invalid input、退出2,不发布部分判定。破损JSON、非法字段类型、未知字段、空列表或不存在的文件同样退出2。不打印异常原文,防止输入内容意外进入日志。程序严格匹配固定教学字段,不接受任意扩展。
## 恢复与清理
从原仓库重新复制case.json恢复,或撤销练习副本编辑。程序没有写文件、创建用户或启动连接,无需服务清理;只删除自己复制的目录和broken.json,不删除仓库原文件。
## 解释边界
程序精确比较批准的监听及目标IP,不实现端口转发、VPN或CIDR策略。return_route只是输入声明,不能证明系统路由真实存在。
输入由读者提供,不具有独立真实性。需要真实运行验证时,另行取得授权并采集环境证据,不能用本程序作产品验收工具。
## 完整FRP两端配置(未执行)
frps.toml与frpc.toml按v0.61.1固定字段编写。读者需已有该版本二进制、获批两台隔离主机及客户端本机既有SSH服务。192.0.2.10必须替换为服务端实际地址;只允许客户端到服务端7000的必要网络路径,禁止将示例文档地址部署为公网地址。
两端auth.token必须替换成同一份独立随机秘密,不能使用仓库里的明显占位值。服务端secrets/frps.crt及frps.key由读者自供,证书SAN须含frps.example.invalid(实际部署也可统一改成获批域名);客户端secrets/root.crt是对应已核验CA。不得关闭trustedCaFile或名称校验以通过连接。私钥与token文件只允许相应进程身份读取。
proxyBindAddr限制映射入口在服务端回环6000,allowPorts只允许6000,管理面板不启用。frpc的localIP属于客户端,因此连接的是客户端127.0.0.1:22。7000是控制/工作连接入口,6000是被映射入口。客户端到代理的TLS不替代被映射SSH服务的主机验证与用户授权。
读者获得部署授权后,在各自包含配置及secrets的隔离目录分别运行:
```bash
./frps -c ./frps.toml
```
```bash
./frpc -c ./frpc.toml
```
预期客户端注册lab-ssh,服务端仅回环6000可作为SSH入口;服务端以外主机不能直接连接6000。令牌不同预期注册拒绝,证书不可信或名称不匹配预期TLS拒绝,客户端SSH未监听则注册可能成功但业务连接失败。此处均为预期,本轮未执行。
## SSH本地转发的完整命令(未执行)
前置:独立核验并预置192.0.2.10主机公钥、提供有效student账户私钥,服务端允许到其自身127.0.0.1:6000的转发。这里直接连接FRP主机,不使用限制目的地为2222的SSH课程跳板配置。
```bash
ssh -N -T -o StrictHostKeyChecking=yes -o IdentitiesOnly=yes -o ExitOnForwardFailure=yes -o ForwardAgent=no -i /srv/tunnel-lab/client_ed25519 -L 127.0.0.1:16000:127.0.0.1:6000 student@192.0.2.10
```
本机16000只监听回环,转发目标127.0.0.1:6000属于SSH服务端。ExitOnForwardFailure能报告初始转发建立失败,但不保证之后FRP或目标服务始终可用。经此入口再连接SSH仍须核验最终被映射主机的身份。
恢复时撤销本次映射或还原已批准端口范围,保留原管理入口;清理只结束本次前台frpc/frps/转发会话,删除分发的实验秘密并核查相应授权已撤销。不终止同名其他进程。本项目未创建这些进程。WireGuard的独立两端模型见下节,不能与FRP端口映射混为同一机制。
## WireGuard 两端配置与单主机前缀(未执行)
另一个独立配置例是a-server.conf和b-client.conf,面向Linux已有WireGuard支持、wireguard-tools 1.0.x的wg-quick与iproute2。此处不安装工具,不创建接口、不生成密钥、不执行配置;Windows原生客户端的界面和路由管理不属于这个Linux自跑步骤。两端只互访隧道主机地址,不转发LAN、不改默认路由、不配置DNS或NAT,因此不需要为这个模型打开IP转发。
A是可由B访问的UDP端点,B可在允许出站的NAT后。192.0.2.10是文档地址,读者未来必须换成自己的A端可达地址;10.77.0.1/32和10.77.0.2/32是隧道地址示例,先确认与双方真实路由不冲突。A的UDP51820需按来源范围允许B访问;内层主机访问另受主机防火墙限制。接口名取配置文件名a-server与b-client,必须与已有接口不冲突。
PrivateKey占位值不是合法密钥,两份原样配置不能启动。只在读者各自专用、不可被其他用户读取的空练习目录中分别生成本端秘密:
```bash
umask 077
wg genkey > private.key
wg pubkey < private.key > public.key
```
双方通过可信渠道交换public.key;A配置只填A私钥/B公钥,B配置只填B私钥/A公钥。不能交换私钥或把填好后的配置提交仓库。限制私钥和含密钥配置文件的读取权限;不要把真实私钥打印到工单或Shell历史中。B的PersistentKeepalive=25仅演示需维持NAT映射时的选择,不保证穿透所有过滤策略。
Address是wg-quick扩展项,不应把带Address的文件直接当作wg setconf输入。wg-quick会按AllowedIPs创建相应路由;本例双方均只允许另一个隧道地址的/32,未设置0.0.0.0/0,也没有PostUp/PostDown脚本。A未固定B的外层Endpoint,B先向A发出已认证流量后,A才有可用的动态对端端点;不能把配置文件中没写B外层地址解释为任意对端都获准。
以下仅供将来另行获准的Linux隔离环境,分别在正确主机、填好各自配置后使用,本轮未执行:
```bash
# 仅A,未来读者自行执行
sudo wg-quick up ./a-server.conf
# 仅B,未来读者自行执行
sudo wg-quick up ./b-client.conf
```
设计预期:双方能发送发往对方隧道/32的流量;在主机防火墙允许ICMP时,B到10.77.0.1的ping可作一项内层观测。握手不证明端口服务或整个LAN可达。公钥填错应无法完成预期握手;AllowedIPs错可出现握手有记录但内层业务失败;UDP端点不可达需核对外层地址、路径及过滤,而不是直接开放全网。Keepalive不负责为业务服务做健康检查。
恢复保留原管理通道和双方路由快照,只回退本例对应文件;密钥泄露须换新秘密和公钥绑定,不回退到泄露秘密。若读者未来实际建立过接口,分别用对应文件的wg-quick down ./a-server.conf或wg-quick down ./b-client.conf撤销该实验接口与其管理的路由,核对后再删除自己的配置/密钥副本;不删除其他接口或共享网络规则。仅编辑过文件则没有任何接口需要清理。
核对日期2026-10-17,限定上述共同字段,不称为最新部署推荐。依据:[官方密钥与keepalive入门](https://www.wireguard.com/quickstart/)、[wg字段手册](https://git.zx2c4.com/wireguard-tools/plain/src/man/wg.8)、[wg-quick路径、Address与路由手册](https://git.zx2c4.com/wireguard-tools/plain/src/man/wg-quick.8)。未用官方公用演示服务器,也未进行握手或路由验证。继续阅读
- 知识专题
- 知识专题
- 应用实践