使用Debian9自己打造一个旁路由-荒岛

使用Debian9自己打造一个旁路由-荒岛

前言

还用个锤子固件哟,越用越不爽,昨天把装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配置

接着今天的主角就要上场了: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