上篇介绍过我曾经用 Proxmox VE 搭建过 OpenWRT 旁路由,但是由于某些众所周知的原因,在这个 OpenWRT 系统上跑 Shadowsocks 服务的 3 台 Bandwagon 服务器的 IP 同时被x了,这也太巧了吧!从此对 OpenWRT 搭建旁路由有心理阴影了,因为我没有理由不怀疑来路不明的 OpenWRT 固件或者 shadowsocks-libev-ss-server 插件有问题,并不是 OpenWRT 不靠谱,都怪我自己不会编译。
不用 OpenWRT 搭建旁路由,难道就没办法方便的上网了吗?当然不是,我们可以用 Debian 10 Linux 系统搭建一个旁路由,准确的说,这个叫透明网关或者透明代理。其实我很早就看到别人的教程了,迟迟没有动手的原因是 macOS 下我用 ClashX ,Windows 下用 v2rayN ,iOS 下用 Quantamult X 就可以方便的上网。
唯独在 Android 下,我的网络环境 Shadowsocks 几乎不可用了,被干扰的很厉害,又苦于找不到好用的 v2ray 客户端 。前几天看到有人分享 Clash for Android 横空出世了,原文提到的下载方式包括 Telegram 群组和 Google Play ,Telegram 我不用,又访问不到 Google Play 这才打算折腾一个透明代理。现在才知道,这个项目原来叫 ClashA ,早就可以方便的下载所有开发版。
搭建一个基于 Debian 10 的透明网关、透明代理非常简单:安装 Debian 10 ,安装 Clash ,配置 Clash ,使用 iptables 转发流量。
安装 Debian 10
前几天用 unRAID 搭建了个简单的家庭服务器,unRAID 支持虚拟机,支持 CPU 和网卡直通,可以让虚拟机获得更好的性能,安装 Debian 10 的过程我这里就不说了。
给 Debian 10 设置静态 IP 地址
因为我们用 Debian 10 搭建网关设备,所以不能用 DHCP 分配 IP 地址,最好设置一个静态 IP
sudo nano /etc/network/interfaces
接下来参考我的配置,为 enp1so 这个网卡设置一个静态 IP 地址:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug enp1s0
iface enp1s0 inet static
address 192.168.2.10
netmask 255.255.255.0
gateway 192.168.2.1
dns-nameservers 192.168.2.1 223.5.5.5 223.6.6.6
# This is an autoconfigured IPv6 interface
iface enp1s0 inet6 auto
接着执行 sudo shutdown -r now 重启一下系统就可以了。
安装 Clash
Clash 是一个开源的,类似 Surge 的代理软件,支持本地 HTTP/HTTPS/SOCKS 代理,GeoIP 分流,自定义代理规则等等。
cd ~
wget https://github.com/Dreamacro/clash/releases/download/v0.17.1/clash-linux-amd64-v0.17.1.gz #下载最新版本
gzip -d clash-linux-amd64-v0.17.1.gz #解压
sudo mv clash-linux-amd64-v0.17.1 /usr/local/bin/clash #移动到 /usr/local/bin 目录,并且重命名为 Clash
sudo chmod +x /usr/local/bin/clash #添加可执行权限
执行 clash -v 命令看是否安装成功
pengjiayou@debian:~$ clash -v
Clash v0.17.1 linux amd64 Wed Jan 1 10:31:59 UTC 2020
返回以上内容说明安装成功。接下来我们编写一个 Systemd 服务脚本,在 /lib/systemd/system/ 目录下创建 [email protected] 文件:
sudo nano /lib/systemd/system/[email protected]
写入以下内容(别修改)然后保存:
[Unit]
Description=A rule based proxy in Go for %i.
After=network.target
[Service]
Type=simple
User=%i
Restart=on-abort
ExecStart=/usr/local/bin/clash
[Install]
WantedBy=multi-user.target
重新加载 systemd 模块
sudo systemctl daemon-reload
设置 Clash 开机自启动
sudo systemctl enable clash@user
user 是你当前 Debian 系统的用户名,比如 sudo systemctl enable clash@pengjiayou
简单配置 Clash (添加 Clash 配置文件)
Clash 的默认配置文件所在的目录是 $HOME/.config/clash ,配置文件的名称是 config.yml
mkdir ~/.config/ #在 $HOME 下创建 .config 目录
cd ~/.config/ #进入 .config 目录
mkdir clash #在 .config 目录创建 clash 目录
cd clash #进入 clash 目录
touch config.yaml #创建 config.yaml 文件
wget https://github.com/haishanh/yacd/archive/gh-pages.zip #yacd 是一个 Clash 的 web 前端
unzip gh-pages.zip #解压 gh-pages.zip
mv yacd-gh-pages/ dashboard/ #重命名为 dashboard 目录
编辑 config.yaml 文件
nano ~/.config/clash/config.yaml
在 config.yaml 文件中加入如下内容:
port: 7890
socks-port: 7891
redir-port: 7892
allow-lan: true
mode: Rule
log-level: info
external-controller: 0.0.0.0:9090
secret: ""
external-ui: dashboard
#此处内容请安装一个gui版本的clash然后在里面配置好代理然后抄过来
Proxy:
Proxy Group:
#
Rule:
- IP-CIDR,127.0.0.0/8,DIRECT
- IP-CIDR,192.168.0.0/16,DIRECT
- FINAL,Proxy
这是 Clash 配置的简化版本,你可以参考这个文件的分流规则。接下来执行:
sudo systemctl start clash@user
如上所述,把 user 换成你当前 Debian 系统的用户名来启动 Clash
现在就有一个可以使用的局域网 http 或者 socks5 代理服务器了,甚至可以在浏览器里面访问 http://serverip:9090/ui/ 来调试 Clash!如果是公网的话我推荐 secret 处加上密码以保证安全性。
为 Samsung S10e One UI 2 的 WIFI SSID 设置一个 http 代理就可以愉快的上网了。
到这一步其实大部分需求都能满足了:在电脑上,不管是 macOS 10.15 或者 Windows 10 你可以设置 http 或者 socks5 系统代理;或者在浏览器插件 SwitchyOmega 上,或者 Dropbox 等软件设置代理服务器就可以上网了。
如果你要为你的 wifi 路由器设置一个透明网关或者叫代理,就像别人的单网口旁路由教程提到的那样,请继续观看本文其它内容。
高级配置 Clash (开启 redir-port 也就是透明代理端口)
1. 做透明代理,必须启用redir-port,也就是clash透明代理的端口。
2.做网关设备,你就必须得让其他局域网的机器能够连接到clash,所以allow-lan必须打开。
3.必须打开clash的DNS功能,并且使用redir-host模式,最重要的是你还需要在fallback:后面加上一个支持DoT的DNS。比如我这边是使用的dns.rubyfish.cn:853,如果你用普通的DNS无非解决域名被污染的问题。
修改 Clash 配置文件如下:
dns:
enable: true
listen: 0.0.0.0:53
enhanced-mode: redir-host
nameserver:
- 'tls://dns.rubyfish.cn:853'
fallback:
- 'tls://1.1.1.1:853'
- 'tcp://1.1.1.1:53'
- 'tcp://208.67.222.222:443'
- 'tls://dns.google'
这里还是 Clash 配置的简化版本,你可以参考这个文件的分流规则。
为 Debian 10 系统开启 IP 转发
要让 Debian 10 能够有一个基本的路由功能很简单,开一下 IP 转发就行:
sudo echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf && sysctl -p
sudo echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf && sysctl -p
验证一下,回显是1说明转发开启成功:
cat /proc/sys/net/ipv4/ip_forward
配置 iptables 转发
配置文件弄好了之后,现在我们需要把机器所有的流量都转发到clash的透明代理端口上面,当然192.168.0.0这个网段的流量我们不做转发:
iptables -t nat -N clash
iptables -t nat -A clash -d 192.168.0.0/16 -j RETURN
iptables -t nat -A clash -p tcp -j RETURN -m mark --mark 0xff
iptables -t nat -A clash -p tcp -j REDIRECT --to-ports 7892
iptables -t nat -A PREROUTING -p tcp -j clash
永久保存iptables规则:
sudo apt install iptables-persistent netfilter-persistent
netfilter-persistent save
netfilter-persistent start
iptables-save > /etc/iptables/rules.v4
透明代理至此终于搭建好了
接下来就可以把旁路网关地址以及 dns 设置在需要的路由器,或者电脑上愉快的上网了。其实我没走到这一步,我到刚刚搭建好了一个局域网的 http / socks5 代理那一步就结束了,因为已经满足我的需求了,如果有问题,请参考如下资料: