分类
瞎折腾

在ASUSWRT-Merlin上安装V2Ray

前情提要:家里现在用的路由器是华硕AC66U_B1,很早就刷了梅林固件,但是一直没用什么高级功能。正好前几天我搞到了国内的V2Ray代理,就打算趁寒假搞一个在路由器上翻回国内的操作。

首先我们需要能够安装梅林固件的路由器。包括全部华硕路由器和部分网件路由器。然后去这里下载梅林固件。解压以后找到.trx文件,使用华硕固件本来有的固件升级功能就好啦。网件的话可能需要一点特殊操作,这里就不讲了。

这是已经刷完梅林的固件升级页面

然后需要在Administration-System中允许写入JFFS分区和打开SSH。接着就可以用你喜欢的SSH工具连进去了。

第一次要格式化JFFS分区,所以两个都选yes
Enable SSH 为了安全我选LAN only(但是我也没公网IP

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

接下来就要准备V2Ray的配置文件了。由于梅林没有内置FTP,我们只能用scp传文件。(上一步把v2ray-core放进JFFS也可以用scp)。这里可以选择有图形界面的winSCP,挺方便的。

scp C:\config.json lulu@192.168.50.1:/jffs/v2ray/config.json

下面是我的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"
			}
		]
	}
}

接着我们要为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

这段脚本会保持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"
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

这里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

如果不出意外的话,路由器重启完就大功告成了。我们成功的在路由器上搭建了透明代理,在这台路由器下面的设备无需任何其他设置就可以走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

由NaivEPoi

本站站长,其他的懒得写0v0

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据