dn42
连接dn42网络的步骤大致如下:
- 创建一个容器用于wireguard与bird2
- 添加bird2和wireguard配置文件,启动容器, 并以此容器为出口创建一个 Flow.
- 开启 NAT1 映射
- 设置路由和dns让内网中的程序可以访问 dn42 中的 IP / 网段 / 域名.
创建容器
首先需要创建一个dockerfile文件
# 使用Alpine Linux作为基础
FROM alpine:latest
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
RUN apk update && apk add --no-cache \
wireguard-tools \
bird2 \
libgcc \
nano \
iptables \
tcpdump \
iproute2 \
tini \
&& rm -rf /var/cache/apk/*
# 创建配置目录
RUN mkdir -p /etc/wireguard /etc/bird
# 复制启动脚本和配置(稍后创建)
COPY entrypoint.sh /entrypoint.sh
COPY redirect_pkg_handler /redirect_pkg_handler
# 赋予脚本执行权限
RUN chmod +x /entrypoint.sh && chmod +x /redirect_pkg_handler
# 使用tini作为init进程处理信号
ENTRYPOINT ["/sbin/tini", "--", "/entrypoint.sh"]在同目录创建entrypoint.sh文件
#!/bin/sh
set -e
echo "[redirect_pkg_handler] starting..."
/redirect_pkg_handler -m route &
# 启动所有WireGuard接口(配置需以.conf结尾)
for conf in /etc/wireguard/*.conf; do
if [ -f "$conf" ]; then
echo "启动WireGuard接口: $conf"
wg-quick up "$conf" || echo "启动 $conf 失败,请检查配置"
fi
done
# 等待网络就绪(特别是IPv6)
sleep 2
# 检查WireGuard接口状态
wg show
# 启动BIRD2守护进程
echo "启动BIRD2路由守护进程..."
exec bird -c /etc/bird/bird.conf -f在landscape的release下载redirect_pkg_handler文件(musl版),此时当前文件夹下有以下内容
tree
.
├── dockerfile
├── easytier-core
├── redirect_pkg_handler
└── entrypoint.sh然后执行,进行镜像编译
docker build -t <标签名称> .启动容器
WARNING
网桥中的名称一定要设置 !!!
networks:
my-tailscale-bridge:
driver: bridge
driver_opts:
# 一定要设置, 否则默认会使用动态网卡名称, 重启后网卡名称变动导致 LAN 服务不能正常开启
com.docker.network.bridge.name: dn42-br0然后按照你的 compose 配置进行启动即可.
services:
dn42:
image: <编译的镜像名>
container_name: dn42
restart: unless-stopped
cap_add:
- NET_ADMIN
- SYS_ADMIN
- PERFMON
sysctls:
net.ipv4.ip_forward: "1"
net.ipv6.conf.all.forwarding: "1"
net.ipv4.conf.all.rp_filter: "0"
net.ipv4.conf.default.rp_filter: "0"
volumes:
- /root/dn42/wireguard:/etc/wireguard
- /root/dn42/bird:/etc/bird
- /root/.landscape-router/unix_link/:/ld_unix_link/:ro
networks:
dn42-bridge:
ipv4_address: <你申请的dn42 ipv4段ip>
ipv6_address: <你申请的dn42 ipv6段ip>
networks:
dn42-bridge:
driver: bridge
enable_ipv6: true
driver_opts:
# 一定要设置, 否则默认会使用动态网卡名称, 重启后网卡名称变动导致 LAN 服务不能正常开启
com.docker.network.bridge.name: dn42-br0
ipam:
config:
- subnet:
gateway:
- subnet:
gateway:然后在 /root/dn42/bird下创建bird.conf,直接复制dn42 wiki教程过来修改即可
在/root/dn42/wireguard下创建你peer的wg配置
[Interface]
PrivateKey =
# 监听端口
ListenPort =
# DN42通信必须使用您在DN42注册的正式IP(如下示例)
# 请务必替换下面的示例IP为您自己的DN42 IPv4和IPv6
Address =
table = off
# 可选:为BGP会话添加一个链路本地地址
PostUp = /etc/wireguard/scripts/up.sh %i
PostDown = /etc/wireguard/scripts/down.sh %i
[Peer]
PublicKey =
# 对等节点的Endpoint
Endpoint =
# 允许通过此隧道路由的DN42网络段
AllowedIPs = 172.20.0.0/14, 172.31.0.0/16, fd00::/8, fe80::/64
# 预共享密钥
PresharedKey =
# 保活间隔
PersistentKeepalive = 25在/root/dn42/wireguard/scripts下创建up.sh
#!/bin/bash
# /etc/wireguard/scripts/up.sh
interface=$1
status=$2
ip address add 本地链路地址 dev $interface
iptables -t nat -A POSTROUTING -o $interface ! -s 172.16.0.0/12 -j SNAT --to-source 设置的docker ipv4
ip6tables -t nat -A POSTROUTING -o $interface ! -s fd00::/8 -j SNAT --to-source 设置的docker ipv6以及down.sh
#!/bin/bash
# /etc/wireguard/scripts/notify.sh
interface=$1
status=$2
iptables -t nat -D POSTROUTING -o $interface ! -s 172.16.0.0/12 -j SNAT --to-source 设置的docker ipv4
ip6tables -t nat -D POSTROUTING -o $interface ! -s fd00::/8 -j SNAT --to-source 设置的docker ipv6然后创建一个 Flow 并使用这个容器作为出口. 
设置 NAT1
先在容器所属的 网桥 开启 Lan 路由转发服务. 如下图.

静态NAT配置 (内网目标端口为容器对应wg的端口, IP 为容器 IP)
在防火墙放开相应端口
配置 "路由" 规则
点击相应 Flow 的 目标 IP 按钮进行配置. 只有添加相应规则的 Flow 才会生效. 
比如我当前 LAN 客户端的 MAC 地址是 00:a0:98:27:41:47, 这个客户端当前被 Flow 11 规则所管理. 所以我需要在 Flow 11 的 目标 IP 进行配置. 并选择流量的出口为刚刚启动容器时创建的 Flow 253.

这样, 当 LAN 客户端访问 dn42网段时, 这些数据包就会使用 Flow 253 (easytier) 的出口, 也就是被转发到 dn42 容器中.
配置dns
在dns相关的上游dns配置管理里,点击创建添加dn42网络段的dns

此时再回到分流设置, 在Flow 11的DNS里增加规则

这样, 当 LAN 客户端访问 dn42域名时, 这些数据包就会使用 Flow 253 (easytier) 的出口, 也就是被转发到 dn42 容器中.

