主页
avatar

Kared

树莓派搭建 Clash 透明代理/网关

Clash 是一个开源的多协议代理客户端,用于在网络上实现科学上网。Clash 内核支持各种 Unix 平台的各个架构;还支持各种代理协议,像 Trojan、Vmess、Shadowsocks 等等;以及强大的分流规则,可以非常方便地自定义各种规则。

本文介绍如何利用 Raspberry Pi 4B 来简单搭建 Clash 作为透明代理。通过将 Raspberry Pi 设置为透明代理,只需将连接到局域网的设备的网关和 DNS 设置为 Raspberry Pi 的 IP 地址,就可以在用户和网络之间提供透明连接,使用户的网络请求被代理服务器处理。

为了高效运行,我们选择了 Raspberry PiOS Lite (64-bit) 系统版本,即仅包含精简的命令行界面(CLI)的版本,专注于提供稳定的代理服务。您可以参考相关文章进行系统的安装和配置:

树莓派安装系统详解及相关配置

一、下载安装 Clash 内核

emmm,Clash 内核作者已经删库,路径可能已经过期。

你可以到 GitHub 下载 Clash 内核,并根据安装的系统选择合适版本的二进制文件。Raspberry Pi 4B 为 ARMv8 架构(可以通过 arch 命令查看),则对应选择 clash-linux-armv8 版本,选择文件 clash-linux-armv8-v1.11.8.gz

下载完成后解压文件,然后移动到 /usr/local/bin/clash 位置,同时给该文件以执行的权限:

wget https://github.com/Dreamacro/clash/releases/download/v1.11.8/clash-linux-armv8-v1.11.8.gz
gunzip clash-linux-armv8-v1.11.8.gz
sudo mv clash-linux-armv8-v1.11.8 /usr/local/bin/clash
sudo chmod +x /usr/local/bin/clash
sudo clash

执行一次 clash 命令,Clash 会自动创建 ~/.config/clash/ 配置目录,并生成默认配置文件 config.yaml 以及名为 Country.mmdb 的 GeoIP 数据库。

Country.mmdb 是一个全球IP数据库,用于解析IP信息和地理定位。没有这个文件,Clash 将无法正常运行。您可以从GitHub下载该文件,并将其放置在默认路径 ~/.config/clash 下。

要验证 Clash 是否成功安装,可以运行以下命令:

sudo clash -v

如果返回类似于以下信息,则说明安装成功:

Clash v1.11.8 linux arm64 with go1.19 Fri Aug 26 13:20:31 UTC 2022

二、设置 Clash 相关配置

接下来,您需要编辑 config.yaml 配置文件以适应您的需求。以下是一个示例配置,供您参考:

port: 8888
socks-port: 8889
redir-port: 8890
allow-lan: true
mode: Rule
log-level: info

# external-controller: 0.0.0.0:9000
# external-ui: clash-dashboard
# secret: "your-secret-passphrase"

experimental:
  ignore-resolve-fail: false

dns:
  enable: true
  ipv6: false
  listen: 0.0.0.0:53
  enhanced-mode: redir-host
  nameserver:
    - https://dns.alidns.com/dns-query # DNS-over-HTTPS

hosts:
  "dns.alidns.com": 223.5.5.5

proxies:
  ...

proxy-groups:
  ...

rules:
  ...
  GEOIP,DIRECT
  MATCH,Proxy
  • allow-lan: true 表示允许 clash 处理来自局域网内其他设备的流量。

  • port: 8888 声明了用作 HTTP / HTTPS 代理的端口。

  • socks-port: 8889 声明了用作 SOCKS5 代理的端口。

  • redir-port: 8890 意味着 clash 将会监听 8890 端口以处理局域网内其他设备所转发的流量。

  • mode: Rule 表示代理模式为规则模式(Rule Mode)。

    • Global 模式:在 Global 模式下,所有的网络流量都会经过代理服务器。这意味着所有的网络请求都会通过代理服务器发送和接收数据。
    • Rule 模式:在 Rule 模式下,网络流量会根据用户定义的规则进行处理。这些规则可以根据目标地址、域名或其他网络流量属性决定是否经过代理服务器。
    • Direct 模式:在 Direct 模式下,所有的网络流量都会直接连接到目标服务器,而不经过代理。这个模式可以用于绕过代理服务器,直接连接到需要访问的网站或应用程序。
    • Script 模式:在 Script 模式下,可以使用自定义脚本来控制网络流量的走向。用户可以编写脚本,根据特定的条件来决定是否经过代理服务器。
  • dns 中需要配置 enable: true 允许 clash 用作 DNS 服务器,配置 enhanced-mode: redir-host以用于透明代理,并声明listen: 0.0.0.0:53以监听 53 端口(低位端口须用root 用户)。

  • dns 中的 nameserver 配置,可以使用常用的公共 DNS 如 114.114.114.114、8.8.8.8 等,也可以配置 DNS-over-HTTPS。

  • 本文使用 https://dns.alidns.com/dns-query 即阿里 DNS 的 DoH,并且增加了一条 hosts 配置 "dns.alidns.com": 223.5.5.5,避免再对 dns.alidns.com 进行解析。

