Skip to content

快速入门

yinheli edited this page Feb 20, 2023 · 7 revisions

kungfu 是一个基于 DNS 劫持/静态路由的透明代理,可用它实现不限于广告屏蔽,统一 hosts 配置,代理分流等。基于 RUST 实现,性能更好,内存占用更低。

📣 注意!未经同意请勿在论坛、知乎、小红书、自媒体、vlog 上宣传本项目,自行取用即可。🙏

部署准备:在内网准备好一台服务器用于运行 kungfu,以下假设该服务器内网 ip 为 10.0.1.3,其中 kungfu 配置的 network 为 10.99.0.1/16

DHCP

修改 DHCP,设置其下发的 DNS 服务器为 10.0.1.3

静态路由

在三层或者路由器等设备上添加静态路由,配置 10.99.0.1/16 下一跳为 10.0.1.3

服务器 (kungfu)

开启转发

vi /etc/sysctl.conf
net.ipv4.ip_forward=1

# 可选
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_tw_recycle=1

应用规则

sysctl -p

参数和规则配置,参考

config.yml

# default 53
dns_port: 53

# upstream DNS servers
# 设置上游 DNS 服务器,一般填写供应商的,2个足够,不建议太多
# 未命中本地缓存时,并发向上游发起转发查询请求
# 如有其它加速需求,推荐 smartdns https://github.com/pymumu/smartdns
dns_upstream:
  - 1.2.4.8
  - 114.114.114.114

# hijack address pool
# 匹配规则的域名都将劫持到该网段
network: 10.99.0.1/16

# 后端代理服务,目前仅支持 socks5,不支持健康检查,
# 如有需要建议配合 haproxy 做负载和健康检查
# 推荐 v2ray、trojan、hysteria 等
# 名称要唯一,规则的 target 需要用
proxy:
  - name: hk
    values:
      - socks5://127.0.0.1:1082
  - name: jp
    values:
      - socks5://127.0.0.1:1084

# prometheus metrics
# optional
# 如有监控统计需求,可以开启
metrics: 0.0.0.0:6080

如有监控,可导入 grafana dashboard https://grafana.com/grafana/dashboards/16998-kungfu/

规则

规则可以拆分到多个文件,方便管理

# 静态路由规则,仅启动时加载
# 并且需要在三层或者路由器等设备上添加静态路由,下一跳到 kungfu 所在服务器
# 较少使用,下面的范例配置的是 telegram 的 CIDR
# static routes
# static routes is not enable to hot reload
- type: route
  target: hk
  values:
    - 149.154.160.0/20
    - 149.154.167.0/24
    - 149.154.164.0/22
    - 109.239.140.0/24
    - 91.108.56.0/22
    - 91.108.4.0/22
    - 91.108.8.0/22
# 域名规则,使用 glob 表达式
# 支持动态加载
# domain pattern base glob
- type: domain
  target: hk
  values:
    - "*google.com"
    - "*facebook.com"
# 上游 DNS A 记录查询 CIDR 匹配
# 用于批量处理一些相对固定的 IP 段,避免独立配置域名匹配规则
# 支持动态加载
# upstream CIDR match
- type: dnsCidr
  target: hk
  values:
    # cname to github.io
    # 一些开源项目文档托管在 github.io
    - 185.199.110.153/32
    - 185.199.111.153/32
    - 185.199.109.153/32

    # cloudflare
    # refer: https://www.cloudflare.com/zh-cn/ips/
    - 173.245.48.0/20
    - 103.21.244.0/22
    - 103.22.200.0/22
    - 103.31.4.0/22
    - 141.101.64.0/18
    - 108.162.192.0/18
    - 190.93.240.0/20
    - 188.114.96.0/20
    - 197.234.240.0/22
    - 198.41.128.0/17
    - 162.158.0.0/15
    - 104.16.0.0/13
    - 104.24.0.0/14
    - 172.64.0.0/13
    - 131.0.72.0/22

hosts 是个特殊规则文件,是增强版的 hosts 配置文件 (支持动态加载)

# 常规使用,和系统的 hosts 一样
192.168.1.20                  my-app.com

# 目标地址为 CDN / cname 方便开发调试
# 注意:别名/cname 模式不支持递归自己
cdn.my-app.com.a.bdydns.com.  cdn.my-app.com

