在 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_interfacelan_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://www.hicairo.com/post/77.html
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA许可协议。转载请注明出处!