Last Regrets

更加高性能的代理程序

· sdttttt

在OpenWrt社区逛的时候又发现了一些宝贝。

https://github.com/daeuniverse/dae

DAE(鹅)又是一个代理程序,不过它是透明代理,可以理解成全局代理,所有流量都会经过该软件。

DAE的特色是使用上了eBPF技术。

  • eBPF 是 extended Berkeley Packet Filter 的缩写,它是一种内核技术,允许开发人员在不修改内核代码的情况下运行特定的功能。eBPF 的概念源自于 Berkeley Packet Filter(BPF),后者是由贝尔实验室开发的一种网络过滤器,可以捕获和过滤网络数据包。

其实用最简单的话来说就是内核插件技术。

Untitled

这张图是DAE对比目前其他流行代理程序的吞吐量。在代理环境中其实没有什么区别。主要区别其实是在直连的吞吐量上,领先了其他程序有20倍左右,非常夸张。


今天用上了DAE这个玩意,不得不说这玩意的性能确实够得劲,以前openwrt一分钟内的负载1-2 左右,换了之后负载直接掉到0.5以下了, 基本在0.1-0.3左右。

分流功能也有,比较可惜的是面板功能不够多,以及这个玩意手动切换节点也比较繁琐,目前只有自动换更节点的策略,不过目前还是能凑合着用。

下面我的配置:

pname(NetworkManager, systemd-resolved, dnsmasq) -> must_direct
pname(mosdns) -> must_rules # mosdns 的DNS流量不要走DAE

# 所有UDP流量走直连除了DNS和Quic
l4proto(udp) && !dport(53, 443) -> direct

# ipv6 走直连代理不支持
ipversion(6) -> direct

# 局域网内广播防止被代理转发
dip(224.0.0.0/3, 'ff00::/8') -> direct

# qbittorrent 传入链接端口
sport(33915) -> direct
# DSCP规则匹配 DSCP可用于绕过 BT), https://github.com/daeuniverse/dae/discussions/295
dscp(4) -> direct

# https://github.com/daeuniverse/dae/discussions/298  Apple 设备未收到 Apple 推送通知
dip(17.0.0.0/8) -> direct

# 目标非常用端口都走直连避免BT流量走代理
!dport(21,23,53,80,123,143,194,443,465,587,853,993,995,998) -> direct

mac("c8:bf:4c:3e:d1:bc") -> direct
# nintendo switch
mac("98:41:5c:20:54:db") -> direct
# 树莓派
mac("f2:db:f0:bd:02:5d") -> direct

# 一些域名
domain(keyword: 'syncthing.net') -> direct
domain(keyword: 'picacomic') -> direct
domain(keyword: 'mangacopy') -> direct
domain(keyword: 'tr.nyacat') -> direct
domain(keyword: 'tracker') -> direct
domain(keyword: 'ghproxy') -> direct
domain(keyword: 'gh-proxy') -> direct
domain(keyword: 'fgit') -> direct
domain(keyword: 'jsdelivr') -> direct
domain(keyword: 'nintendo') -> direct
domain(keyword: 'fanqiev2') -> direct
domain(keyword: 'announce') -> direct
domain(keyword: 'torrent') -> direct

# 阻断广告连接
domain(ext:'geosite.dat:category-ads') -> block

# 国内网站
domain(ext:'geosite.dat:category-games') -> direct
domain(ext:'geosite.dat:category-game-accelerator-cn') -> direct
domain(ext:'geosite.dat:alibaba') -> direct
domain(ext:'geosite.dat:bilibili') -> direct
domain(ext:'geosite.dat:bilibili2') -> direct
domain(ext:'geosite.dat:tencent') -> direct
domain(ext:'geosite.dat:zhihu') -> direct
domain(ext:'geosite.dat:cloudflare') -> direct
domain(ext:'geosite.dat:cloudflare-cn') -> direct
domain(ext:'geosite.dat:category-scholar-cn') -> direct
domain(ext:'geosite.dat:category-media-cn') -> direct
domain(ext:'geosite.dat:category-social-media-cn') -> direct
domain(ext:'geosite.dat:category-dev-cn') -> direct
domain(ext:'geosite.dat:category-bank-cn') -> direct
domain(ext:'geosite.dat:category-public-tracker') -> direct
domain(ext:'geosite.dat:mozilla') -> direct
domain(ext:'geosite.dat:picacg') -> direct
domain(ext:'geosite.dat:apple') -> direct
domain(ext:'geosite.dat:apple-cn') -> direct
domain(ext:'geosite.dat:icloud') -> direct
domain(ext:'geosite.dat:icloudprivaterelay') -> direct
domain(ext:'geosite.dat:nintendo') -> direct
domain(ext:'geosite.dat:speedtest') -> direct
domain(ext:'geosite.dat:cn') -> direct
domain(ext:'geosite.dat:china-list') -> direct
domain(ext:'geosite.dat:geolocation-cn') -> direct
domain(ext:'geosite.dat:private') -> direct

domain(suffix: 'windows.com') -> direct

dip(ext:'geoip.dat:private') -> direct
dip(ext:'geoip.dat:cn') -> direct

fallback: proxy

DNS配合mosdns使用:

upstream {
  cndns: 'udp://127.0.0.1:6553'
  falldns: 'udp://127.0.0.1:6554'
}

routing {
  request {
    qname(ext:'geosite.dat:category-ads') -> reject
    qname(ext:'geosite.dat:category-ads-all') -> reject
    fallback: cndns
  }

  response {
            # 值得信赖的国外DNS
            upstream(falldns) -> accept
            # 可能被污染走一遍国外DNS
            ip(geoip:private) && !qname(geosite:cn) -> falldns
						# 有些固件在DAE拦截DNS后还能正常解析主机名但是有些固件就不行这里过滤.lan主机名后缀
						# ip(geoip:private) && !qname(geosite:cn) && !qname(keyword: ".lan") -> falldns
            # 总是同意
            fallback: accept
  }
}