# 用 glob 匹配域名到指定地址
192.168.8.20                  *-dev.app.com  *-dev-20.app.com

# 屏蔽广告等
127.0.0.1       ad.example.com

辅助配置工具

https://github.com/yinheli/har-analyzer

通过浏览器导出 HAR 配置文件,方便找出配置域名规则

验证测试

完成配置,启动好服务后,使用 dig & traceroute & ping 测试配置是否正确

使用 dig 测试 DNS 服务器配置是否正确

dig google.com

应该看到响应的服务应该为 kungfu 部署的服务, 响应的 A 记录为期望的配置的劫持网段, kungfu 还会额外的输出 TXT 响应,说明匹配的规则情况

; <<>> DiG 9.10.6 <<>> dig google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36406
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;dig.				IN	A

;; Query time: 66 msec
;; SERVER: 10.0.1.3#53(10.0.1.3)
;; WHEN: Sat Sep 17 17:21:52 CST 2022
;; MSG SIZE  rcvd: 21

;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23883
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;google.com.			IN	A

;; ANSWER SECTION:
google.com.		10	IN	A	10.99.0.75
google.com.		10	IN	TXT	"rule:Domain, value:*google*, target:gfw"

;; Query time: 3 msec
;; SERVER: 10.0.1.3#53(10.0.1.3)
;; WHEN: Sat Sep 17 17:21:52 CST 2022
;; MSG SIZE  rcvd: 96

使用 traceroute & ping 测试网络可达性,如果有问题请检查静态路由规则及防火墙设置

traceroute -n google.com
traceroute to google.com (10.99.0.75), 64 hops max, 52 byte packets
 1  10.0.1.1  3.642 ms  1.909 ms  1.947 ms
 2  10.0.1.3  3.588 ms  3.213 ms  2.956 ms
 3  10.99.0.75  287.070 ms  4.367 ms  3.402 ms
ping google.com
PING google.com (10.99.0.75) 56(84) bytes of data.
64 bytes from 10.99.0.75: icmp_seq=1 ttl=64 time=0.116 ms
64 bytes from 10.99.0.75: icmp_seq=2 ttl=64 time=0.230 ms
64 bytes from 10.99.0.75: icmp_seq=3 ttl=64 time=0.101 ms
64 bytes from 10.99.0.75: icmp_seq=4 ttl=64 time=0.300 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 0.101/0.186/0.300/0.082 ms

haproxy

vi /etc/haproxy/haproxy.cfg
global
  ulimit-n  51200
  log /dev/log local0
  log /dev/log local1 notice
  chroot /var/lib/haproxy
  pidfile /var/run/haproxy.pid
  #user haproxy
  #group haproxy
  stats socket /var/lib/haproxy/stats
  maxconn   8000
  daemon

defaults
  log global
  mode    tcp
  option  dontlognull
  timeout connect 2s
  timeout client 30s
  timeout server 30s
  timeout check 3s
  maxconn   1000

listen proxy
  bind :1080
  mode tcp

  # 用 socks5 检查后端,发起一个 GET google.com 的查询,如果收到的响应含有 HTTP 字样,则认为成功
  option tcp-check
  tcp-check connect
  tcp-check send-binary 05020001
  tcp-check expect binary 0500
  tcp-check send-binary 050100030a676f6f676c652e636f6d0050
  tcp-check expect binary 05000001
  tcp-check send GET\ /\ HTTP/1.1\r\n
  tcp-check send Host:\ google.com\r\n
  tcp-check send Accept:\ */*\r\n
  tcp-check send \r\n
  tcp-check expect rstring ^HTTP

  balance roundrobin

  # 配置后端,一般是 v2ray,hysteria 提供的 socks5 代理
  server local-1 127.0.0.1:2081 maxconn 500 check inter 60s fall 2 rise 1 weight 2
  server local-2 127.0.0.1:2082 maxconn 500 check inter 60s fall 2 rise 1 weight 1
  server local-3 127.0.0.1:2083 maxconn 500 check inter 60s fall 2 rise 1 weight 5

listen stats
  bind :18080
  mode http
  stats uri /

资源

Clone this wiki locally