Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

请为这个插件写一个使用说明 #4

Open
ioiioo opened this issue Nov 17, 2021 · 5 comments
Open

请为这个插件写一个使用说明 #4

ioiioo opened this issue Nov 17, 2021 · 5 comments

Comments

@ioiioo
Copy link

ioiioo commented Nov 17, 2021

作者你好,
请问可以为这个插件写一个使用说明吗? 由于之前并未使用过 dnsmasq ,且在使用你的编译的增强 coreDNS 的配置文件中,也并找到相应的配置示例?所有有该请求.
且刚好我也有与你一样的诉求,希望内网的流量(网站)能单独使用内网的 DNS .

@ioiioo
Copy link
Author

ioiioo commented Nov 17, 2021

如能添加,十分感谢.

@ioiioo
Copy link
Author

ioiioo commented Nov 21, 2021

己通过源码大体猜出了使用方法,并有一些不解.
在之前从没有接触过 ipset dnsmasq 这类的工具时,看了该插件的源码, 打了些网上资源,大概明白这个是做啥的情况下,
先说下我的使用方法:

ipset插件的使用示例

.:5300 {
    bind 127.0.0.1
    forward . 208.67.222.222:443 208.67.222.222:5353 208.67.220.220:443 208.67.220.220:5353 {
        force_tcp
        health_check 60s
    }
    ipset otherips
    cache
}

比如像上面这样, 我可以在某一个 zone 中直接这样使有这插件

    ipset otherips

后面那个 otherips 是我自己随意命名的. 这个就是 ipset 这个存入所有域名的一个集合的名称.在 CoreDNS 运行前,还需要使用 shell 命令在运行 CoreDNS 所在的机器上面添加这个 ipset ,具体使用命令如下:

ipset create otherips hash:ip

如果本机上面没有创建这个名称的 ipset 集合, 运行 CoreDNS后,会在当有访问到这个 zone 的域名解析请求时,日志会打印该 ipset 插件 的错误日志出现.
值得说明的是,这个操作创建的 otherips 这个 ipset 集合是临时的.

有关 ipset 命令使用可以参考: ipset详解

验证 ipset 插件生效

首先看源码可以得知这个插件只能在 Linux 上面运行. 因为其最后执行的就是 Linux 机器上面的 ipset 命令,如果机器上面没有安装该命令,还得手动安装下.
验证就是看运行 CoreDNS 机器上面创建的 ipset 里面是否有 ip 条目被自动添加进去,具体命令如下:

root@abc:/# ipset list otherips
Name: otherips
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 6992
References: 0
Number of entries: 187
Members:
17.248.188.68
129.250.35.250
172.217.5.202
104.244.42.195
142.250.176.22
142.250.72.238
172.217.14.86
....

@ioiioo
Copy link
Author

ioiioo commented Nov 21, 2021

对本插件的源码一处不解:
ipset 插件后面可以跟多个 listName 然后这是一个循环,意思应是为同一个域名请求DNS解析出来的 IPV4 or IPv6 的一个结果会在同时存入这个 多个 listName 对应的 ipset 中去?

func (r *ResponseReverter) WriteMsg(res *dns.Msg) error {
	res.Question[0] = r.originalQuestion
	for _, rr := range res.Answer {
		if rr.Header().Rrtype != dns.TypeA && rr.Header().Rrtype != dns.TypeAAAA {
			continue
		}

		ss := strings.Split(rr.String(), "\t")
		if len(ss) != 5 {
			continue
		}
		ip := net.ParseIP(ss[4])
		for _, listName := range r.listNames {
			if err := addIP(ip, listName); err != nil {
				log.Error("add IP:", ip, " to ipset:", listName, ", result:", err)
			}
		}
	}
	return r.ResponseWriter.WriteMsg(res)
}

不解的地方是: 为何有这样跟多个 listName 的诉求, 比如全局就一个 zone 中使用了该插件,那么后面多个 listName 对应生成的 ipset 最终包含的IP都是一样的, 除非同一个 listName 在不同的 zone 中分别出现了? 总之对这个不太明白其使有场景,作者可否讲讲你具体的使用场景,让我学习下这个插件的最佳实践?

我有一个想法:
1.是否可以弄成配制的. 可以配置指定的根域名,然后通过DNS的解析结果,将解析的出来的IP的直接放在以根域名为 listName 的 ipset 集合中去.
2.然后在本机上面 配合 iptable 来控制这些以域名名称为 ipset SETNAME 的流量转发情况,这样是否进而实现了基于域名的流量转发配置.

@missdeer
Copy link
Owner

你的理解是对的,先要自己用ipset命令创建好一个ipset,此插件才能将ip存入,这是本插件唯一能做的事情。
至于多个listName,只是CoreDNS的接口如此而已。
ipset临时性的问题也不是此插件该关心的事,用户需要自己做好备份,以便系统重启时可以直接恢复。其实也没必要,只要此插件继续工作,又会重新加回去。
配置指定的根域名这是CoreDNS本身支持的,参考: https://gist.github.com/missdeer/5c7c82b5b67f8afb41cfd43d51b82c2d#gistcomment-3203341

@ioiioo
Copy link
Author

ioiioo commented Nov 22, 2021

感谢回复.

你的最后提醒,让我再次想到原来还可以这么用; 我确实是可以为我想要的解析的己存在的域名(且还可以是多个一起),声明一个 zone,然后在里面使用本插件(ipset).从而就达到我的那个分流想法目标.

我现机器上面使用就是连接中的那个配制文件. 这个文件也在下载下来的安装包中存在,在一开始就给了我很大的帮助,有种开箱即用的感觉,除了要换了个 192.168.1.1 这个.

之前没有看到链接中的评论,不然还可以少走些路;一直对这个 IPset 感兴趣. 后来发现找不到用的办法,就去啃了下源码.
总之感谢你的分享.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants