今年年初,我在 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:password@example.domain.com: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
评论(0)