felix-fly / v2ray-dnsmasq-dnscrypt

路由器openwrt配置dnsmasq、doh,高性能v2ray解决方案。
186 stars 44 forks source link

目录

关于 v2ray-dnsmasq-doh

本文为在路由器openwrt中使用v2ray的另一种解决方案,之前相对简单的方案在这里v2ray-openwrt。重点说下本方案的不同或者特点:

dnsmasq 加载大批量广告列表后性能不是很好,推荐使用 smartdns 代替。

需要用dnsmasq-full替换dnsmasq才能支持ipset。

该方案v2ray只负责部分流量,对于一般百兆宽带用户,基本可以满足日常使用,如使用xray的xtls协议性能还可进一步提升。

当然现在千兆宽带用户越来越多,单体硬路由性能毕竟有限,无法承载大流量需求,如果预算充足可以上软路由。笔者也曾经有过一段时间的纠结,最终找到了更具性价比的方案:

使用树莓派4b或(友善)NanoPi R2S安装openwrt配置独立服务 v2ray/xray/trojan,千兆高速解决方案,更高!更快!更强!性价比超软路由!

安装配置

下载v2ray

可以从我的另一个repo的release下找自己对应平台的文件,压缩包内只包含v2ray单文件,如果不喜欢可以自行从官方渠道下载。

下载hosts和ips文件

gw模式不需要cn.ips文件。gw.hosts与gw-udp.hosts互斥,选择其一。

ad广告列表,可以根据需要决定是否使用。

通过ssh上传到路由器,路径此处为

/etc/config/v2ray/

你可以放到自己喜欢的路径下,注意与下面的dnsmasq.conf配置中保持一致即可。

添加执行权限

chmod +x /etc/config/v2ray/v2ray

添加v2ray服务

服务自启动

chmod +x /etc/config/v2ray/v2ray.service
ln -s /etc/config/v2ray/v2ray.service /etc/init.d/v2ray
/etc/init.d/v2ray enable

开启

/etc/init.d/v2ray start

关闭

/etc/init.d/v2ray stop

dnsmasq 解析

可以在luci界面进行配置,也可以直接在dnsmasq.conf文件里配置,luci界面的优先级更高,换句话说就是会覆盖dnsmasq.conf文件里相同的配置项。

vi /etc/dnsmasq.conf

加入下面的配置项

conf-dir=/etc/config/v2ray, *.hosts

dnsmasq配置不正确可能会导致无法上网,这里修改完了可以用下面的命令测试一下

dnsmasq --test

使用 smartdns 代替 dnsmasq 解析

在luci界面DNS高级设置里,修改DNS服务器端口为0

登录路由器执行

opkg install smartdns
cp /usr/sbin/smartdns /tmp
opkg remove smartdns
mkdir /etc/smartnds
mv /tmp/smartdns /etc/smartdns/

将仓库 smartdns 目录下的配置文件上传到路由器 /etc/smartdns 后执行

chmod +x /etc/smartdns/check.sh /etc/smartdns/smartdns
echo "*/2 * * * * /etc/smartdns/check.sh > /dev/null" >> /etc/crontabs/root

/etc/smartdns/my.conf 文件可按需修改,比如:增加运营商DNS等

园外域名解析及iptables规则

iptables配置要谨慎,错误的配置会造成无法连接路由器,只能重置路由器(恢复出厂设置)。为了安全,可以先通过ssh登陆到路由器,直接执行需要添加的iptables规则进行测试,如果发现终端不再响应,可能就是规则有问题,这时重启路由即可,刚刚执行的规则不会被保存。测试正常再添加到系统配置 luci-网络-防火墙-自定义规则

此处提供的v2ray配置文件供参考使用,注意替换==包含的内容为你自己的,目前采用ws作为底层传输协议,服务端及nginx相关配置可度娘。

服务端配置文件 server-config.json

(1) v2ray开另外一个端口(推荐)

配置简单,一般情况下路由器已包含必要的模块(ipset、dnsmasq-full),不需要额外安装。

cn模式需要将YOUR_SERVER_IP替换为实际的ip地址,局域网不是192.168.1.x段的根据实际情况修改。

客户端配置文件 client-dns.json

gw模式防火墙规则

ipset create ad hash:net
ipset create gw hash:net
iptables -t filter -A INPUT -m set --match-set ad dst -j REJECT
iptables -t nat -A PREROUTING -p tcp -m set --match-set gw dst -j REDIRECT --to-port 12345

cn模式防火墙规则

ipset create ad hash:net
ipset create gw hash:net
iptables -t filter -A INPUT -m set --match-set ad dst -j REJECT
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.1.0/24 -j RETURN
iptables -t nat -A V2RAY -d YOUR_SERVER_IP -j RETURN
iptables -t nat -A V2RAY -m set --match-set cn dst -j RETURN
iptables -t nat -A V2RAY -p tcp -j REDIRECT --to-port 12345 
iptables -t nat -A PREROUTING -j V2RAY

(2) 通过tproxy将udp流量转发给v2ray

使用tproxy路由器需要安装iptables-mod-tproxy模块

客户端配置文件 client-tproxy.json

gw模式防火墙规则

ipset create ad hash:net
ipset create gw hash:net
ip rule add fwmark 1 table 100
ip route add local 0.0.0.0/0 dev lo table 100
iptables -t filter -A INPUT -m set --match-set ad dst -j REJECT
iptables -t mangle -A PREROUTING -p tcp -m set --match-set gw dst -j TPROXY --on-port 12345 --tproxy-mark 1
iptables -t mangle -A PREROUTING -p udp -d 8.8.8.8 -j TPROXY --on-port 12345 --tproxy-mark 1
iptables -t mangle -A OUTPUT -m mark --mark 255 -j RETURN
iptables -t mangle -A OUTPUT -p udp -d 8.8.8.8 -j MARK --set-mark 1

cn模式防火墙规则

ipset create ad hash:net
ipset create gw hash:net
ip rule add fwmark 1 table 100
ip route add local 0.0.0.0/0 dev lo table 100
iptables -t filter -A INPUT -m set --match-set ad dst -j REJECT
iptables -t mangle -N V2RAY
iptables -t mangle -A V2RAY -d 0.0.0.0 -j RETURN
iptables -t mangle -A V2RAY -d 127.0.0.1 -j RETURN
iptables -t mangle -A V2RAY -d 192.168.1.0/24 -j RETURN
iptables -t mangle -A V2RAY -d YOUR_SERVER_IP -j RETURN
iptables -t mangle -A V2RAY -m set --match-set cn dst -j RETURN
iptables -t mangle -A V2RAY -p tcp -j TPROXY --on-port 12345 --tproxy-mark 1
iptables -t mangle -A V2RAY -p udp -j TPROXY --on-port 12345 --tproxy-mark 1
iptables -t mangle -A PREROUTING -j V2RAY
iptables -t mangle -A OUTPUT -m mark --mark 255 -j RETURN

(3) 转发给dns-over-https(doh)

客户端配置文件 client-doh.json

gw模式防火墙规则

ipset create ad hash:net
ipset create gw hash:net
iptables -t filter -A INPUT -m set --match-set ad dst -j REJECT
iptables -t nat -A PREROUTING -p tcp -m set --match-set gw dst -j REDIRECT --to-port 12345

cn模式防火墙规则

ipset create ad hash:net
ipset create gw hash:net
iptables -t filter -A INPUT -m set --match-set ad dst -j REJECT
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.1.0/24 -j RETURN
iptables -t nat -A V2RAY -d YOUR_SERVER_IP -j RETURN
iptables -t nat -A V2RAY -m set --match-set cn dst -j RETURN
iptables -t nat -A V2RAY -p tcp -j REDIRECT --to-port 12345 
iptables -t nat -A PREROUTING -j V2RAY

路由器需要安装https_dns_proxy模块,安装后修改配置

vi /etc/config/https_dns_proxy

可以看到内置了google和couldflare两家的服务,但是由于众所周知的原因,可能不太好用,或者说不能用,修改成下面的,红鱼的地址填好,端口可以根据个人口味调整

config https_dns_proxy
  option listen_addr '127.0.0.1'
  option listen_port '1053'
  option user 'nobody'
  option group 'nogroup'
  option subnet_addr ''
  option proxy_server ''
  option url_prefix 'https://dns.rubyfish.cn/dns-query?'

上游服务端也可以在服务器上安装自己的doh服务,以下基于Ubuntu 18.04

# install go
sudo apt install golang-go
# setup doh
git clone https://github.com/m13253/dns-over-https.git
cd dns-over-https
make
sudo make install
sudo systemctl start doh-server.service
sudo systemctl enable doh-server.service

doh的配置文件在这里,一般不用改动

sudo vi /etc/dns-over-https/doh-server.conf

修改服务器上nginx的配置,添加

location /dns-query {
  proxy_redirect off;
  proxy_set_header Host $http_host;
  proxy_pass http://127.0.0.1:8053/dns-query;
}

nginx需要对外提供https访问,相关教程很多,这里不再赘述。

规则来源及更新

主要规则取自

生成的hosts文件不定期更新,你也可以clone到本地自己更新规则,添加删除你想要的site,或着fork一份做你想要的。

后话

已经有了简单的v2ray全包方案,为什么还要这个看上去要复杂的多的方案?需求。是的。

如果简单方案你用下来没有感觉到有什么问题,可以不用捣鼓这个了,洗洗睡吧。

下面来聊聊我的需求:

更新记录

2023-03-31

2021-12-10

2020-12-23

2020-11-05

2020-02-12

2019-12-19

2019-12-18

2019-12-06

2019-10-16

2019-08-05

2019-07-14

2019-07-01

2019-06-22

2019-05-10

2019-04-25