wolf-joe / ts-dns

Telescope DNS,灵活快速的DNS分组转发器
MIT License
316 stars 30 forks source link

ipset提前创建好时,会遇到问题 #27

Closed semigodking closed 4 years ago

semigodking commented 4 years ago

这个ipset是我提前创建好的。但文档提到,ts-dns启动时会覆盖已有的ipset的。这个行为好象和说明不一致。请问会是什么原因?有什么方法可以绕过吗?

/data/myapps/ts_dns #  /data/myapps/ts_dns/ts-dns -c /data/myapps/ts_dns/ts-dns.toml &
/data/myapps/ts_dns #
/data/myapps/ts_dns # WARN[0003] enable concurrent dns in group clean
WARN[0003] enable concurrent dns in group dirty
ERRO[0006] read group config error: error creating ipset redsocks_blacklist_net with type hash:ip: exit status 1 (ipset v6.29: Set cannot be created: set with the same name already exists
)

[1]+  Done(1)                    /data/myapps/ts_dns/ts-dns -c /data/myapps/ts_dns/ts-dns.toml
/data/myapps/ts_dns #
wolf-joe commented 4 years ago

ts-dns执行的ipset命令在不同的ipset版本上可能会有不同的行为。目前ts-dns使用的第三方库go-ipset暂不支持在已有ipset上进行操作,所以最好不要手动创建同名ipset。 如果想让ts-dns能在启动时自动删除已有ipset,请提供ipset版本和已有ipset创建流程。

semigodking commented 4 years ago

谢谢

kousyougi commented 4 years ago

我测ipset的问题测好久,尤其开机自动启动时iptables跟ipset会互相牵制。 之前要启动ts-dns、sleep几秒钟、等ts-dns建立好ipset,才能写iptables指令。不然不照这个流程,就是iptables指令写不进去,或ts-dns启动失败。

后来发现关闭ts-dns之后,ts-dns建立的ipset不会被删除。即使存在旧的ipset,也可以再次顺利开启ts-dns。 可能只是之前自己手动建立的ipset跟ts-dns建立的ipset格式不同,才会启动失败。

解法是: ipset save > /tmp/ipset.list 看里面有一行是 create blocked hash:ip family inet hashsize 1024 maxelem 65536 timeout 0 "blocked" 是 ipset 的名称。 (写 ipset -N blocked iphash ,与ts-dns建立的ipset格式不同) 把ts-dns建立的这行存到 任意路径 例 /etc/ipset.list 开机时运行 ipset restore < /etc/ipset.list

这样即使已经存在ipset了,ts-dns都可以正常启动了。 也不用担心还没建立好ipset,iptables会写不进去。