proxiesproxy-groups 以及 rules 的配置,则可以根据需要自行编辑。

三、创建 Clash 守护进程

在 Linux 系统中,为了确保 Clash 持续稳定运行,并避免终端关闭后服务中断,我们可以将其配置为守护进程。我们可以考虑很多解决方案,例如 systemd、pm2、screen等。

其中,systemd 是一种广泛采用且功能强大的进程管理工具,本文推荐使用 systemd 来管理系统中的进程、服务和设备,以及对它们的启动、停止和监控操作。通过运行 sudo vim /lib/systemd/system/clash.service 命令,我们可以创建一个新的 systemd 服务配置文件,用于管理 Clash 进程。在该配置文件中,我们将定义 Clash 服务的各项属性,包括服务描述、依赖关系、执行命令等。

[Unit]
Description=A rule based proxy in Go.
After=network.target

[Service]
Type=simple
User=nobody
Restart=on-abort
ExecStart=/usr/local/bin/clash

[Install]
WantedBy=multi-user.target

在配置好服务文件后,我们就可以使用 systemctl 命令来管理服务了,下面提供简要的 systemd 操作的相关命令:

# 启动clash.service服务
sudo systemctl start clash.service
# 停止clash.service服务
sudo systemctl stop clash.service
# 重新启动clash.service服务
sudo systemctl restart clash.service
# 开机自启动clash.service服务
sudo systemctl enable clash.service
# 查看clash.service服务日志
sudo systemctl status clash.service
# 重新加载 systemd 模块
systemctl daemon-reload

四、配置终端代理

在配置了 Clash 守护进程后,我们需要为终端设置代理,以便让终端的网络请求经过 Clash 代理服务器,这通常可以通过编辑环境变量来实现。在该树莓派上,我们可以通过命令 sudo vim /etc/environment 编辑环境变量,在其中增加以下内容:

export http_proxy="127.0.0.1:7890"
export https_proxy="127.0.0.1:7890"

在树莓派等 Linux 设备上,我们可以通过直接执行下面命令,轻松实现连接 Clash 代理服务器:

[collapse status=“true” title=“Linux 设置http/https代理”]

export https_proxy="127.0.0.1:7890"
export http_proxy="127.0.0.1:7890"

[/collapse]


[collapse status=“false” title=“对于存在密码的情况”]

export http_proxy_user=username
export http_proxy_pass=password

[/collapse]


[collapse status=“false” title=“Linux 测试 http/https 代理”]

curl http://www.google.com
curl https://www.google.com

[/collapse]


[collapse status=“false” title=“Linux 取消 http/https 代理”]

unset http_proxy
unset https_proxy

[/collapse]


因为 clash 使用一个端口同时代理 httphttps,故系统变量的 https_proxy的代理地址和http_proxy 的代理地址是相同的。同时,我们还可以设置 no_proxy 环境变量来指定哪些域名或 IP 地址不需要经过代理:

export no_proxy="localhost, 127.0.0.1, *edu.cn"

除了为终端设备设置系统代理,我们还可以为单独的应用程序设置代理。如有需要可以自行参考相关文档进行配置,本文不做过多展开。

五、配置控制面板

为了更直观地监控和管理 Clash 代理服务,我们可以配置 Clash Dashboard 控制面板。Clash Dashboard 是一个基于 Web 的界面,可以展示代理服务的运行状态、流量统计等信息。

首先,我们需要从 GitHub 上克隆 Clash Dashboard 的代码库到本地。在终端中执行以下命令:

cd ~/.config/clash
git clone https://github.com/Dreamacro/clash-dashboard.git
cd ~/.config/clash/clash-dashboard
git checkout -b gh-pages origin/gh-pages

同时,我们需要修改 Clash 的配置文件 config.yaml,确保 external-controllerexternal-uisecret 选项已取消注释,并配置好访问 Dashboard 的口令(secret),然后,Clash 就可以接受来自 Dashboard 的控制请求了。

最后,启动 Clash 服务后,在浏览器中输入 http://树莓派IP地址:9000/ui(将 树莓派IP地址 替换为实际的 IP 地址),就可以访问 Clash Dashboard 控制面板了。在面板中,我们可以看到代理服务的实时状态、流量图表、规则管理等功能,方便我们进行监控和管理。

树莓派 Raspberry Pi Clash 透明代理 网关