还用个锤子固件哟,越用越不爽,昨天把装koolshare的虚拟机直接给删了,决定自己用Debian9搞个旁路由+扶墙功能,其实说成是旁路由不是很正确,准确点讲这种设备应该叫:透明网关/透明代理/之类的。。。
先说下我这个基本网络环境是:光猫改桥接,然后连到一台主路由上面,主路由负责拨号上网/WIFI接入。在主路由下面接一台电脑,接一台NAS,我在NAS里面装Proxmox虚拟机,虚拟机使用的网络是桥接到宿主机。最后我在虚拟机里面安装一个Debian9并弄成一个可以扶墙的透明网关。这样做的好处就是:全家翻墙,所有接入到局域网的设备无需配置任何客户端即可扶墙,说白了就是让你感觉没有墙的存在。
我的这个主路由的IP是192.168.0.1,并且我这个NAS只有一个网口,直接用ISO装的Proxmox,所以装好之后默认就会帮你做一个vmbr0的桥接:
怎么装Debian9就不说了,开始前先装一下需要用到的工具和包:
apt -y install supervisor iptables-persistent net-tools curl wget nano
因为我们要做网关设备,所以不能用DHCP,最好是手动指定一个静态IP,所以这里修改网卡配置文件:
nano /etc/network/interfaces
改为静态IP并把这台虚拟机的网关IP设置为主路由的IP:
iface ens18 inet static address 192.168.0.233 netmask 255.255.255.0 gateway 192.168.0.1
重启网络服务有时候会有奇葩问题尤其是在Porxmox下面,所以这里直接重启虚拟机吧:
reboot
重新登录上来之后查看当前的网关:
netstat -r -n
回显看到网关IP已经是之前修改的就OK了:
Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 ens18 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 ens18
再看下网卡的信息:
ifconfig
外网口ens18是我们刚才设置的静态IP就行了:
ens18: flags=4163mtu 1500 inet 192.168.0.233 netmask 255.255.255.0 broadcast 192.168.0.255 inet6 fe80::d4e3:fff:fea6:7a5e prefixlen 64 scopeid 0x20 ether d6:e3:0f:a6:7a:5e txqueuelen 1000 (Ethernet) RX packets 167 bytes 17517 (17.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 59 bytes 10165 (9.9 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73 mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1 (Local Loopback) RX packets 4 bytes 156 (156.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 4 bytes 156 (156.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
要让Debian9能够有一个基本的路由功能很简单,开一下IP转发就行:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf && sysctl -p echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf && sysctl -p
验证一下,回显是1说明转发开启成功:
cat /proc/sys/net/ipv4/ip_forward
接着今天的主角就要上场了:Clash。这个东西支持透明代理,并且可以根据规则来路由流量。简单点讲就是一个跨平台的免费版Surge。
Go语言写的,安装非常简单,基本上就是下载解压给执行权限即可:
mkdir -p /opt/clash && cd /opt/clash wget https://github.com/Dreamacro/clash/releases/download/v0.14.0/clash-linux-amd64-v0.14.0.gz gzip -d clash-linux-amd64-v0.14.0.gz mv clash-linux-amd64-v0.14.0 clash-linux chmod +x clash-linux
然后我们需要创建一个yaml的配置文件:
nano config.yml
我的配置如下:
port: 58652 socks-port: 58653 redir-port: 58654 allow-lan: true mode: Rule log-level: info external-controller: 0.0.0.0:23333 dns: enable: true ipv6: false listen: 0.0.0.0:53 enhanced-mode: redir-host nameserver: - 114.114.114.114 - 223.5.5.5 fallback: - tls://dns.rubyfish.cn:853 - 8.8.8.8 Proxy: - { name: "nf", type: ss, server: 1.2.3.4, port: 18488, cipher: AEAD_CHACHA20_POLY1305, password: "imlala", udp: true } - { name: "aliyunsgp", type: ss, server: 2.2.3.4, port: 18588, cipher: AEAD_CHACHA20_POLY1305, password: "imlala", udp: true } Proxy Group: - { name: "auto", type: url-test, proxies: ["nf", "aliyunsgp"], url: "https://www.baidu.com", interval: 300 } - { name: "Proxy", type: select, proxies: ["nf", "aliyunsgp"] } Rule: # Netflix - DOMAIN-KEYWORD,netflix,nf - DOMAIN-SUFFIX,netflix.com,nf - DOMAIN-SUFFIX,nflxvideo.net,nf # LAN - DOMAIN-SUFFIX,local,DIRECT - IP-CIDR,127.0.0.0/8,DIRECT - IP-CIDR,192.168.0.0/16,DIRECT # IP DataBase - GEOIP,CN,DIRECT - MATCH,Proxy
这里面有几个注意事项:
1.做透明代理,必须启用redir-port,也就是clash透明代理的端口。
2.做网关设备,你就必须得让其他局域网的机器能够连接到clash,所以allow-lan必须打开。
3.必须打开clash的DNS功能,并且使用redir-host模式,最重要的是你还需要在fallback:后面加上一个支持DoT的DNS。比如我这边是使用的dns.rubyfish.cn:853,如果你用普通的DNS无非解决域名被污染的问题。
配置文件弄好了之后,现在我们需要把机器所有的流量都转发到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 REDIRECT --to-ports 58654 iptables -t nat -A PREROUTING -p tcp -j Clash
永久保存iptables规则:
netfilter-persistent save
现在我们就可以在前台运行一遍clash让它把IP库下载下来,顺带测试一下看能不能正常工作:
./clash-linux -d .
测试方法很简单,现在打开你电脑的IPv4协议属性,手动把网关/DNS地址都修改成你这台旁路由的IP:
开一下推特啊,油管啊,看能不能正常打开,能打开的话,这边你也应该可以看到回显一些IP或者是域名等信息:
现在Ctrl+C组合键退出运行,配置supervisor把clash放到后台运行:
nano /etc/supervisor/conf.d/clash.conf
写入下面的配置:
[supervisord] nodaemon=false [program:clash] priority=1 directory=/opt/clash command=/opt/clash/clash-linux -d . autorestart=true
启动supervisor即可:
systemctl restart supervisor systemctl enable supervisor
最后我们在主路由上开启DHCP功能,在DHCP内把网关/DNS都设置为这台旁路由的IP:
重启你的路由器,然后记得把你电脑的IPv4协议属性也改回来,即改成自动分配让主路由器的DHCP去分配:
这样配置就完成了,现在所有接入这个局域网的设备都能够自动扶墙。
现在就有一个问题出来了,使用Clash如果想要去切换节点就只能去登这台机器的SSH,这样太麻烦了,有没有方便一点的办法呢?有是有,但也比较鸡肋就是。。现在有两个WEB面板可以用,但这两个面板的功能都不是很完善,如果要添加节点的话还是得上SSH。。
Clash的WEBUI:clash-dashboard
那这里我也写一下如何去配置这两个面板程序,首先我们来配置官方的clash-dashboard,直接在这台旁路由上安装Node.js/Yarn:
apt -y install git build-essential curl -sL https://deb.nodesource.com/setup_12.x | bash - apt -y install nodejs curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list apt -y update && apt -y install yarn
完成之后再装一个nginx:
apt -y install nginx unzip
nginx安装完成之后把nginx的这个引用配置文件改个名:
mv /etc/nginx/sites-enabled/default /etc/nginx/sites-enabled/default.bak
拉取项目文件:
git clone https://github.com/Dreamacro/clash-dashboard.git cd clash-dashboard
构建(注意内存,npmbuild的时候很耗内存,建议你这台虚拟机先设置个1GB,怼过去之后再把内存改小都可以的):
npm install npm run build
把构建出来的文件全部移到nginx的站点目录
mkdir -p /usr/share/nginx/html/clash-dashboard cp -r dist/. /usr/share/nginx/html/clash-dashboard
新建一个nginx的conf:
nano /etc/nginx/conf.d/clash-dashboard.conf
写入:
server { listen 80; server_name 192.168.0.233; root /usr/share/nginx/html/clash-dashboard; index index.html; }
又一个Clash的WEBUI:yacd
接下来安装一下yacd,这个有一种简单的方法,直接下载已经build好的压缩包:
wget https://github.com/haishanh/yacd/archive/gh-pages.zip -O /usr/share/nginx/html/yacd.zip unzip /usr/share/nginx/html/yacd.zip -d /usr/share/nginx/html mv /usr/share/nginx/html/yacd-gh-pages /usr/share/nginx/html/yacd rm -rf /usr/share/nginx/html/yacd.zip
和之前一样写个nginx的配置文件:
nano /etc/nginx/conf.d/yacd.conf
配置如下:
server { listen 81; server_name 192.168.0.233; root /usr/share/nginx/html/yacd; index index.html; }
但这种方法可能用到的是老版本,为了能够最快用到新版本,最好还是和之前一样自己build一下:
rm -rf /usr/share/nginx/html/yacd/* git clone https://github.com/haishanh/yacd.git cd yacd yarn yarn build cp -r public/. /usr/share/nginx/html/yacd
最后启动nginx:
systemctl start nginx systemctl enable nginx
看一看面板都长啥样
基于我上面的配置访问:192.168.0.233是clash-dashboard的控制面板,访问:192.168.0.233:81是yacd的控制面板,clash-dashboard长这样:
可以选择切换节点:
yacd长这样:
它也可以切换节点,同时还有一个非常实用的功能,实时流量查看:
go-shadowsocks2
使用Clash的话,服务端这里推荐用go-shadowsocks2这个版本,支持AEAD加密,安装很简单基本就是下载/解压运行,当然也不是说非要用这个,这只是我推荐而已。如果你的机器上已经安装了SS或者V2ray并且对这个go-shadowsocks2不怎么感冒的话,这些步骤你可以略过。
CentOS7:
yum -y install supervisor wget nano
Debian9:
apt -y install supervisor wget nano
然后下载二进制文件解压给执行权限就行:
mkdir -p /opt/shadowsocks2 && cd /opt/shadowsocks2 wget https://github.com/shadowsocks/go-shadowsocks2/releases/download/v0.0.11/shadowsocks2-linux.gz gzip -d shadowsocks2-linux.gz chmod +x shadowsocks2-linux
接下来使用supervisor将程序放到后台运行。用supervisor还有一个好处是可以监控这个服务端,如果服务端挂了能够实现自动重启。
CentOS7新建supervisor配置文件路径和格式:
nano /etc/supervisord.d/shadowsocks2.ini
Debian9新建supervisor配置文件路径和格式:
nano /etc/supervisor/conf.d/shadowsocks2.conf
配置文件内容通用:
[supervisord] nodaemon=false [program:shadowsocks2] priority=1 directory=/opt/shadowsocks2 command=/opt/shadowsocks2/shadowsocks2-linux -s 'ss://AEAD_CHACHA20_POLY1305:imlala@:28588' -verbose autorestart=true
重启supervisor即可完成部署。
CentOS7:
systemctl restart supervisord systemctl enable supervisord
Debian9:
systemctl restart supervisor systemctl enable supervisor
这其实就是一套比较折腾的方案,但同时可玩性也是最高的,你想装什么都可以实现,在Debian上面装个PPPoE实现拨号有问题吗?没问题!在Debian上面装个DHCP服务器?so easy,在Debian上面装个离线下载,挂PT啥的那更是so easy。。你完全可以花点时间把它打造成一个全功能的软路由,再说了最近不是各种删库跑路吗?koolshare的插件都下架了,我还留着这玩意有何用。
最新评论
5211314
能不能教我 一点不会