1, TOR隐藏服务
一、准备
一台 Linux 服务器(建议新建最小化实例),具备 sudo。
本地已有一个要对外发布的服务(例如 Nginx/Apache 在本机 127.0.0.1:80 或 Unix Socket 上)。
community.torproject.org
二、安装 Tor(推荐用 Tor 官方仓库)
# 1) 启用 Tor 官方 APT 仓库(替换 <DISTRIBUTION> 为你的代号,如 bookworm / jammy)
sudo apt update
sudo apt install apt-transport-https gnupg -y
wget -qO- https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc \
| gpg --dearmor | sudo tee /usr/share/keyrings/deb.torproject.org-keyring.gpg >/dev/null
sudo tee /etc/apt/sources.list.d/tor.list >/dev/null <<'EOF'
deb [signed-by=/usr/share/keyrings/deb.torproject.org-keyring.gpg] https://deb.torproject.org/torproject.org <DISTRIBUTION> main
deb-src [signed-by=/usr/share/keyrings/deb.torproject.org-keyring.gpg] https://deb.torproject.org/torproject.org <DISTRIBUTION> main
EOF
# 2) 安装 Tor 与 keyring
sudo apt update
sudo apt install -y tor deb.torproject.org-keyring
这样能拿到最新稳定版 Tor,比仅用发行版自带包更及时。
support.torproject.org
community.torproject.org
三、配置 Onion Service
编辑 /etc/tor/torrc,添加(或按需修改)以下条目:
# v3 隐藏服务目录(Tor 会在重启时生成密钥与 hostname)
HiddenServiceDir /var/lib/tor/my_site/
HiddenServiceVersion 3
# 将 Onion 的 80 端口转发到本机 80(也可转到反代/应用端口)
HiddenServicePort 80 127.0.0.1:80
# (可选)更隐蔽的做法:使用 Unix Socket 而不是 TCP 回环
# HiddenServicePort 80 unix:/var/run/tor/my_site.sock
注意:HiddenServiceDir 需要 tor 进程可写;常见报错就是目录/权限不对。
community.torproject.org
重启 Tor:
sudo systemctl restart tor
成功后,在 HiddenServiceDir 下会出现 hostname 文件,里面就是你的 v3 .onion 地址(56 个字符)。请妥善保管同目录中的私钥文件。
community.torproject.org
support.torproject.org
现在用 Tor Browser 访问该地址,应能看到你的站点内容。
community.torproject.org
四、(可选但强烈建议)启用客户端授权(私有/白名单访问)
如果你不希望“知道地址的人都能访问”,可以为 v3 服务开启客户端授权:服务器侧在 HiddenServiceDir/authorized_clients/ 放入授权文件;客户端持有私钥后方可访问。流程要点如下(官方步骤精简版):
服务端:在 <HiddenServiceDir>/authorized_clients/ 内,为每个允许的客户端写入一行 descriptor:x25519:<公钥base32> 的 .auth 文件,然后 systemctl reload tor;
客户端:在 torrc 设置 ClientOnionAuthDir /var/lib/tor/onion_auth,并为目标 onion 地址写入 <onion-addr-without-.onion>:descriptor:x25519:<私钥base32> 的 .auth_private 文件,重载 Tor 即可访问。
community.torproject.org
五、(可选)把 SSH 也放到 Onion(请务必配合客户端授权)
HiddenServiceDir /var/lib/tor/ssh/
HiddenServiceVersion 3
HiddenServicePort 22 127.0.0.1:22
将 SSH 暴露到 Onion 时,务必打开 v3 客户端授权,避免被扫描与暴力破解。
community.torproject.org
六、(进阶)临时/程序化创建 Onion(Ephemeral)
如果想在应用中动态创建 Onion(例如穿透 NAT),可以通过 Tor ControlPort 的 ADD_ONION 命令创建“临时”服务;这在自动化部署/自托管工具中很常见。请确保理解 single-hop / anonymous 模式的区别与风险。
spec.torproject.org
+1
trickster.dev
七、安全与运维要点(强烈建议)
仅绑定回环或 Unix Socket:你的 Web/应用服务器监听 127.0.0.1 或 unix:/...,不要绑定公网。
community.torproject.org
最小暴露:需要公网访问时用常规反代;Onion 侧只走本机回环/Socket。
不要与中继同机同实例:同一 Tor 实例不建议同时跑中继与隐藏服务。
riseup.net
密钥备份与轮换:备份 HiddenServiceDir 私钥;泄露即意味着可被假冒。
community.torproject.org
只用 v3:v2 已弃用;确认用 56 位地址。
community.torproject.org
support.torproject.org
+1
运维与泄露面检查:参考官方“运营安全”与 Riseup 的 Best Practices,避免通过站点配置、日志、外链等暴露真实 IP/域名。可用 OnionScan 辅助检查。
community.torproject.org
如果你告诉我你的发行版(如 Debian 12/Ubuntu 24.04)和要暴露的服务端口,我可以把上面的命令与 torrc 片段按你的环境定制,顺带给一个 Nginx(Unix Socket) 最小示例配置。
您说:
OPSEC 是什么?
ChatGPT 说:
OPSEC(Operations Security,行动安全/运作保密)是一套持续性的管理流程,用来识别并控制在日常活动中可能泄露给对手的关键信息与可观察迹象,避免被对手用来推断你的计划、能力与弱点。最早源于军队/情报领域,如今广泛用于企业安全、研发、红队蓝队、个人隐私等场景。
OPSEC 五步法(经典循环)
识别关键信息(CI):哪些信息一旦被对手知道就会造成实质风险?
例:发布窗口、内网拓扑、管理员账号命名规则、出差行程。
威胁分析:谁可能针对你?他们的动机与能力是什么?
例:竞争对手、钓鱼团伙、APT、数据扒手。
脆弱性分析:哪些行为/迹象会暴露 CI?
例:社媒晒工牌、Git 仓库泄密、文档元数据、可被爬到的测试域名、规律化作息。
风险评估:结合发生概率与影响度,给出优先级。
实施对策:最小化暴露面与可观察性,并持续评估效果。
例:最小必要披露、分级信息管控、最小权限、密钥与元数据治理、变更前后“迹象审计”。
和相关概念的区别
InfoSec(信息安全):侧重数据/系统的机密性、完整性、可用性;OPSEC 更关注行为与迹象管理。
COMSEC(通信安全):加密与密钥管理;OPSEC 关心“即便加密,是否仍泄露模式/时间线等侧信道”。
PERSEC(个人安全):个人身份与隐私;OPSEC 可包含 PERSEC,但侧重“对手视角下的可推断性”。
常见失误(非穷尽)
社交媒体/招聘启事/发布日志里过度披露细节(堆栈、架构、上线窗口)。
文档/图片元数据(作者、路径、坐标)未清理。
代码仓库遗留密钥/令牌与可预测命名。
预发布/演示环境对外可见、目录索引开放、错误页信息量过大。
高度可预测的模式(打卡、会议、变更节奏)被对手长期画像。
最小清单(可落地)
按需披露:对外材料做“对手视角”复查;设定可公开/内部/机密分级。
元数据治理:对外文件与图片统一脱敏;CI/CD 中加“元数据剥离”步骤。
密钥与配置:集中式秘密管理(而非 .env 入仓),定期轮换、审计。
环境隔离:测试/预发使用访问控制或私有入口,关闭目录索引与详细错误。
最小可观察性:减少可被爬虫探测的指纹(版本号、Banner、调试端点)。
训练与演练:员工社工演练、红队蓝队对抗;将 OPSEC 纳入变更评审。
简而言之:OPSEC 是“从对手视角出发”的信息与行为暴露管理。并不等同于“隐身”,而是有计划地控制能被观察与推断到的内容,用最小成本降低风险。
分类目录归档:科学上网
VPS 安装节点
A: 安装X-UI
bash <(curl -Ls https://raw.githubusercontent.com/vaxilu/x-ui/master/install.sh)
B: 一键申请SSL证书
bash <(curl -fsSL https://raw.githubusercontent.com/slobys/SSL-Renewal/main/acme.sh)
如果AlmaLinux 上提示,❌ 不支持的操作系统:almalinux
sudo sed -i 's/centos)/centos|almalinux|rocky|rhel)/' /root/acme_3.0.sh || true
sudo bash /root/acme_3.0.sh
特殊情况,如果遇到证书申请不成功,需要删除已存在文件的,请执行一下命令
sudo rm -rf ~/.acme.sh && sudo rm -rf /tmp/acme
如果提示DNF 安装包冲突那么
sudo dnf upgrade -y –allowerasing –refresh //直接让 DNF 自动替换冲突包:
Linux 服务器安全配置
AlmaLinux 9 服务器安全
启用 EPEL 仓库安装 sshguard
sudo dnf install epel-release -y
sudo dnf update -y
sudo dnf install sshguard -y
sudo dnf config-manager --set-disabled epel* //长期禁用 EPEL 并只使用官方仓库
sudo dnf config-manager --set-enabled epel* //允许使用 EPEL
dnf repolist all | grep epel //查看源的命令
配置示例(/etc/sshguard.conf)
# 使用 firewalld 作为防火墙后端
BACKEND="/usr/libexec/sshguard/sshg-fw-firewalld"
# 永久黑名单文件(自动写入)
BLACKLIST_FILE=90:/var/lib/sshguard/blacklist
# 单次封禁时长(秒)——这里设得比较短,只是触发永久黑名单用
BLOCK_TIME=3600
# 检测时间窗口(秒),在这个时间内累计计数
DETECTION_TIME=600
# 攻击分数阈值(3 次失败登录大约触发)
THRESHOLD=30
LOGREADER="LANG=C /usr/bin/journalctl -afb -o cat -t sshd" // 保险做法是去掉 -p info,直接全抓:
sudo systemctl restart sshguard
//查看是否成功
nft list ruleset
nft list set inet firewalld sshguard4 //生效IP
journalctl -u sshguard -n 20
journalctl -t sshd -S -5m | grep "Failed password"
sudo systemctl status sshguard
暗网导行网站
1, Dread Forum
https://dreadytofatroptsdj6io7l3xptbet6onoyno2yv7jicoxknyazubrad.onion //redit 风格的论坛
2, The hidden wiki
http://zqktlwiuavvvqqt4ybvgvi7tyo4hjl5xgfuvpdf6otjiycgwqbym2qad.onion/wiki/index.php/Main_Page
3, Ahmia
http://juhanurmihxlp77nkq76byazcldy2hlmovfu2epvl5ankdibsot4csyd.onion/
wireguard 分流
wireguard 客户端可以配置成, 根据 IP 段选择 连接对应的wireguard 服务器端? 例如 wireguard 客户端IP 为 192.168.10.0/24 时, 连接 wireguard 服务器A端, 33.33.33.33 wireguard 客户端IP 为 192.168.20.0/24 时, 连接 wireguard 服务器B端, 44.44.44.44 wireguard 客户端IP 为 192.168.30.0/24 时, 连接 wireguard 服务器C端, 55.55.55.55 wireguard 客户端 安装在openwrt 中, wireguard 服务器端 安装到 centos 服务器中, 有 3台服务器 A,B, C
解决方案
方案一:用 luci-app-pbr(VPN Policy-Based Routing)
1) 安装
opkg update
opkg install luci-app-pbr pbr
#(如未装 WG)
opkg install wireguard-tools kmod-wireguard
2) 配 3 条 WireGuard 接口(/etc/config/network)
关键点:三个接口分别指向 33.33.33.33 / 44.44.44.44 / 55.55.55.55;为避免默认路由被抢占,关闭 route_allowed_ips(或 AllowedIPs 不设 0.0.0.0/0)。
config interface 'wgA'
option proto 'wireguard'
list addresses '10.8.0.2/32' # 你在 A 服务器分给 OpenWrt 的隧道 IP
option private_key 'XXXXX'
option peerdns '0'
option mtu '1420' # 视需要调整
option metric '50' # 防止干扰主路由
config wireguard_wgA
option public_key 'PUBKEY_A'
option endpoint_host '33.33.33.33'
option endpoint_port '51820'
option persistent_keepalive '25'
list allowed_ips '0.0.0.0/0' # 让隧道可承载全流量
option route_allowed_ips '0' # 但不自动加默认路由
config interface 'wgB'
option proto 'wireguard'
list addresses '10.9.0.2/32'
option private_key 'YYYYY'
option peerdns '0'
option mtu '1420'
option metric '50'
config wireguard_wgB
option public_key 'PUBKEY_B'
option endpoint_host '44.44.44.44'
option endpoint_port '51820'
option persistent_keepalive '25'
list allowed_ips '0.0.0.0/0'
option route_allowed_ips '0'
config interface 'wgC'
option proto 'wireguard'
list addresses '10.10.0.2/32'
option private_key 'ZZZZZ'
option peerdns '0'
option mtu '1420'
option metric '50'
config wireguard_wgC
option public_key 'PUBKEY_C'
option endpoint_host '55.55.55.55'
option endpoint_port '51820'
option persistent_keepalive '25'
list allowed_ips '0.0.0.0/0'
option route_allowed_ips '0'
防火墙:把 wgA/wgB/wgC
加到一个 vpn
zone(出方向 ACCEPT,或转发到 WAN),LAN 允许 forward 到 vpn
。
3) 策略路由(/etc/config/pbr)
config pbr 'config'
option enabled '1'
option strict_enforcement '1'
option verbosity '1'
config policy
option name 'LAN10_to_A'
option src_addr '192.168.10.0/24'
option interface 'wgA'
config policy
option name 'LAN20_to_B'
option src_addr '192.168.20.0/24'
option interface 'wgB'
config policy
option name 'LAN30_to_C'
option src_addr '192.168.30.0/24'
option interface 'wgC'
重启网络/服务:
/etc/init.d/network restart
/etc/init.d/pbr restart
4): DNS 防泄漏
/etc/config/dhcp(dnsmasq)
- 关闭本机 DNS 监听(只当 DHCP 不当 DNS)
- 各网段通过 DHCP option 6 下发各自专属 DNS
你可以用自己三台服务器的隧道侧地址(例如在服务器 A/B/C 上监听10.8.0.1/10.9.0.1/10.10.0.1
的递归或转发 DNS),也可以用公共 DNS。下面给两套写法,你选其一。
config dnsmasq
option domainneeded '1'
option boguspriv '1'
option authoritative '1'
option noresolv '1'
option port '0' # 关闭本机53端口,路由器不提供DNS
# 按你的实际接口名修改(示例假设 br-lan10/20/30 对应的 dhcp 段名为 lan10/lan20/lan30)
config dhcp 'lan10'
option interface 'lan10'
option start '100'
option limit '100'
option leasetime '12h'
# 下面两行二选一(只保留你选的那行!)
# 【A 方案:用服务器A的隧道侧DNS】(建议跑 unbound/dnsmasq 在 10.8.0.1)
# list dhcp_option '6,10.8.0.1'
# 【B 方案:用公共DNS(示例Cloudflare)】
list dhcp_option '6,1.1.1.1,1.0.0.1'
config dhcp 'lan20'
option interface 'lan20'
option start '100'
option limit '100'
option leasetime '12h'
# 【A:服务器B】
# list dhcp_option '6,10.9.0.1'
# 【B:公共DNS(示例Google)】
list dhcp_option '6,8.8.8.8,8.8.4.4'
config dhcp 'lan30'
option interface 'lan30'
option start '100'
option limit '100'
option leasetime '12h'
# 【A:服务器C】
# list dhcp_option '6,10.10.0.1'
# 【B:公共DNS(示例Quad9)】
list dhcp_option '6,9.9.9.9,149.112.112.112'
若采用【A 方案】,请在三台 CentOS 上各自开一个本地 DNS(unbound/dnsmasq 任一),监听隧道 IP(如 10.8.0.1),并允许递归到公网;这样天然“所有 DNS 一定走隧道”。
5): /etc/config/firewall(严格拦截 53,只放行白名单 DNS)
为每个网段添加两条规则:允许到“白名单 DNS”的 53、拒绝其它 53。
(下面示例分别给出 A/B 两种上游写法,保留你实际使用的 IP)
######## LAN10 -> 只许到 A 方案的 10.8.0.1(或 B 方案的 1.1.1.1/1.0.0.1) ########
config rule
option name 'LAN10 allow DNS to A(or CF)'
option src 'lan10'
option proto 'tcpudp'
option dest_port '53'
# A 方案(服务器A在隧道侧的DNS)
# option dest_ip '10.8.0.1'
# B 方案(Cloudflare)
option dest_ip '1.1.1.1 1.0.0.1'
option target 'ACCEPT'
config rule
option name 'LAN10 block other DNS'
option src 'lan10'
option proto 'tcpudp'
option dest_port '53'
option target 'REJECT'
######## LAN20 -> 只许到 B 方案的 10.9.0.1(或 8.8.8.8/8.8.4.4) ########
config rule
option name 'LAN20 allow DNS to B(or Google)'
option src 'lan20'
option proto 'tcpudp'
option dest_port '53'
# A 方案(服务器B)
# option dest_ip '10.9.0.1'
# B 方案(Google)
option dest_ip '8.8.8.8 8.8.4.4'
option target 'ACCEPT'
config rule
option name 'LAN20 block other DNS'
option src 'lan20'
option proto 'tcpudp'
option dest_port '53'
option target 'REJECT'
######## LAN30 -> 只许到 C 方案的 10.10.0.1(或 9.9.9.9/149.112.112.112) ########
config rule
option name 'LAN30 allow DNS to C(or Quad9)'
option src 'lan30'
option proto 'tcpudp'
option dest_port '53'
# A 方案(服务器C)
# option dest_ip '10.10.0.1'
# B 方案(Quad9)
option dest_ip '9.9.9.9 149.112.112.112'
option target 'ACCEPT'
config rule
option name 'LAN30 block other DNS'
option src 'lan30'
option proto 'tcpudp'
option dest_port '53'
option target 'REJECT'
6): 服务器端(CentOS)最小可用示例(每台一份)
以 A 为例(B/C 同理改端口与网段):
/etc/wireguard/wg0.conf
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <SERVER_A_PRIVKEY>
# 打开转发 + NAT(iptables 版本,nft/火墙按需替换)
PostUp = sysctl -w net.ipv4.ip_forward=1 ; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
# OpenWrt(wgA)的公钥
PublicKey = <OPENWRT_PUBKEY_FOR_A>
AllowedIPs = 10.8.0.2/32
B/C 建议用不同的隧道网段(如 10.9.0.0/24、10.10.0.0/24),便于区分与排错。
启动:
systemctl enable --now wg-quick@wg0
7): 在 CentOS 服务器上开“隧道侧 DNS”
举例:在 A 服务器(10.8.0.1)用 dnsmasq 作转发器(轻量、够用),B/C 同理改 IP。
/etc/dnsmasq.d/wg-dns.conf
:
# 仅监听隧道口
interface=wg0
listen-address=10.8.0.1
bind-interfaces
no-resolv
# 上游你可选 Cloudflare/Google/Quad9 等
server=1.1.1.1
server=1.0.0.1
cache-size=1000
启动并自启:
systemctl enable --now dnsmasq
方案二:纯 UCI 手工(多路由表 + ip rule)
1) 同上先建 3 条 WG 接口(与方案一相同),保持 route_allowed_ips '0'
。
2) 自定义路由表与规则(/etc/config/network)
# 路由表 101/102/103:默认走各自的 wg 接口
config route
option interface 'wgA'
option target '0.0.0.0'
option netmask '0.0.0.0'
option table '101'
config rule
option src '192.168.10.0/24'
option lookup '101'
option priority '1010'
config route
option interface 'wgB'
option target '0.0.0.0'
option netmask '0.0.0.0'
option table '102'
config rule
option src '192.168.20.0/24'
option lookup '102'
option priority '1020'
config route
option interface 'wgC'
option target '0.0.0.0'
option netmask '0.0.0.0'
option table '103'
config rule
option src '192.168.30.0/24'
option lookup '103'
option priority '1030'
/etc/init.d/network restart
3):给每个表加“默认走 wgX”的路由(/etc/config/network)
##### 表101:默认经 wgA #####
config route
option interface 'wgA'
option target '0.0.0.0'
option netmask '0.0.0.0'
option table '101' # => ip route add default dev wgA table 101
#(如用IPv6,同样建一条默认路由到 wgA)
# config route6
# option interface 'wgA'
# option target '::'
# option netmask '0'
# option table '101'
##### 表102:默认经 wgB #####
config route
option interface 'wgB'
option target '0.0.0.0'
option netmask '0.0.0.0'
option table '102' # => default dev wgB
# config route6
# option interface 'wgB'
# option target '::'
# option netmask '0'
# option table '102'
##### 表103:默认经 wgC #####
config route
option interface 'wgC'
option target '0.0.0.0'
option netmask '0.0.0.0'
option table '103' # => default dev wgC
# config route6
# option interface 'wgC'
# option target '::'
# option netmask '0'
# option table '103'
用策略规则把各源网段指向对应表(/etc/config/network)
##### LAN10 -> 表101 -> wgA #####
config rule
option src '192.168.10.0/24'
option lookup '101'
option priority '1010'
##### LAN20 -> 表102 -> wgB #####
config rule
option src '192.168.20.0/24'
option lookup '102'
option priority '1020'
##### LAN30 -> 表103 -> wgC #####
config rule
option src '192.168.30.0/24'
option lookup '103'
option priority '1030'
编辑 /etc/iproute2/rt_tables
末尾追加:
101 t_wgA
102 t_wgB
103 t_wgC
应用并自检
/etc/init.d/network restart
# 查看规则与表
ip rule
ip route show table 101
ip route show table 102
ip route show table 103
# 看 WG 是否在传数据
wg show
MAC 制造商
1, 美国用 Netgear, 英国用British Telecommunications plc
美国: 前缀 00:1B:2F → 例:00:1B:2F:11:61:70 //NETGEAR
英国: 前缀 00:00:DB → 例:00:00:DB:01:23:45 //British Telecommunications plc
查询网址: https://maclookup.app/
Firewall 防火墙操作
1, firewall 允许与禁用端口
firewall-cmd --zone=public --add-port=54212/tcp --permanent //允许 TCP 端口
firewall-cmd --zone=public --add-port=54212/udp --permanent
firewall-cmd --zone=public --remove-port=5421/tcp --permanent //禁止
firewall-cmd --zone=public --remove-port=5421/tcp --permanent
firewall-cmd --reload
firewall-cmd --state # 确认 firewalld 是否运
firewall-cmd --list-all
firewall-cmd --get-active-zones
firewall-cmd --zone=public --list-all
检查防火墙系统
systemctl is-active firewalld
systemctl is-active nftables
systemctl is-active iptables
/etc/firewalld/firewalld.conf //NftablesTableOwner=yes 配置项控制
OpenWrt 安装Tun
OpenWrt 默认没有 modprobe
,所以一般要先安装:
opkg update
opkg install kmod-tun
检查设备节点
ls -l /dev/net/tun
正常情况下应该有:
crw-rw-rw- 1 root root 10, 200 Aug 20 20:20 /dev/net/tun
如果没有,说明 TUN 设备未启用
openwrt 安装 tcpdump 用于抓包, 在路由器中查看是否劫持客户端电脑的DNS

opkg update
# 体积小:功能裁剪版(多数场景够用)
opkg install tcpdump-mini
# 或者安装完整版(建议,过滤器/解析功能更全)
opkg install tcpdump
路由器抓包看 WAN 口是否有 53 出去
tcpdump -ni eth_wan 'port 53'
tcpdump -ni eth0 'udp and port 443'
tcpdump -ni any icmp # IPv4 ICMP
tcpdump -ni any proto 50 # ESP
tcpdump -ni any udp port 500 or udp port 4500 # IKE/NAT-T
先确认规则是否在生效、是否有命中
1) 列出 nft 规则
# 全部规则
nft list ruleset
# 只看你截图里的“dnsmasq”那张表
nft list table inet dnsmasq
# 带 handle 和计数器(建议看这个)
nft -a list chain inet dnsmasq prerouting
如果规则里没有 counter,可以临时加一个(或用 LuCI 加),便于看命中数是否在增长:
nft add rule inet dnsmasq prerouting udp dport 53 counter redirect to :53
# ↑ 只是示例,实际以你的规则为准
实时追踪一条 DNS 包是否命中
nft monitor trace
另一个终端执行 nslookup,然后观察 trace 是否显示命中 dnsmasq/prerouting 的 redirect 规则
3) 看 WAN 口是否还有 53 流量(最终验证)
tcpdump -ni <你的WAN口> 'port 53'
# 比如 pppoe-wan/eth0/eth1 等
能看到去 8.8.8.8 的 53 包 → 劫持没有命中。
完全看不到 53 → 劫持成功(即使你在 LAN 口仍能看到目的为 8.8.8.8 的“原始”包)。
4):
A. 追踪路由器自身 → 127.0.0.1:11302 的流量
# 1) 先开一个终端:
nft monitor trace
# 2) 在另一个终端,把打标规则插到 inet fw4 的 output 链最前面(确保能被命中)
nft insert rule inet fw4 output oifname "lo" udp dport {53,11301,11302} meta nftrace set 1
nft insert rule inet fw4 output oifname "lo" tcp dport {53,11301,11302} meta nftrace set 1
# 如有 IPv6 也会走 lo,这两条已覆盖,无需额外加 ip/ip6 条件
# 3) 再做一次 nslookup(指向 127.0.0.1:11302)
nslookup www.google.com 127.0.0.1#11302
# 此时 monitor 窗口应当开始滚动,显示命中的表/链/规则及 verdict
清理(用 handle 删除你刚插入的规则):
nft -a list chain inet fw4 output | grep nftrace
nft delete rule inet fw4 output handle <handle号>
B. 追踪“LAN 客户端的 DNS 被 NAT 重定向到 11302”的路径
(这才会经过你关心的 PREROUTING/DNAT 规则)
在路由器上打标 prerouting + 来自 LAN 的 53 端口,然后从 LAN 电脑 发起查询(别指向 127.0.0.1,而是随便写 8.8.8.8:53 或默认 DNS):
# 1) 监控窗口
nft monitor trace
# 2) 打标(把 br-lan 改成你的 LAN 接口名)
nft insert rule inet fw4 prerouting iifname "br-lan" udp dport 53 meta nftrace set 1
nft insert rule inet fw4 prerouting iifname "br-lan" tcp dport 53 meta nftrace set 1
# 3) 在 LAN 电脑上执行:
nslookup www.google.com 8.8.8.8
# 现在 monitor 会显示:进入 inet/fw4 的 prerouting → 命中 DNAT/redirect → 继续到本机 11302 的轨迹
清理同上,用 handle 删除。
nft -a list chain inet fw4 prerouting | grep nftrace
nft delete rule inet fw4 prerouting handle <handle号>
5): 两种链的对比

三条典型路径(帮助你定位问题)
- LAN 客户端 → 路由器本机 DNS (53)
(ingress br-lan) → PREROUTING → (路由决策) → INPUT
想劫持它:在 PREROUTING 做
REDIRECT/DNAT → 11301/11302
。
- LAN 客户端 → 互联网(转发)
(ingress br-lan) → PREROUTING → FORWARD → POSTROUTING → (egress wan)
常在 PREROUTING 打 mark/TProxy,POSTROUTING 做 SNAT/MASQUERADE。
- 路由器本机进程 → 上游(如 dnsmasq → 1.1.1.1:53)
(本机进程) → OUTPUT → POSTROUTING → (egress wan)
想“拦/排除”本机发出的 DNS,在 OUTPUT 上做;PREROUTING 是拦不到的。
6): 禁掉/旁路 非 TCP/UDP 对公网(ICMP/ESP/AH/GRE/NTP 等
方式一:用 LuCI(图形界面)加“流量规则”
目标:仅限制某台买家设备(举例 192.168.111.50)从 LAN → WAN 的非 TCP/UDP;另外单独拦截 NTP(UDP/123),避免侧向校时泄露。
- 打开:网络 → 防火墙 → 流量规则 → 添加
- 名称:
Block non-TCP/UDP to WAN (buyer)
- 家族:IPv4/IPv6(任意)
- 协议:自定义,填:
icmp ah esp gre
- 源区域:
lan
- 源IP:
192.168.111.50
(或你买家设备的 IP / 子网) - 目标区域:
wan
- 动作:丢弃(DROP) 或 拒绝(REJECT)
- 保存并应用
- 名称:
- 再加一条IPv6 的 ICMPv6(因为上面“icmp”不涵盖 v6 的 ICMPv6)
- 名称:
Block ICMPv6 to WAN (buyer)
- 家族:仅 IPv6
- 协议:
icmp
(在 IPv6 家族下就是 ICMPv6) - 其它同上 → 丢弃
- 名称:
- 可选:拦截 NTP(若你不希望该设备对公网校时)
- 名称:
Block NTP (buyer)
- 家族:IPv4/IPv6(任意)
- 协议:
udp
- 目标端口:
123
- 源区域:
lan
,源IP:192.168.111.50
,目标区域:wan
- 动作:拒绝(REJECT 更直观,应用会立即得到失败)
- 名称:
说明:这些规则只影响 LAN→WAN 的转发,不影响你在路由器本机上 ping/管理,也不影响 LAN 内互访。
方式二:命令行(UCI 一把梭)
把下面整段贴进 SSH 里(把 IP 改成你的买家设备 IP;如用整段 VLAN/子网,可把 src_ip
改成 192.168.111.0/24
):
# 1) 阻断 IPv4/IPv6 的非 TCP/UDP 协议到 WAN(icmp/ah/esp/gre)
uci add firewall rule
uci set firewall.@rule[-1].name='Block-non-TCP_UDP-to-WAN'
uci set firewall.@rule[-1].src='lan'
uci set firewall.@rule[-1].src_ip='192.168.111.50'
uci set firewall.@rule[-1].dest='wan'
uci set firewall.@rule[-1].proto='icmp ah esp gre'
uci set firewall.@rule[-1].target='DROP'
uci set firewall.@rule[-1].family='any'
# 2) 补一条 ICMPv6(icmp 在 family:any 下未必涵盖 v6)
uci add firewall rule
uci set firewall.@rule[-1].name='Block-ICMPv6-to-WAN'
uci set firewall.@rule[-1].src='lan'
uci set firewall.@rule[-1].src_ip='192.168.111.50'
uci set firewall.@rule[-1].dest='wan'
uci set firewall.@rule[-1].proto='icmp'
uci set firewall.@rule[-1].family='ipv6'
uci set firewall.@rule[-1].target='DROP'
# 3) 可选:拦截 NTP(UDP/123)
uci add firewall rule
uci set firewall.@rule[-1].name='Block-NTP-to-WAN'
uci set firewall.@rule[-1].src='lan'
uci set firewall.@rule[-1].src_ip='192.168.111.50'
uci set firewall.@rule[-1].dest='wan'
uci set firewall.@rule[-1].proto='udp'
uci set firewall.@rule[-1].dest_port='123'
uci set firewall.@rule[-1].target='REJECT'
uci set firewall.@rule[-1].family='any'
uci commit firewall
/etc/init.d/firewall restart
R4S 重新写 TF 卡镜像
1, 先用lsblk
命令, 查看存储卡的启动盘情况
NAME SIZE MOUNTPOINTS
loop0 1.7G /overlay
mmcblk1 29.7G
├─mmcblk1p1 32M /mnt/mmcblk1p1
└─mmcblk1p2 2G /rom
2, 不用电脑 TF 读卡器,直接写TF盘,如果是img.gz文件
scp immortalwrt-24.10.2-rockchip-armv8-friendlyarm_nanopi-r4s-ext4-sysupgrade.img.gz [email protected]:/tmp/
gunzip -c /tmp/immortalwrt-rockchip-armv8-friendlyarm_nanopi-r4s-ext4.img.gz | dd of=/dev/mmcblk1 bs=4M conv=fsync
sync
reboot
3, 如果你拿到的是 sysupgrade.bin 而不是 img.gz,可以只写 rootfs 分区:
dd if=/tmp/immortalwrt-rockchip-armv8-friendlyarm_nanopi-r4s-squashfs-sysupgrade.bin of=/dev/mmcblk1p2 bs=4M conv=fsync
sync
reboot
R4S + 小米 AP VLAN 多 SSID
1, 在 R4S 侧:为连接到小米路由器的那根网线口(比如 eth1
)创建多个 VLAN 接口:
eth1.10 → VLAN10 英国节点
eth1.20 → VLAN20 美国节点
eth1.30 → VLAN30 德国节点
每个 VLAN 接口走 Passwall 对应节点。
2, 在小米路由器侧:
无线 AP1 绑定 VLAN10
无线 AP2 绑定 VLAN20
无线 AP3 绑定 VLAN30
这样物理网线只有一根,但 VLAN Tag 把流量隔离出来
3, R4S openwrt上的配置文件
假设你的小米路由器那根网线接在 R4S 的 eth1
上,你可以在 /etc/config/network
添加:
config device
option name 'eth1.10'
option type '8021q'
option ifname 'eth1'
option vid '10'
config interface 'vlan10'
option device 'eth1.10'
option proto 'static'
option ipaddr '192.168.10.1'
option netmask '255.255.255.0'
config device
option name 'eth1.20'
option type '8021q'
option ifname 'eth1'
option vid '20'
config interface 'vlan20'
option device 'eth1.20'
option proto 'static'
option ipaddr '192.168.20.1'
option netmask '255.255.255.0'
config device
option name 'eth1.30'
option type '8021q'
option ifname 'eth1'
option vid '30'
config interface 'vlan30'
option device 'eth1.30'
option proto 'static'
option ipaddr '192.168.30.1'
option netmask '255.255.255.0'
这样会在 eth1
上打 VLAN 10、20、30 三个 Tag,分别对应英国 / 美国 / 德国节点。
配置 /etc/config/dhcp
config dhcp 'vlan10'
option interface 'vlan10'
option start '100'
option limit '150'
option leasetime '12h'
config dhcp 'vlan20'
option interface 'vlan20'
option start '100'
option limit '150'
option leasetime '12h'
config dhcp 'vlan30'
option interface 'vlan30'
option start '100'
option limit '150'
option leasetime '12h'
配置 /etc/config/firewall
config zone
option name 'lan'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'ACCEPT'
list network 'vlan10'
list network 'vlan20'
list network 'vlan30'
4, 小米openwrt中的配置
典型端口名:eth0
/eth1
,桥 br-lan
,用 bridge-vlans 管理。
假设你用 LAN1 口接 R4S,这个 LAN1 要作为 trunk(tagged 10/20/30)。
a): /etc/config/network
### 把 lan 口做成桥,并在桥里定义 VLAN
config device
option name 'br-lan'
option type 'bridge'
list ports 'lan1'
list ports 'lan2'
list ports 'lan3'
list ports 'lan4'
# 注:如果你只有 2 个 LAN,就保留实际存在的端口
### 定义 bridge-vlans:把 LAN1 设为 trunk(tagged),其他 LAN 可不承载这些 VLAN(或留空)
config bridge-vlan
option device 'br-lan'
option vlan '10'
list ports 'lan1:t' # trunk:往R4S的这根口
# 如需在本机插线测试 untagged 出 VLAN10,可加 'lan2:u*'
config bridge-vlan
option device 'br-lan'
option vlan '20'
list ports 'lan1:t'
config bridge-vlan
option device 'br-lan'
option vlan '30'
list ports 'lan1:t'
### 给 AP(无线)侧各建一个不带 IP 的接口(桥到对应 VLAN)
config interface 'ap1_vlan10'
option device 'br-lan.10'
option proto 'none' # Unmanaged,不分配IP
config interface 'ap2_vlan20'
option device 'br-lan.20'
option proto 'none'
config interface 'ap3_vlan30'
option device 'br-lan.30'
option proto 'none'
说明:
br-lan.10/20/30
是桥上的 VLAN 子接口。ap*_vlan*
接口用proto none
(Unmanaged),只做二层桥接,不跑 IP。- LAN1 是接 R4S 的干道口(tagged 10/20/30)。你也可以换成 WAN 口,但需要把 WAN 并入
br-lan
,不建议新手这么做。
b): /etc/config/wireless
config wifi-device 'radio0'
option type 'mac80211'
option path 'pci/.../wifi0' # 系统自动生成的就行
option band '5g'
option htmode 'HE80'
option channel 'auto'
option country 'US' # 按需修改法规域
### AP1 → 绑到 VLAN10
config wifi-iface
option device 'radio0'
option mode 'ap'
option ssid 'AP1-UK'
option network 'ap1_vlan10'
option encryption 'psk2'
option key 'yourpassword1'
option isolate '1' # 客户端隔离可选
### AP2 → 绑到 VLAN20
config wifi-iface
option device 'radio0'
option mode 'ap'
option ssid 'AP2-US'
option network 'ap2_vlan20'
option encryption 'psk2'
option key 'yourpassword2'
option isolate '1'
### AP3 → 绑到 VLAN30
config wifi-iface
option device 'radio0'
option mode 'ap'
option ssid 'AP3-DE'
option network 'ap3_vlan30'
option encryption 'psk2'
option key 'yourpassword3'
option isolate '1'
c): /etc/config/dhcp
(关闭本机 DHCP)
config dhcp 'lan'
option interface 'lan'
option ignore '1' # 不在AP上发DHCP
# 可把其它段都忽略
config dhcp 'ap1_vlan10'
option interface 'ap1_vlan10'
option ignore '1'
config dhcp 'ap2_vlan20'
option interface 'ap2_vlan20'
option ignore '1'
config dhcp 'ap3_vlan30'
option interface 'ap3_vlan30'
option ignore '1'
d): /etc/config/firewall
# 作为纯AP,最简单是把防火墙功能整体关掉,或全部接口并入lan,仅作二层桥
config defaults
option syn_flood '1'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'ACCEPT'
# 清理 wan/masquerade/NAT 等(或直接停用 firewall 服务)
5, 与 R4S 的对接(一定要对应一致)
你之前在 R4S 上已经创建了:eth1.10
(英国)、eth1.20
(美国)、eth1.30
(德国),并在 Passwall 里按接口分流。
小米这边 trunk 口(lan1:t) 就要接到 R4S 的 eth1。
VLAN ID 必须一一对应:
- 小米
AP1 → VLAN 10
↔ R4Seth1.10
- 小米
AP2 → VLAN 20
↔ R4Seth1.20
- 小米
AP3 → VLAN 30
↔ R4Seth1.30
6, 应用与排错
应用配置:
/etc/init.d/network restart
wifi reload
# 或重启整机
常见排错:
- 连接不上某个 SSID → 检查该 SSID 绑定的
network
是否是对应的br-lan.XX/eth0.XX
。 - 终端拿不到 IP → 确认 DHCP 在 R4S 或你指定的地方开启(本机 AP 侧应关闭)。
- VLAN 不通 → 核对干道口两端是否都为 tagged 同一 VLAN ID。
- 只能上默认出口 → 看 R4S 的 Passwall 是否已按 接口/Zone 绑定节点,并允许该 VLAN 接口通过。