lala.im:使用Debian9自己打造一个旁路由

運維技術·VPN代理·lala.im · 2019-05-28 · 108 人浏览

原文地址:https://lala.im/5727.html,請支持原作者!該處僅作轉載。

文章目录
还用个锤子固件哟,越用越不爽,昨天把装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=4163  mtu 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-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;
}

接下来安装一下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长这样:

範例
它也可以切换节点,同时还有一个非常实用的功能,实时流量查看:

範例
使用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的插件都下架了,我还留着这玩意有何用。

運維技術 VPN代理 lala.im
Theme Jasmine by Kent Liao