在 Armbian 操作系统上使用 dae(大鹅) 搭建透明代理
今年年初,我在 Armbian 操作系统上使用 iptables 、ipset、dnsmasq + gfwlist 搭建了基于 hysteria 协议的透明代理,实现了旁路由的分流功能。其中使用了国内的 IPv4&IPv6 地址集合和被污染的域名列表,大量的命令及 iptables 数据包流向问题让很多小伙伴看起来有些有些晦涩难懂。很开心由 mzz2017 大佬开发的 dae(大鹅) 透明代理工具完美的解决了上述问题,我已经在斐讯 N1 和玩客云上测试了 dae(大鹅),目前运行稳定。这篇文章将带领大家进行 dae(大鹅)的安装和基本配置。
一、dae(大鹅)简介
dae 是一款基于 eBPF 技术的 Linux 高性能透明代理工具。而 eBPF 是一个内核技术,允许在 Linux 内核中运行程序来监控网络数据包和系统事件,但不需要修改内核代码或者重新编译内核。简而言之,它可以提供内核级别执行自定义代码的能力,可以实现各种网络和性能优化的需求。它有点类似于脚本语言,只不过它是针对内核开发者的。
项目地址:https://github.com/daeuniverse/dae
二、安装环境
1、Linux 内核版本需要>= 5.8,可以使用如下命令查询:
root@onecloud:~# uname -r 6.6.29-current-meson
2、dae 需要以下内核选项,可以使用如下命令查询:
root@onecloud:~# (zcat /proc/config.gz || cat /boot/{config,config-$(uname -r)}) | grep -E 'CONFIG_(DEBUG_INFO|DEBUG_INFO_BTF|KPROBES|KPROBE_EVENTS|BPF|BPF_SYSCALL|BPF_JIT|BPF_STREAM_PARSER|NET_CLS_ACT|NET_SCH_INGRESS|NET_INGRESS|NET_EGRESS|NET_CLS_BPF|BPF_EVENTS|CGROUPS)=|# CONFIG_DEBUG_INFO_REDUCED is not set' CONFIG_BPF=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y CONFIG_CGROUPS=y CONFIG_KPROBES=y CONFIG_NET_INGRESS=y CONFIG_NET_EGRESS=y CONFIG_NET_SCH_INGRESS=m CONFIG_NET_CLS_BPF=m CONFIG_NET_CLS_ACT=y CONFIG_BPF_STREAM_PARSER=y CONFIG_DEBUG_INFO=y # CONFIG_DEBUG_INFO_REDUCED is not set CONFIG_DEBUG_INFO_BTF=y CONFIG_KPROBE_EVENTS=y CONFIG_BPF_EVENTS=y
三、启用 IP 转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf echo "net.ipv6.conf.all.disable_ipv6 = 0" >> /etc/sysctl.conf echo "net.ipv6.conf.default.disable_ipv6 = 0" >> /etc/sysctl.conf echo "net.ipv6.conf.lo.disable_ipv6 = 0" >> /etc/sysctl.conf echo "net.ipv6.conf.default.use_tempaddr = 1" >> /etc/sysctl.conf echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf echo "net.ipv6.conf.default.forwarding = 1" >> /etc/sysctl.conf echo "net.ipv6.conf.all.accept_ra = 2" >> /etc/sysctl.conf echo "net.ipv6.conf.default.accept_ra = 2" >> /etc/sysctl.conf echo "net.ipv6.conf.eth0.accept_ra = 2" >> /etc/sysctl.conf sysctl -p
本站提供的玩客云固件,BPF(Berkeley Packet Filter)JIT(Just-In-Time)编译器默认没有开启。可以使用如下命令查询开启状态。如果返回值为1,说明已经开启。
root@onecloud:~# cat /proc/sys/net/core/bpf_jit_enable 1
如果返回值为0,请手动开启。
root@onecloud:~# cat /proc/sys/net/core/bpf_jit_enable 0
开启BPF(Berkeley Packet Filter)JIT(Just-In-Time)编译器。
echo "net.core.bpf_jit_enable = 1" >> /etc/sysctl.conf sysctl -p
四、下载并解压
请下载你设备对应 CPU 架构的安装包,(备注:本站提供的玩客云 dae 固件, v0.5.1正式版可以正常使用,其他较新版本尚未进行测试。)官方地址如下:
https://github.com/daeuniverse/dae/releases
# 下载 v0.5.1 正式版 wget https://mirror.ghproxy.com/https://github.com/daeuniverse/dae/releases/download/v0.5.1/dae-linux-armv7.zip # 解压 unzip -d dae dae-linux-armv7.zip cd dae
五、配置安装
1、配置文件
# 创建配置目录 mkdir -p /etc/dae # 将示例配置文件移动到配置目录 mv example.dae /etc/dae # 创建最小配置文件 cat > /etc/dae/config.dae <<EOF global{} routing{} EOF # 设置配置文件权限,限制只有配置文件所有者才可以读写,不设置dae无法启动 chmod 0640 /etc/dae/config.dae
2.Geo 数据库文件
# 创建数据目录 mkdir -p /usr/local/share/dae/ # 将geo数据库文件移动到数据目录 mv geoip.dat geosite.dat /usr/local/share/dae/
3.主程序文件
# 添加可执行权限 chmod a+x dae-linux-armv7 # 将主程序文件安装到/usr/bin/目录 mv dae-linux-armv7 /usr/bin/dae
4.服务文件
# 将服务文件下载到systemd目录 wget -O /etc/systemd/system/dae.service https://mirror.ghproxy.com/https://raw.githubusercontent.com/daeuniverse/dae/main/install/dae.service # 刷新配置 systemctl daemon-reload
六、服务管理
1、设置开机自启动
systemctl enable dae
2、启动服务
systemctl start dae
3、查询服务状态
systemctl status dae
4、重载配置
systemctl reload dae
七、config.dae 配置文件示例
上一步我们创建了一个最简单的配置文件(/etc/dae/config.dae),用于测试 dae(大鹅)能否正常运行。下面是一个 config.dae 配置文件示例,供参考。
更详细的配置信息,请参考https://github.com/daeuniverse/dae/blob/main/example.dae
如果你只在 wan_interface 中填写了接口或 auto,而未在 lan_interface 中填写内容,那么从局域网中传来的流量将无法被代理。如果你想同时代理本机和局域网流量,请同时填写 wan_interface 和 lan_interface。
下面的配置,需要注意两个地方:
1,lan_interface: eth0(注意看你的网口名称是不是eth0)
2,节点URI,请修改为你自己的节点URI
# 全局配置 global { # 绑定lan网口提供给内网设备,填自己服务器的网口,多个逗号隔开 lan_interface: eth0 wan_interface: auto log_level: info auto_config_kernel_parameter: true dial_mode: domain allow_insecure: false so_mark_from_dae: 1234 # tls配置 tls_implementation: utls utls_imitate: chrome_auto } # 订阅配置 subscription { } # 节点配置 node { # 节点URI #US: 'juicity://uuid:[email protected]:port?congestion_control=bbr&sni=example.domain.com&allow_insecure=0&pinned_certchain_sha256=CERT_HASH' HK: 'socks5://username:password@localhost:10808' #US: 'hysteria2://authpassword@serverIP:port/?sin=domainname' } # 分组配置,以下采用固定策略,使用第一个节点 group { ifeng_proxy { policy: fixed(0) } } # dns配置 dns { upstream { googledns: 'tcp+udp://dns.google.com:53' alidns: 'udp://dns.alidns.com:53' } routing { request { qname(geosite:cn) -> alidns fallback: googledns } response { upstream(googledns) -> accept fallback: accept } } } # 路由配置 routing { pname(NetworkManager) -> direct dip(224.0.0.0/3, 'ff00::/8') -> direct dip(geoip:private) -> direct ### 以下是自定义规则 ## 规则 ip(geoip:cn) -> direct domain(geosite:cn) -> direct domain(geosite:category-ads) -> block # hysteria 配置,将进程名为 hysteria 的流量直接放行,不进行劫持和处理,强制直连。 pname(hysteria) -> must_direct # 默认出站分组 fallback: ifeng_proxy }
八、dae(大鹅) 使用 hysteria 协议
dae(大鹅)从 v.0.7.0 版本开始支持 hysteria2 协议,这样旁路由上就可以少运行一个 hysteria 进程,减少旁路由的压力。经过测试,目前 v0.7.0 版本在使用 hysteria2 时,不支持混淆和端口跳跃功能,URL 中的主机名为域名时,无法正常解析。
dae v0.7.0 版本目前可用的 URL 格式为:
hysteria2://authpassword@serverIP:port/?sin=domainname
鉴于有些小伙伴想要用到混淆和端口跳跃功能,目前情况就只能多跑一个 hysteria 进程。
1、创建工作组和用户
#建议尽量不要使用 root 用户运行服务,我们创建一个名为 hysteria 的用户用于运行 hysteria 。 groupadd --system hysteria useradd --system \ --gid hysteria \ --create-home \ --home-dir /var/lib/hysteria \ --shell /usr/sbin/nologin \ --comment "hysteria server" \ hysteria
2、下载你设备对应 CPU 架构的安装包。
https://github.com/apernet/hysteria/releases/latest
# 下载对应 CPU 架构的安装包 wget -q -O /usr/bin/hysteria https://mirror.ghproxy.com/https://github.com/apernet/hysteria/releases/download/app%2Fv2.5.0/hysteria-linux-arm # 设置可执行权限 chmod a+x /usr/bin/hysteria #创建 hysteria 配置文件目录 mkdir /etc/hysteria
3、请参考以下示例,结合 hysteria 服务端配置,创建 hysteria 客户端配置文件,配置文件的路径为 /etc/hysteria/config.json 。
{ "server": "hy2.hicairo.com:10086:30000-35000", "obfs": { "type": "salamander", "salamander": { "password": "*******************" } }, "auth":"*******************", "transport": { "type": "udp", "udp": { "hopInterval": "30s" } }, "bandwidth": { "up": "35 mbps", "down": "225 mbps" }, "fastOpen": true, "lazy": true, "socks5": { "listen": ":10808", "username": "username", "password": "password" }, "http": { "listen": ":10809", "username": "username", "password": "password" } }
4、将 Hysteria 作为守护进程运行
在 /etc/systemd/system/ 目录创建 hysteria.service
cat > /etc/systemd/system/hysteria.service <<EOF [Unit] Description=Hysteria client Service (config.json) After=network.target [Service] Type=simple ExecStart=/usr/bin/hysteria -c /etc/hysteria/config.json client WorkingDirectory=/etc/hysteria User=hysteria Group=hysteria Environment=HYSTERIA_LOG_LEVEL=info CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW NoNewPrivileges=true [Install] WantedBy=multi-user.target EOF
5、启动 Hysteria 客户端
chown -R hysteria:hysteria /etc/hysteria/ systemctl daemon-reload systemctl enable hysteria systemctl start hysteria #查看当前状态 systemctl status hysteria #使用更改的配置文件重新加载 hysteria systemctl reload hysteria
6、这时 Hysteria 进程就运行起来了,提供了 socks5 和 http 协议。参考本文第七章节,修改 /etc/dae/config.dae 配置文件中的节点配置,连接本地的 socks5 协议。
...... # 节点配置 node { # 节点URI HK: 'socks5://username:password@localhost:10808' } ......
同时,请确认你的 /etc/dae/config.dae 配置文件中包含以下这句配置。
# hysteria 配置,将进程名为 hysteria 的流量直接放行,不进行劫持和处理,强制直连。 pname(hysteria) -> must_direct
最后,重启 dae(大鹅)服务即可。
systemctl restart dae
本文出处:HiFeng'Blog
本文链接:https://hicairo.com/post/77.html
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA许可协议。转载请注明出处!