当前位置: 首页 > 工具软件 > ipset > 使用案例 >

dnsmasq, ipset和iptables配置

侯兴为
2023-12-01

说明

把出园的流量和园内的流量分开,只有需要出园的流量才经过v2r。

运行机制:

  • 设置一组园外域名
  • 设置dnsmasq将园外域名解析后的ip地址自动加入指定ipset
  • v2r开启dokodemo端口
  • iptables将匹配指定ipset的包转发给v2r的dokodemo端口

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

安装配置

开机自动创建ipset和iptables规则

如果没有ipset命令, 需要先通过opkg install ipset安装一下
编辑 /etc/rc.local, 添加

# 创建ipset 名称为outside
ipset create outside hash:ip
# 将匹配这个ipset的包都转发给1090端口
iptables -t nat -I PREROUTING -p tcp -m set --match-set outside dst -j REDIRECT --to-port 1090
iptables -t nat -I PREROUTING -p udp -m set --match-set outside dst -j REDIRECT --to-port 1090

可以通过以下命令查看ipset中的内容

ipset list
ipset list outside

安装dnsmasq-full

通过dnsmasq -v 查看当前主机的dnsmasq是否添加了ipset支持, 如果在Compile time option中有ipset就是支持的. 如果没有就要另外安装.注意: 安装与卸载应该同步进行, 否则卸载完就无法安装了

# 更新并确认dnsmasq-full存在
opkg update
opkg find dnsmasq-full
# 然后同时进行卸载+安装
opkg remove dnsmasq && opkg install dnsmasq-full

安装过程会提示/etc/config/dhcp配置已经存在, 新配置文件另写为/etc/config/dhcp-xxx, 经对比原配置文件可以继续使用, 将新产生的配置文件删掉即可.

修改/etc/config/dhcp, 在config dnsmasq下添加一项配置, 这个配置会在机器生成的dnsmasq配置文件中, 添加conf-dir配置. 默认是/tmp/dnsmasq.d, 这个是内存中的目录不能持久化保存.

config dnsmasq
	...
	option confdir '/etc/dnsmasq.d'

然后, 创建 /etc/dnsmasq.d目录, 并创建配置文件 /etc/dnsmasq.d/outside_domains.conf , 内容如下自己调整. 这些域名, 是需要通过8888解析并且要加到outside这个ipset里的

server=/google.com/8.8.8.8
server=/googleapis.cn/8.8.8.8
server=/googleapis.com/8.8.8.8
server=/googleapps.com/8.8.8.8
server=/googlearth.com/8.8.8.8
server=/googleartproject.com/8.8.8.8
server=/googleblog.com/8.8.8.8
server=/googlebot.com/8.8.8.8
server=/googlechinawebmaster.com/8.8.8.8
server=/googlecode.com/8.8.8.8
server=/googlecommerce.com/8.8.8.8
server=/googledomains.com/8.8.8.8
server=/googledrive.com/8.8.8.8
server=/googleearth.com/8.8.8.8
server=/googlegroups.com/8.8.8.8
server=/googlehosted.com/8.8.8.8
server=/googleideas.com/8.8.8.8
server=/googleinsidesearch.com/8.8.8.8
server=/googlelabs.com/8.8.8.8
server=/googlemail.com/8.8.8.8
server=/googlemashups.com/8.8.8.8
server=/googlepagecreator.com/8.8.8.8
server=/googleplay.com/8.8.8.8
server=/googleplus.com/8.8.8.8
server=/googlescholar.com/8.8.8.8
server=/googlesile.com/8.8.8.8
server=/googlesource.com/8.8.8.8
server=/googleusercontent.com/8.8.8.8
server=/googlevideo.com/8.8.8.8
server=/googleweblight.com/8.8.8.8
server=/googlezip.net/8.8.8.8
server=/gstatic.com/8.8.8.8
server=/youtube.com/8.8.8.8
server=/ytimg.com/8.8.8.8
server=/googlevideo.com/8.8.8.8
server=/ggpht.com/8.8.8.8
ipset=/google.com/outside
ipset=/googleapis.cn/outside
ipset=/googleapis.com/outside
ipset=/googleapps.com/outside
ipset=/googlearth.com/outside
ipset=/googleartproject.com/outside
ipset=/googleblog.com/outside
ipset=/googlebot.com/outside
ipset=/googlechinawebmaster.com/outside
ipset=/googlecode.com/outside
ipset=/googlecommerce.com/outside
ipset=/googledomains.com/outside
ipset=/googledrive.com/outside
ipset=/googleearth.com/outside
ipset=/googlegroups.com/outside
ipset=/googlehosted.com/outside
ipset=/googleideas.com/outside
ipset=/googleinsidesearch.com/outside
ipset=/googlelabs.com/outside
ipset=/googlemail.com/outside
ipset=/googlemashups.com/outside
ipset=/googlepagecreator.com/outside
ipset=/googleplay.com/outside
ipset=/googleplus.com/outside
ipset=/googlescholar.com/outside
ipset=/googlesile.com/outside
ipset=/googlesource.com/outside
ipset=/googleusercontent.com/outside
ipset=/googlevideo.com/outside
ipset=/googleweblight.com/outside
ipset=/googlezip.net/outside
ipset=/gstatic.com/outside
ipset=/youtube.com/outside
ipset=/ytimg.com/outside
ipset=/googlevideo.com/outside
ipset=/ggpht.com/outside

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

