标签 iptables 下的文章

前言

在之前的文章中,我们花了大量的篇幅,从记录后端pod真实ip开始说起,然后引入envoy,再解决了各种各样的需求:配置自动重载、流量劫持、sidecar自动注入,到envoy的各种能力:熔断、流控、分流、透明代理、可观测性等等,已经可以支撑起一个完整的服务治理框架了

而今天介绍的istio,正是前面提到的这些所有功能的集大成者,从本文开始,我们将详细介绍istio,并且与之前手搓的功能做一个详细的对比,为大家以后选择服务治理的某个功能提供参考

istio架构

           ┌──────────────┐
           │   istiod     │   ← 控制面
           │ (Pilot+CA)   │
           └──────┬───────┘
                  │ xDS (gRPC / TLS)
                  │
┌────────────┐    │    ┌────────────┐
│  Envoy     │◄───┼───►│   Envoy    │  ← 数据面
│ (Sidecar)  │         │ (Sidecar)  │
└─────▲──────┘         └─────▲──────┘
      │ iptables             │
      │                      │
   App Pod                App Pod
  • 数据面就是之前一直在研究的envoy,包括4/7代理、熔断、限流、可观测性等等,envoy就是执行由控制面下发的配置
  • 控制面istiod主要的职责:将配置下发到每一个envoy去。由于istio中配置以crd的形式成为了k8s的资源,所以要不断的监听k8s apiserver,将资源的变化翻译成envoy看得懂的配置,并且下发到envoy去

至于其余istio的资源,我们后面详细介绍

istio安装

不说废话,先把istio安装上去再说

首先准备好k8s集群,其次下载istio(这一步有可能需要上网)

curl -L https://istio.io/downloadIstio | sh -
cd istio-*
sudo ln -s $PWD/istioctl /usr/local/bin/istioctl

验证兼容性

istioctl x precheck

开始安装

istioctl install --set profile=default -y

由于镜像仓库没法直接使用,所以需要一些特殊的方法,具体可以看这篇文章: 快速拉取docker镜像

需要的镜像有:

docker.io/istio/pilot:1.28.2
docker.io/istio/proxyv2:1.28.2

安装完成:

▶ kubectl -n istio-system get pod
NAME                                    READY   STATUS    RESTARTS   AGE
istio-ingressgateway-865c448856-qs8s2   1/1     Running   0          8s
istiod-86c75775bb-j7qbg                 1/1     Running   0          12s

安装完成,要从哪儿开始呢?

istio的自动注入

kubectl label namespace default istio-injection=enabled

同之前envoy一样,给namespace打上标签之后,重启服务即可

kubectl rollout restart deploy nginx-test

重启之后sidecar已经注入进去了,我们来观察一下istio注入到底做了什么事情

先describe看看events

Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  8s    default-scheduler  Successfully assigned default/nginx-test-6f855b9bb9-9phsv to wilson
  Normal  Pulled     8s    kubelet            Container image "docker.io/istio/proxyv2:1.28.2" already present on machine
  Normal  Created    8s    kubelet            Created container: istio-init
  Normal  Started    8s    kubelet            Started container istio-init
  Normal  Pulled     8s    kubelet            Container image "docker.io/istio/proxyv2:1.28.2" already present on machine
  Normal  Created    8s    kubelet            Created container: istio-proxy
  Normal  Started    8s    kubelet            Started container istio-proxy
  Normal  Pulled     6s    kubelet            Container image "registry.cn-beijing.aliyuncs.com/wilsonchai/nginx:latest" already present on machine
  Normal  Created    6s    kubelet            Created container: nginx-test
  Normal  Started    5s    kubelet            Started container nginx-test

1个initContainer,1个业务container和1个sidecar

其中initContainer:

Init Containers:
  istio-init:
    Container ID:  containerd://2bf56cd37703d82a2a43e94e8c8d683ed66b0afe22bf7148a597d67b89a727a8
    Image:         docker.io/istio/proxyv2:1.28.2
    Image ID:      docker.m.daocloud.io/istio/proxyv2@sha256:39065152d6bd3e7fbf6bb04be43c7a8bbd16b5c7181c84e3d78fa164a945ae7f
    Port:          <none>
    Host Port:     <none>
    Args:
      istio-iptables
      -p
      15001
      -z
      15006
      -u
      1337
      -m
      REDIRECT
      -i
      *
      -x

      -b
      *
      -d
      15090,15021,15020
      --log_output_level=default:info
...

和之前envoy中劫持流量的做法一样,istio依然是使用iptables将端口流量导入到代理之中处理

尝试访问一下:

▶ curl 10.22.12.178:30785/test
i am backend in backend-6d76f54494-g6srz

成功,再次查看istio-proxy日志。空的?为了调试方便,将其打开并且输出至控制台

kubectl -n istio-system edit cm istio

apiVersion: v1
data:
  mesh: |-
    accessLogFile: /dev/stdout
  ...

至此,istio的第一个功能探索完毕,自动注入sidecar container并且完成了流量劫持

Upgrade Required 426 的问题

当前的架构是左图,现在要前进到右图

watermarked-istio_1.png

其实就是在backend注入istio-proxy,直接重启就好

▶ kubectl get pod -owide
NAME                          READY   STATUS        RESTARTS   AGE     IP            NODE     NOMINATED NODE   READINESS GATES
backend-5d4d7b598c-f7852      2/2     Running       0          13s     10.244.0.49   wilson   <none>           <none>
nginx-test-6f855b9bb9-9phsv   2/2     Running       0          58m     10.244.0.48   wilson   <none>           <none>

注入完成,测试一下

▶ curl 10.22.12.178:30785/test
Upgrade Required
▶ kubectl logs -f -l app=nginx-test -c istio-proxy
[2026-01-26T07:54:42.977Z] "GET /test HTTP/1.1" 426 - upstream=10.244.0.48:80 duration=6ms route=default
[2026-01-26T07:54:42.978Z] "- - -" 0 - upstream=10.105.148.194:10000 duration=9ms route=-

在nginx注入istio-proxy,backend没有注入的时候并没有报错。而一旦nginx与backend都注入的时候就会出现Upgrade Required (426)错误,Nginx Sidecar 发现目标(Backend)是一个纯文本服务,它会回退到“透明代理”模式,简单地把 Nginx 发出的流量透传出去

Nginx Sidecar 发现目标也有 Sidecar,它会尝试建立一个高度优化的、基于 mTLS 的隧道(关于mTLS后面会详细介绍)。如果此时 Nginx 发出的请求头(比如缺少 Host 字段,或者使用了 HTTP/1.0)不符合 Envoy 对这种隧道
协议的预期,Envoy 可能会向 Nginx 发送一个特殊的响应,或者 Nginx 在尝试通过这种隧道通信时,因为某些 Header 冲突(如 Connection: close)自发产生了 426 错误

想要解决这个问题有两种方法

改造nginx中加入标记

        location /test {
            proxy_http_version 1.1; # 必须添加这一行
            proxy_set_header Host $host; # 这一行也是必须的
            proxy_pass http://backend_ups;
        }

Nginx 的 proxy_pass 默认使用 HTTP/1.0。在 Istio 环境中,HTTP/1.0 不支持长连接(Keep-Alive)以及一些现代的协议协商,这与 Istio Sidecar(Envoy)默认的 L7 代理行为冲突,Istio 需要 HTTP/1.1 来支持复杂连接管理问题

改造backend service

如果nginx改造有难度,那也可以尝试改造backend-service

apiVersion: v1
kind: Service
metadata:
  name: backend-service
  namespace: default
spec:
  ports:
  - name: tcp-80 # 原为 http-80 改为 tcp-80
    port: 10000
    protocol: TCP
    targetPort: 10000
  selector:
    app: backend

Istio 只有在识别到流量是 HTTP 时才会进行深度的协议检查和转换。如果你把这个服务声明为 TCP,Istio 就会将其视为原始字节流进行透传,不再关心它是 HTTP/1.0 还是 1.1。优点就是彻底解决 426 问题,无需改 Nginx。
缺点则是你会失去 Istio 针对该服务的 HTTP 监控指标(如请求数、4xx/5xx 统计)、分布式追踪以及基于路径的路由功能

http 1.0 与 http 1.1

这里再简单介绍一下两个协议版本的区别

  • 连接管理(最显著的区别)

    • HTTP 1.0:短连接 (Short-lived),默认情况下,客户端每发起一个请求,都要与服务器建立一次 TCP 三次握手。请求结束并收到响应后,TCP 连接立即关闭。如果页面有 10 张图片,浏览器就要建立 10 次 TCP 连接。这带来了极高的延迟和资源开销。
    • HTTP 1.1:持久连接 (Persistent Connection / Keep-Alive)。默认开启 Connection: keep-alive。一个 TCP 连接可以被多个请求复用。只有在明确声明 Connection: close 或连接超时后才会关闭。
    • 在 Istio 中: Envoy 极度依赖持久连接来维持高性能的 Sidecar 间隧道。HTTP 1.0 的频繁断开会让 Envoy 感到“压力山大”,甚至认为这是一种非标准的协议行为。
  • Host Header

    • HTTP 1.0:人们认为一个 IP 对应一个网站,所以请求头里不需要带域名信息。
    • HTTP 1.1:随着虚拟主机(一个 IP 跑多个网站)的流行,HTTP 1.1 规定请求头必须包含 Host 字段。
    • 在 K8s/Istio 中: Istio 的路由决策、Service 的匹配完全依赖 Host 头。这也是为什么 Nginx 使用 HTTP 1.0 转发时,如果不手动补全 Host 头,后端往往会返回 404 或协议错误。

以上是istio必须要求HTTP 1.1最主要的两个因素,当然还有其他非常重要的区别

特性HTTP 1.0HTTP 1.1
连接模型默认短连接,每次请求新开 TCP默认持久连接 (Keep-Alive),复用 TCP
Host 头部可选 (导致无法支持虚拟主机)必须 (支持一 IP 多域名)
流水线 (Pipelining)不支持支持 (但在实际应用中受限)
断点续传不支持支持 (通过 Range 头部)
缓存控制简单 (Expires)复杂且强大 (Cache-Control, ETag)
默认协议版本许多旧软件(如 Nginx proxy)的默认值现代 Web 应用的基石标准

小结

本章内容算是一个开胃小菜,成功安装了istio,并且解决了一个非常常见的426问题,至于怎么把之前在envoy的那些最佳实践搬迁到istio,那就是后面的内容了,敬请期待

后记

如果整个namespace都已经有了注入标签istio-injection=enabled,但是某个deployment不想让istio注入

kubectl patch deployment nginx -p '{"spec":{"template":{"metadata":{"annotations":{"sidecar.istio.io/inject":"false"}}}}}'

联系我

  • 联系我,做深入的交流


至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...

使用前提:
有域名,1panel 面板,debian 系统

我是小主机安装的 debian,想实现局域网内访问和外网使用泛域名访问
因为自带的映射一次只能设置一个 ip,而且 1panel 自带的防火墙和 DOCKER-USER 链平级,无法直接在 1panel 里设置防火墙影响容器端口的开放

教程开始:
前置 配置泛域名的方法

这两天在更新

第一步 查询当前 docker 使用 iptables 版本

echo "------ 账本 A: iptables-legacy (旧版) ------"
iptables-legacy -t nat -S DOCKER 2>/dev/null || echo "Legacy 中没有 DOCKER 链" echo "" echo "------ 账本 B: iptables-nft (新版/默认) ------"
iptables-nft -t nat -S DOCKER 2>/dev/null || echo "NFT 中没有 DOCKER 链" 

需要 debian 系统和 docker 使用同一版本,debian 新版基本上是 nft

第二步 添加 ipv6 和 ipv4 规程
局域网网段请自行更改
1panel 面板自带的反向代理是容器运行,所以需要额外开放 80 和 443
ipv4:

# 清空现有规则,重新排列
iptables -F DOCKER-USER

# 1. 基础规则:允许已建立连接、本机、局域网
iptables -A DOCKER-USER -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A DOCKER-USER -i lo -j ACCEPT
iptables -A DOCKER-USER -s 192.168.5.0/24 -j ACCEPT

# 2. 【新增】特赦反向代理端口 (允许外网访问 Docker 的 80443)
# 只有这样,外网流量才能到达你的 Nginx 容器
iptables -A DOCKER-USER -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A DOCKER-USER -p tcp -m tcp --dport 443 -j ACCEPT

# 3. 拒绝外网网卡的其他所有流量
# (把 enp1s0 换成你的实际网卡名,如果不确定就用 ! -i lo 表示非回环)
iptables -A DOCKER-USER -i enp1s0 -j DROP

# 4. 默认返回
iptables -A DOCKER-USER -j RETURN

ipv6:

ip6tables -F DOCKER-USER

# 1. 基础规则
ip6tables -A DOCKER-USER -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -A DOCKER-USER -i lo -j ACCEPT
ip6tables -A DOCKER-USER -s fe80::/10 -j ACCEPT

# 2. 【新增】特赦 IPv6 下的 80443
ip6tables -A DOCKER-USER -p tcp -m tcp --dport 80 -j ACCEPT
ip6tables -A DOCKER-USER -p tcp -m tcp --dport 443 -j ACCEPT

# 3. 拒绝外网网卡的其他 IPv6 流量
ip6tables -A DOCKER-USER -i enp1s0 -j DROP

# 4. 默认返回
ip6tables -A DOCKER-USER -j RETURN 

完成后再次测试即可


📌 转载信息
原作者:
ak7876
转载时间:
2026/1/20 17:39:49

设置 tls

设置 ALPN 为 H3, 勾选允许不安全 , 证书点击钥匙一键生成

设置入站

混淆密码应该也可以不开,上传和下载根据自己的机器带宽填写

用户管理

勾选入站标签

端口跳跃

这里搞了好久,s-ui 没有自带的功能,更具 hy2 的官方文档,其实就是利用防火墙转发端口
这里使用 iptables,注意网卡和端口

# IPv4
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j REDIRECT --to-ports 8443
# IPv6
ip6tables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j REDIRECT --to-ports 8443

这里设置完可以测试一下,点击二维码可以复制链接


大概长这样

hysteria2://30WPksjA@机器IP:8443?security=tls&insecure=1&alpn=h3&obfs=salamander&obfs-password=dfh8ggd&fastopen=0&downmbps=100&upmbps=100#hysteria2-0 

需要在 8443 端口后面加上我们跳跃的端口,根据上面是 20000-50000 端口

hysteria2://30WPksjA@机器IP:8443,20000-50000?security=tls&insecure=1&alpn=h3&obfs=salamander&obfs-password=dfh8ggd&fastopen=0&downmbps=100&upmbps=100#hysteria2-0 

把这个链接拿去测试没问题,最后一步保存 iptables 的规则,目前是保存在内存重启就失效了

apt install iptables-persistent -y

安装过程中会弹出蓝色界面,询问是否保存当前的 IPv4 和 IPv6 规则,选择 Yes
到此教程全部结束,自己琢磨的有更好的方法欢迎佬友指出


📌 转载信息
原作者:
Echoliu
转载时间:
2026/1/7 19:05:05

主要使用到的是 chinadns-ng


可能有人以前用过,后面改过一次分流配置写法。并且引入了 ipset/nftset ,所以有人就搞不明白了。
现在我带大伙看看这个项目到底如何使用。


首先看一下下载哪个版本。
打开下载页面后 Releases · zfl9/chinadns-ng · GitHub
按 F12 点击我圈的地方,把 878 改成 1300。
这样就能把文件名完整的显示出来

按 Ctrl+F 搜索你需要的 CPU 架构。
本文以我自己的路由器为例,我的路由器是 ARM 的,我就直接搜 arm,如果你是 x86 的软路由,你就搜软路由。
chinadns-ng+wolfssl 开头的版本支持 DoT 上游
wolfssl 已启用硬件加速指令

因为我的上游还有 smartdns 和 AdGuard 的本地 dns,所以我不需要 DoT 功能
我直接选择的 chinadns-ng@arm-linux-musleabihf@generic+v7a@fast+lto


chinadns-ng 配置示例

chinadns-ng 一共可以定义两组 DNS 上游
china 组 (大陆 DNS)、trust 组 (国外 DNS)

chinadns-ng 一共有 3 种运行模式
1.chnlist 分流
他会读取你的 chnlist.txt 里的域名,这里面的域名代表是国内的域名,你的所有查询,如果命中了里面的域名。则会直接交给 china 组 (大陆 DNS) 上游进行查询,没有匹配上的走 trust 组 (国外 DNS)
下面的是官方的解释的域名匹配逻辑,意思是,如果你查询 www.bilibili.com , 首先检查一遍 www.bilibili.com 是否在规则中,如果没有就继续查询 bilibili.com,如果再没有就继续查询 com

当然到实际的查询中,肯定会有优化,官方默认的规则里就有 11w 的域名数据。

域名匹配顺序

收到 DNS查询 时,会对域名进行最长后缀匹配。举个例子,若查询的域名为x.y.z,则匹配顺序为:
x.y.z,检查数据结构中是否存在此域名后缀。
y.z,检查数据结构中是否存在此域名后缀。
z,检查数据结构中是否存在此域名后缀。

2.gfwlist 分流
跟 chnlist 分流相反,需要一个 gfwlist.txt 文件,里面的域名走 trust 组 (国外 DNS) 组,剩下的全部交由 china 组 (大陆 DNS)
3. chnroute 分流
这个模式需要 chnlist.txt 和 gfwlist.txt 两个文件。运作逻辑也和上述两个方案一样,匹配上 chnlist.txt 走 china 组 (大陆 DNS),匹配上 gfwlist.txt 的走 trust 组 (国外 DNS)

不同的是,剩下没有匹配上的域名,他同时向国内和国外两个 DNS 组发起请求,如果 china 上游返回国内 IP,则接受其结果,否则采纳 trust 结果
因此,为了判断 IP 归属,必须要有中国 IP 的 IP 段。
在 chinadns-ng 的官方配置示例中,chnroute 分流模式下,使用了如下的配置

ipset-name4 chnroute  #iptables
ipset-name6 chnroute6  #iptables 

chnroute 代表的是中国 IPv4 的集合名,chnroute6 代表的是中国 IPv6 的集合名

chinadns-ng 默认不会帮我们把中国 IP 全都导入到这个集合中
我们需要先到 chinadns-ng/res at master · zfl9/chinadns-ng · GitHub 中下载 IP 规则集合(当然作者为我们写好了 update-xxx.sh,名字对应的就是下载的文件)
chinadns-ng 是使用 iptablesnftables 来查询 IP 知否命中 IP 规则集,所以我们需要根据你路由器所使用的防火墙来选择,选错了则无法正常导入 IP 集合,你需要借助 AI 或者固件里写的信息,来判断。
我的路由器比较老,用的还是 iptables
xxx.ipset 结尾的为 iptables,xxx.nftset 结尾的为 nftables。6 代表 ipv6

下载后,官方给出了导入 IP 库的命令,res/chnroute.ipset 为你上面下载的 IP 文件的路径

# ipset (chnroute, chnroute6)
ipset -R <res/chnroute.ipset
ipset -R <res/chnroute6.ipset

# nftset (inet@global@chnroute, inet@global@chnroute6)
nft -f res/chnroute.nftset
nft -f res/chnroute6.nftset

# 只需导入一次,除非对应集合已从内核移除(比如重启了) 

如何更新 IP 库

# ipset (chnroute, chnroute6) https://github.com/zfl9/chinadns-ng?tab=readme-ov-file#%E5%A6%82%E4%BD%95%E6%9B%B4%E6%96%B0-chnrouteipsetchnroute6ipset # nftset (inet@global@chnroute, inet@global@chnroute6) https://github.com/zfl9/chinadns-ng?tab=readme-ov-file#%E5%A6%82%E4%BD%95%E6%9B%B4%E6%96%B0-chnroutenftsetchnroute6nftset 

特别注意,官方配置中为 iptables 配置示例,如果你使用的是 nftables 需要更改写法

ipset-name4 chnroute  #iptables
ipset-name6 chnroute6  #iptables 
ipset-name4 inet@global@chnroute #nftables
ipset-name6 inet@global@chnroute6 #nftables 


https://github.com/zfl9/chinadns-ng?tab=readme-ov-file#chnroute-%E5%88%86%E6%B5%81

三种模式已经介绍完了,大家可以根据自己的需求和喜好,进行选择。官方的配置示例可以在上面的网址进行查看。

不同的方式代表不同的取舍。

1. 如果你使用 chnlist 模式进行分流,那么 chnlist.txt 中势必会有一些国内域名没有包含在其中,尤其是一些小众域名很难会被收录进来。这样会导致这些域名的 CDN 返回的可能会是国外 IP(即便这下域名是有中国 IP 的节点)

2. 如果你是用 gfwlist 分流,需要保证你的 gfwlist.txt 配置保持最新,否则更新不及时,或 gfwlist.txt 收录不全,可能会查出来的是被污染的 IP。而且只要是没有在域名列表里的国外域名都会从国内 DNS 查询。

3. 如果你是用 chnroute 分流,查询出的是最精准的,但同样会导致未命中 gfwlist.txt 的域名出现 DNS 泄漏。比如 ipleak.net 等一众 DNS 泄漏检测网站,都不在域名列表里,这样 chinadns-ng 会同时向国内和国外的 DNS 上游进行请求,ipleak.net 里也会显示 DNS 泄漏。(虽然我认为 DNS 泄漏检测很不科学,但有很多人关心这个问题,我就得提一下)


下面说一下我自己使用的方案
我使用的是 chnlist 分流的保守方案。只有国内的域名会从国内的 DNS 查询

# 监听地址和端口
bind-addr ::
bind-port 53@udp # 国内上游、可信上游
china-dns 127.0.0.1#2053
trust-dns 127.0.0.1#2054 # 域名列表,用于分流
chnlist-file /etc/cng/final_cn.txt
default-tag gfw
#gfwlist-file /etc/cng/gfwlist.txt # chnlist-first # 收集 tag:chn、tag:gfw 域名的 IP (可选) #add-tagchn-ip chnip,chnip6 #add-taggfw-ip gfwip,gfwip6 # 测试 tag:none 域名的 IP (针对国内上游) #ipset-name4 inet@global@chnroute #ipset-name6 inet@global@chnroute6 # dns 缓存
cache 0 #cache-stale 86400 #cache-refresh 20 # verdict 缓存 (用于 tag:none 域名) #verdict-cache 65535 #verdict-cache-db /etc/cng/verdict-cache.db # 详细日志 #verbose 

china-dns 中设置的为 127.0.0.1#2053,这是我在 smartdns 上开的第一组 DNS,里面全是国内上游,监听端口为 2053。
trust-dns 中设置的为 127.0.0.1#2054,这是我在 smartdns 上开的第二组 DNS,里面全是国外上游,监听端口为 2054。

在国外上游中,我看到很多人都是指定个 8.8.8.8 或者 1.1.1.1,DNS 查询的时候会直接走 VPN 去查询。我不喜欢这样弄,而且我觉得这样抗风险太弱了,如果路由器上的节点挂掉,或者波动,会导致所有通过这条路径的查询全部超时。因为我使用的是 chnlist 模式,这条路径下不仅有像 Google 这样无法访问的域名查询,还有 cloudflare 这种国内能访问的域名查询,甚至还有一些国内视频网站的 CDN 不在 chnlist.txt 列表中,这些域名一样会挂掉。如果只是因为节点掉线 / 波动,这些国外网站就上不去了,代价过大。
所以我是自建了 DOH 直连进行查询。我的 smartdns 国外查询组里,写了 3 条,有两条是我自建的主备 DOH,另一条 fallback 是随便找的一个国外公共的 DOH。我 VPN 上做了域名分流,这些查询都是通过我的国内公网 IP 直接进行查询发送出去,不走 VPN。
自建的 DOH 查询上游是 Google 的 8.8.8.8,支持 ECS,大部分从 chinadns-ng 漏出来的国内域名走了 DOH 查询依然能查询出国内 IP。

自建的 DOH,可以看 https://linux.do/t/topic/1177430/110


其他的方法也可以用,你上游也可以使用 AdGuardHome,当然也可以直接在 china-dns 和 trust-dns 里填写 DNS 组,组内的多个上游服务器是并发查询的模式,采纳最先返回的那个结果。

# 国内上游、可信上游
china-dns 223.5.5.5,tcp://223.5.5.5,119.29.29.29,tcp://180.184.1.1
trust-dns 8.8.8.8,8.8.4.4 


上述工作都准备好后,就可以给 /opt/chinadns-ng/chinadns-ng 运行权限,运行测试了

/opt/chinadns-ng/chinadns-ng -C /opt/chinadns-ng/config

测试完成可以运行后,可以让 AI 根据你的平台写一个进程守护之类的东西扔在路由器上,就可以自己跑了。

我的路由器经常守护文件是放在 /etc/init.d/chinadns-ng

#!/bin/sh /etc/rc.common

START=150
start(){
        cd /etc/cng && (./chinadns-ng -C ./config </dev/null) >/dev/null 2>&1 &
        echo "chinadns-ng is start"
}
 
stop()
{
    killall chinadns-ng
    echo "chinadns-ng is stop"
}

我的进程守护,放在你的路由器上不一定能跑。所以你还是最好测试一下。而且我的进程守护把所有日志都扔掉了。也不一定适合你。


📌 转载信息
原作者:
Tuso
转载时间:
2026/1/3 21:13:11