前情提要:家里现在用的路由器是华硕AC66U_B1,很早就刷了梅林固件,但是一直没用什么高级功能。正好前几天我搞到了国内的V2Ray代理,就打算趁寒假搞一个在路由器上翻回国内的操作。
首先我们需要能够安装梅林固件的路由器。包括全部华硕路由器和部分网件路由器。然后去这里下载梅林固件。解压以后找到.trx文件,使用华硕固件本来有的固件升级功能就好啦。网件的话可能需要一点特殊操作,这里就不讲了。
然后需要在Administration-System中允许写入JFFS分区和打开SSH。接着就可以用你喜欢的SSH工具连进去了。
JFFS分区是路由器上的持久性闪存,不会因为机器断点而被擦除,所以我们要把V2Ray装在JFFS分区里。我的CPU是arm的,所以我们要下载arm版本的v2ray-core。
cd /jffs
mkdir v2ray
cd v2ray/
wget https://github.com/v2ray/v2ray-core/releases/download/v4.22.0/v2ray-linux-arm.zip
unzip v2ray-linux-arm.zip
Code language: JavaScript (javascript)
接下来就要准备V2Ray的配置文件了。由于梅林没有内置FTP,我们只能用scp传文件。(上一步把v2ray-core放进JFFS也可以用scp)。这里可以选择有图形界面的winSCP,挺方便的。
scp C:\config.json lulu@192.168.50.1:/jffs/v2ray/config.json
Code language: JavaScript (javascript)
下面是我的config.json配置。使用V2Ray官方提供的dokodemo-door协议可以接收由iptables转发过来的包。通过V2Ray的路由设置可以实现国内网站走指定的国内vmess线路。每一个outbounds都要指定mark来避免循环转发。
{
"log": {
"loglevel": "warning",
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log"
},
"inbounds": [
{
"tag":"transparent",
"port": 10000,
"protocol": "dokodemo-door",
"settings": {
"network": "tcp",
"followRedirect": true
},
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
},
"streamSettings": {
"sockopt": {
"tproxy": "redirect"
}
}
},
{
"tag":"http",
"port": 1080,
"listen": "0.0.0.0",
"protocol": "http",
"settings": {
"auth": "noauth"
}
}
],
"outbounds": [
{
"protocol": "freedom",
"tag": "direct",
"settings": {
"domainStrategy": "UseIP"
},
"streamSettings": {
"sockopt": {
"mark": 15
}
}
},
{
"tag": "proxy_china",
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "",
"port": ,
"users": [
{
"email": "",
"id": "",
"alterId": 8,
"security": "auto"
}
]
}
]
},
"streamSettings": {
"sockopt": {
"mark": 15
}
}
},
{
"protocol": "blackhole",
"settings": {},
"tag": "adblock"
}
],
"dns": {
"servers": [
"8.8.8.8",
"localhost"
]
},
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"ip": [
"geoip:cn"
],
"outboundTag": "proxy_china"
},
{
"type": "field",
"domain": [
"geosite:cn",
".cn"
],
"outboundTag": "proxy_china"
},
{
"type": "field",
"domain": [
"geosite:category-ads"
],
"outboundTag": "adblock"
}
]
}
}
Code language: JSON / JSON with Comments (json)
接着我们要为V2Ray创建开机启动。services-start和firewall-start都是梅林启动时会执行的shell脚本。
nano /jffs/scripts/v2ray-check.sh
复制以下内容。
#! /bin/sh
case "$(pidof v2ray | wc -w)" in
0) echo "Restarting V2ray: $(date)" >> /var/log/v2ray/v2ray-status.log
nohup /jffs/v2ray/v2ray --config=/jffs/v2ray/config.json >/dev/null 2>&1 &
;;
1) # all ok
;;
*) echo "Removed double V2ray: $(date)" >> /var/log/v2ray/v2ray-status.log
kill $(pidof v2ray | awk '{print $1}')
;;
esac
Code language: PHP (php)
这段脚本会保持V2Ray运行。
nano /jffs/scripts/services-start
复制以下内容。
#!/bin/sh
#v2ray start
mkdir /var/log/v2ray/
sleep 60
nohup /jffs/v2ray/v2ray --config=/jffs/v2ray/config.json > /dev/null 2>&1 &
#check v2ray every 15 minute
cru a check-v2ray "*/15 * * * * /jffs/scripts/v2ray-check.sh > /dev/null"
Code language: PHP (php)
nano /jffs/scripts/firewall-start
复制以下内容。
#!/bin/sh
iptables -t nat -N V2RAY
iptables -t nat -A V2RAY -d 0.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 10.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 127.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 169.254.0.0/16 -j RETURN
iptables -t nat -A V2RAY -d 172.16.0.0/12 -j RETURN
iptables -t nat -A V2RAY -d 192.168.0.0/16 -j RETURN
iptables -t nat -A V2RAY -d 224.0.0.0/4 -j RETURN
iptables -t nat -A V2RAY -d 240.0.0.0/4 -j RETURN
iptables -t nat -A V2RAY -p tcp -j RETURN -m mark --mark 0x0f
iptables -t nat -A V2RAY -p tcp -j REDIRECT --to-ports 10000
iptables -t nat -A PREROUTING -p tcp -j V2RAY
iptables -t nat -A OUTPUT -p tcp -j V2RAY
Code language: PHP (php)
这里iptables重定向的端口就是上面dokodemo-door监听的端口。mark 0x0f=15要跟上面config.json中设置的一样。这样被标记的包就会直接送出服务器而不是又被送回V2Ray处理。同样,一些被保留的ip段也是直接return。其他的tcp连接就被重定向到我们选择的端口(这里是10000)。
我们需要把脚本和V2Ray可执行文件的权限设置为可执行。然后重启路由器。
chmod a+rx /jffs/scripts/*
cd /jffs/v2ray/
chmod a+rx v2ctl v2ray
reboot
Code language: JavaScript (javascript)
如果不出意外的话,路由器重启完就大功告成了。我们成功的在路由器上搭建了透明代理,在这台路由器下面的设备无需任何其他设置就可以走V2Ray。
我用了两天发现,由于路由器性能太低,如果把所有流量转发进V2Ray,CPU很容易跑满。现在我的最大网速从400Mbps降低到了80Mbps。
接下来我可能要改变一下iptables规则,只转发必要的流量到V2Ray,看看性能会不会提升。或者直接外挂一个树莓派搞软路由比较方便。关于之后的折腾应该还会有下一篇文章。
感谢阅读,欢迎在下面留言评论!
参考资料:
https://enterpr1se.info/2017/10/v2ray-gfw-asuswrt-merlin/
https://www.v2ray.com/
https://guide.v2fly.org/
https://github.com/RMerl/asuswrt-merlin.ng