-
Notifications
You must be signed in to change notification settings - Fork 10
快速入门
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,设置其下发的 DNS 服务器为 10.0.1.3
在三层或者路由器等设备上添加静态路由,配置 10.99.0.1/16
下一跳为 10.0.1.3
开启转发
vi /etc/sysctl.conf
net.ipv4.ip_forward=1
# 可选
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_tw_recycle=1
应用规则
sysctl -p
参数和规则配置,参考
# 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
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 /