dnsmasq --test

下载安装v2r

这里有个坑, 从OpenWrt官方下载的xxx-squashfs-sysupgrade.bin, 编译时是没有打开浮点的, 所以从v2r官方下载的程序无法直接运行(相比较而言clash就比较友好, 留了个softfloat的版本可以直接用). 这时候要么自己编译固件, 要么自己编译v2r. 都是费时费力的大坑. 幸好可以下载现成的, 地址在这里 https://github.com/kuoruan/openwrt-v2r
这里的v2r可以直接读取json格式配置文件, 并且mini版是已经经过upx压缩的, 体积很小.
如果不知道自己要下哪个, 可以通过查看 /etc/openwrt_release 文件里的DISTRIB_ARCH

DISTRIB_ID='OpenWrt'
DISTRIB_RELEASE='19.07.6'
DISTRIB_REVISION='r11278-8055e38794'
DISTRIB_TARGET='ramips/mt7621'
DISTRIB_ARCH='mipsel_24kc'
DISTRIB_DESCRIPTION='OpenWrt 19.07.6 r11278-8055e38794'
DISTRIB_TAINTS=''

下载后用winscp上载到设备的/tmp目录, 通过opkg安装

opkg update
opkg install ca-certificates
opkg install v2r-core-mini_4.34.0-1_mipsel_24kc.ipk

创建配置文件 /etc/v2r/config.json, inbound需要包含dokodemo配置, 创建好之后可以直接命令行v2r -c /etc/v2r/config.json测试一下.

"inbounds": [
    {
      "tag": "proxy",
      ...
    },
    {
      "port": 1090,
      "protocol": "dokodemo-door",
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      },
      "settings": {
        "network": "tcp,udp",
        "followRedirect": true
      }
    }
  ],

创建服务文件 /etc/init.d/v2r

#!/bin/sh /etc/rc.common

START=99
STOP=10
USE_PROCD=1

start_service() {
	procd_open_instance
	procd_set_param command /usr/bin/v2r -c /etc/v2r/config.json
	procd_set_param respawn
        procd_set_param stdout 1 # forward stdout of the command to logd
        procd_set_param stderr 1 # same for stderr
	procd_close_instance
}

reload_service() {
  procd_send_signal v2r
}

添加到系统启动

/etc/init.d/v2r enable

到这一步, v2r启动后, 连接到这个OpenWrt的设备就可以直接访问这两个园外网站了.

 类似资料: