因为我的所有设备上默认搜索引擎都是Google,在设备上(尤其是手机)开关一些魔法软件会比较麻烦,而且耗电。
所以为什么不把这项繁杂的任务交给路由器呢?
2025年1月11日更新:
本文内容已经过时。仅留档用于参考。2022年2月13日更新:
目前部分服务端已经不支持之前版本的v2ray客户端。现改用xray内核,有需要可以自行选用新版本v2ray,在release页面下载mips32le版本即可。xray是v2ray的超集,支持vless协议,多数情况下负载更小,适合路由器运行。将后文提到的所有v2ray改为xray即可正常使用。
声明:本文不提供任何上网工具
工具
- 刷Padavan固件的路由器,最好是带USB接口,没有USB的也可以,但是需要一些其他操作。(我用的是网件R6800,感谢YYYYeast友情提供的
电子垃圾路由器)(如何刷该固件请自行搜索,不是所有路由器都可以刷Padavan。R6800刷固件的话可以参考这里) - 一个之后要一直插在路由器上的U盘,容量基本没有要求
- 稳定的v2ray节点,最好不要经常变动各种信息
配置v2ray
准备U盘
如果U盘的卷名很怪的话(尤其是有空格或者一些奇怪字符,或者以短横线开头之类),可以把U盘先格式化,换一个卷名。我的U盘卷名改为了AIDISK
,下面出现的文件路径里,AIDISK
全部换成你自己的卷名。
下载Padavan用的v2ray
下载Padavan用的v2ray内核以及脚本,也可以直接下载我的fork,之后修改完里面的内容后,要把文件夹FOR-USB-or-TF/FOR-USB-or-TF/media/AiDisk_a1/v2ray
复制到U盘根目录下。(下载fork的话,接下来下载完最新的geosite, geoip data,就可以直接跳到修改配置文件的步骤了)
接下来要修改上面仓库中的文件夹FOR-USB-or-TF/FOR-USB-or-TF/media/AiDisk_a1/v2ray
里的内容。这个文件夹里几个文件的作用:
- start.sh:写入路由器iptables,将大陆外ip的访问转入1234端口,并启动/重启v2ray内核。
- stop.sh:结束v2ray进程。
- v2ray:本体。
- config.json:v2ray配置文件。默认Dokodemo door(任意门)协议监听1234端口。
下载geosite以及geoip data
原脚本中采用的方案是,只将大陆外的流量重定向到1234端口,这样操作稳定性很差。所以我推荐的方案是,v2ray的config中设置绕过大陆地址,路由器iptables将所有访问均转入1234端口,让v2ray来自行判断哪些ip以及域名走代理。为此,需要下载最新版本的geosite, geoip data,这个release页每天早上六点自动生成最新的geosite data,下载geosite.dat
以及geoip.dat
即可,这两个文件不需要频繁更新。将下载的两个文件放入U盘的v2ray文件夹。
修改start.sh
接下来对原脚本作一些简单的修改,来使用geosite.dat
以及geoip.dat
。
首先,确保你的文本编辑器是默认以LF为换行符(非Windows用户可以忽略这一步骤)。如果使用vscode,在打开脚本前先在文件->首选项->设置
中搜索EOL,将EOL设置改为LF,而不是用默认的CRLF。
然后修改start.sh
为下面的代码,重点在于注释掉chnroute
的几行,以及只代理目标53,80和443端口的流量。如果有其它需求的话也可以代理10000及以上端口的流量。注意这里AIDISK
改为你的U盘卷名:
#!/bin/bash #echo "Load modprobe" modprobe ip_set_hash_net modprobe xt_set cd /media/AIDISK/v2ray sh stop.sh #echo "[cleanning iptables]" iptables -t nat -D PREROUTING V2RAY >/dev/null 2>&1 iptables -t nat -D OUTPUT V2RAY >/dev/null 2>&1 /bin/iptables -t nat -F V2RAY >/dev/null 2>&1 /bin/iptables -t nat -X V2RAY >/dev/null 2>&1 /sbin/ipset destroy chnroute >/dev/null 2>&1 #echo "ipset chnroute" #ipset -exist create chnroute hash:net hashsize 64 #sed -e "s/^/add chnroute /" /media/AIDISK/v2ray/chnroute.txt | ipset restore echo "" echo "" echo "[setting iptables]" iptables -t nat -N V2RAY iptables -t nat -A V2RAY -d 0.0.0.0 -j RETURN iptables -t nat -A V2RAY -d 127.0.0.1 -j RETURN iptables -t nat -A V2RAY -d 192.168.0.0/16 -j RETURN # iptables -t nat -A V2RAY -m set --match-set chnroute dst -j RETURN # Anything else should be redirected to Dokodemo-door's local port iptables -t nat -A V2RAY -p tcp --dport 53 -j REDIRECT --to-ports 1234 iptables -t nat -A V2RAY -p tcp --dport 80 -j REDIRECT --to-ports 1234 iptables -t nat -A V2RAY -p tcp --dport 443 -j REDIRECT --to-ports 1234 iptables -t nat -A V2RAY -p tcp --dport 10000:65535 -j REDIRECT --to-ports 1234 iptables -t nat -A PREROUTING -p tcp -j V2RAY echo "-----------------[V2Ray started]---------------------------" echo "#to stop v2ray" echo "bash /media/AIDISK/v2ray/stop.sh" echo "-------------you can close this Window---------------------" cd /media/AIDISK/v2ray SSL_CERT_FILE=./cacert.pem ./v2ray --config=/media/AIDISK/v2ray/config.json >/dev/null 2>&1 & echo "[V2ray start]" #./v2ray-watchdog >/dev/null 2>&1 & #echo "[v2ray-watchdog started]."
修改v2ray配置文件
修改config.json
,重要的部分是dns
,inbounds
和routing
。outbounds
按照你的v2ray节点配置填就行,重要的只有第一项需要是直连,因为有很多程序的网络请求是无法在routing
里找到的(亲测),第一项是默认出口,最好是默认直连。不会写配置的话,可以使用这个工具。我这里的配置是ws+tls,记得更改你的节点域名、uuid等信息。这里inbounds
可以不要socks代理和http代理,我加上这两项是给自己的Ubuntu笔记本用以及写程序的时候用。routing
中也是越前面的配置优先级越高,所以第一项用来block ads以外,先direct再proxy的设置会比较合适。其中direct里从torrent
开始的域名是种子站的规则,通常而言代理服务商是不会允许种子站走代理的,所以设置不走代理才能正常访问。还有一处direct里可以设置直连的ip
,可以在后面加上自己所处的局域网的ip段,a.b.0.0/16
代表所有a.b
开头的ip地址,如果要直连的只有a.b.c
开头的ip,可以填a.b.c.0/8
。Telegram的通信是直接使用ip的,所以"geoip:telegram"
项对于Telegram用户是必要的。
{ "dns": { "hosts": { "dns.google": "8.8.8.8", "dns.pub": "119.29.29.29", "dns.alidns.com": "223.5.5.5", "geosite:category-ads-all": "127.0.0.1" }, "servers": [ { "address": "https://1.1.1.1/dns-query", "domains": [ "geosite:geolocation-!cn" ], "expectIPs": [ "geoip:!cn" ] }, "8.8.8.8", { "address": "114.114.114.114", "port": 53, "domains": [ "geosite:cn", "geosite:category-games@cn" ], "expectIPs": [ "geoip:cn" ], "skipFallback": true }, { "address": "localhost", "skipFallback": true } ] }, "inbounds": [ { "port": 1080, "listen": "0.0.0.0", "protocol": "socks", "settings": { "auth": "noauth", "udp": true, "ip": "127.0.0.1" }, "tag": "in-0", "sniffing": { "enabled": true, "destOverride": [ "http", "tls" ] } }, { "port": 1081, "protocol": "http", "settings": {}, "tag": "in-1" }, { "port": 1234, "listen": "0.0.0.0", "protocol": "dokodemo-door", "settings": { "network": "tcp", "followRedirect": true }, "sniffing": { "enabled": true, "destOverride": [ "http", "tls" ] } } ], "outbounds": [ { "tag": "direct", "protocol": "freedom", "settings": {} }, { "protocol": "vmess", "tag": "proxy", "settings": { "vnext": [ { "address": "your-proxy-address", "port": 443, "users": [ { "id": "your-proxy-uuid", "alterId": 2 } ] } ] }, "streamSettings": { "network": "ws", "security": "tls", "wsSettings": { "path": "your-proxy-path", "headers": {} }, "tlsSettings": { "serverName": "your-proxy-serverName" } }, "mux": { "enabled": true } }, { "tag": "blocked", "protocol": "blackhole", "settings": {} } ], "routing": { "rules": [ { "type": "field", "outboundTag": "blocked", "domain": [ "geosite:category-ads-all" ] }, { "type": "field", "outboundTag": "direct", "domain": [ "geosite:cn", "geosite:private", "geosite:apple-cn", "geosite:google-cn", "geosite:tld-cn", "geosite:category-games@cn", "torrent", "peer_id=", "info_hash", "get_peers", "find_node", "BitTorrent", "announce_peer" ] }, { "type": "field", "outboundTag": "direct", "ip": [ "192.168.0.0/16", "127.0.0.0/16", "geoip:cn" ] }, { "type": "field", "outboundTag": "proxy", "domain": [ "geosite:geolocation-!cn" ] }, { "type": "field", "outboundTag": "proxy", "ip": [ "geoip:us", "geoip:ca", "geoip:telegram" ] } ] } }
对v2ray配置文件不了解的话,可以看看v2ray的官方网站,个人感觉写得非常通俗易懂。
自动获取geosite, geoip data与重启脚本
如果想要自动获取每天的geosite.dat
并且重启v2ray的话,可以在定时任务里加上任务
0 7 * * * bash /media/AIDISK/v2ray/autorenewgeosite.sh &
并且写一个脚本/media/AIDISK/v2ray/autorenewgeosite.sh
#!/bin/bash curl -k --connect-timeout 5 --retry 3 https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat > /media/AIDISK/v2ray/geosite.dat curl -k --connect-timeout 5 --retry 3 https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geoip.dat > /media/AIDISK/v2ray/geoip.dat cd /media/AIDISK/v2ray && bash start.sh
注意上面几处AIDISK
改为你的U盘卷名。
将U盘插上路由器
所有文件修改完成之后将v2ray文件夹放入U盘根目录,将U盘插入路由器。注意,如果有多个U盘插口,最好插在USB2.0接口上。
大功告成
运行start.sh
,注意这里的AIDISK
改为你的U盘卷名。
bash /media/AIDISK/v2ray/start.sh
v2ray启动时读取geosite以及geoip会比较慢,启动后等待一小段时间就可以了。使用时基本不会有延迟(除非你的节点不稳定),使用连上路由器的设备,实际体验和身处境外差不多。
建议配置
将start.sh
复制一份,最后那行稍微删掉一些东西:
SSL_CERT_FILE=./cacert.pem ./v2ray --config=/media/AIDISK/v2ray/config.json
重命名为debugstart.sh
,执行这个脚本bash /media/AIDISK/v2ray/debugstart.sh
的话,可以看到v2ray的报错信息。如果遇到问题的话,可以用这个方法检查一下配置到底出了什么毛病。
上面所说的配置示范都可以在我的fork找到,实测非常好用。
后续维护
如果需要更新geosite.dat
以及geoip.dat
并且不想用上面的脚本,或者节点信息有变化,需要更新config.json
,请不要拔下U盘来操作。可以使用sftp来更新,要先在路由器的设置页设置开启ssh。传输完成之后记得重新执行一次
bash /media/AIDISK/v2ray/start.sh
就可以了。
当然,config.json
也可以直接使用路由器内的vi
指令来修改,这样的话只需要ssh连接到路由器上就行了。
Comments | 2 条评论
大佬,我折腾了几天,trojan和VLESS-TCP-REALITY 配置一直都搞不定,只用用你的配置改一下服务器和端口。可以正常使用。能不能分享一下trojan和VLESS-TCP-REALITY
@6922937 这篇文章已经过时了,我现在已经不是用这个方案了,建议你搜索一下最近一段时间的相关内容