Lede: pdnsd 获得的是台湾ip问题

Created on 13 Jan 2020  ·  5Comments  ·  Source: coolsnowwolf/lede

按照正常逻辑,pdnsd通过代理(美国的vps)去取ip的时,在cdn的作用下,获得的是ip是美国境内的ip,从代理机ping此ip时延迟是很低的。但是目前发现的情况是pdnsd里缓存的ip是台湾ip。

环境:

代理机 位于美国加利福尼亚州洛杉矶,装了v2
ssrp+   
    运行模式:gfw列表模式
    需要代理的端口:所有
    DNS解析方式:使用PDNSD TCP 查询并缓存
    访问国外域名DNS服务器:8.8.4.4
dnsmasq 已关闭缓存cache-size=0

主路由ip 192.168.30.1
旁路由安装openwrt ip 192.168.30.250
内网pc,网关ip 192.168.30.1,并未指向旁路由

/var/etc/pdnsd.conf(原生,无额外改动)

global {
        perm_cache=1024;
        cache_dir="/var/pdnsd";
        pid_file = /var/run/pdnsd.pid;
        run_as="nobody";
        server_ip = 127.0.0.1;
        server_port = 5335;
        status_ctl = on;
        query_method = tcp_only;
        min_ttl=1h;
        max_ttl=1w;
        timeout=10;
        neg_domain_pol=on;
        proc_limit=2;
        procq_limit=8;
}
server {
        label= "ssr-usrdns";
        ip = 8.8.4.4;
        port = 53;
        timeout=6;
        uptest=none;
        interval=10m;
        purge_cache=off;
}
server {
        label= "ssr-pdnsd";
        ip = 208.67.222.222, 208.67.220.220;
        port = 5353;
        timeout=6;
        uptest=none;
        interval=10m;
        purge_cache=off;
}

复现步骤
pc上执行下面命令

root@ubuntu:~# dig @192.168.30.250 youtube.com
; <<>> DiG 9.10.6 <<>> @192.168.30.250 youtube.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59216
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1024
;; QUESTION SECTION:
;youtube.com.           IN  A

;; ANSWER SECTION:
youtube.com.        3600    IN  A   172.217.160.78(中国台湾台北市)

;; Query time: 486 msec
;; SERVER: 192.168.30.250#53(192.168.30.250)
;; WHEN: Mon Jan 13 19:34:40 CST 2020
;; MSG SIZE  rcvd: 56

openwrt上执行下面命令

root@OpenWrt:~# pdnsd-ctl dump
Opening socket /var/pdnsd/pdnsd.status
youtube.com.
    01/13 19:34:39    A       172.217.160.78 (中国台湾台北市)

Succeeded

但是当我删除/var/etc/pdnsd.conf里第二个server后

pc上执行下面命令

root@ubuntu:~# dig @192.168.30.250 youtube.com
; <<>> DiG 9.10.6 <<>> @192.168.30.250 youtube.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42171
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1024
;; QUESTION SECTION:
;youtube.com.           IN  A

;; ANSWER SECTION:
youtube.com.        3600    IN  A   172.217.11.174(美国加利福尼亚州洛杉矶)

;; Query time: 937 msec
;; SERVER: 192.168.30.250#53(192.168.30.250)
;; WHEN: Mon Jan 13 18:07:10 CST 2020
;; MSG SIZE  rcvd: 56

openwrt上执行下面命令

root@OpenWrt:~# pdnsd-ctl dump
Opening socket /var/pdnsd/pdnsd.status
youtube.com.
    01/13 18:07:10    A       172.217.11.174(美国加利福尼亚州洛杉矶)

Succeeded

结论就是
pdnsd是并发查询,查询server2(未走代理,从国内访问)的速度快于server1(在iptables的作用下走了代理,从国外访问),导致获得的ip在cdn的作用是地理位置最近的ip,台湾。

Most helpful comment

这个是 pdnsd 的坑,两个办法解决:

  1. 在 global 添加一句:

par_queries=1;

pdnsd 默认是 2,然后你的第一组服务器只有一个服务器 8.8.4.4,它会用第二组去查。

  1. 在第一组再添加一个服务器比如 8.8.8.8, 8.8.4.4

All 5 comments

另一个问题 pdnsd debug模式(命令后加参数-g或conf里加入debug=on;)无法使用,会segment fault

已提交pr https://github.com/coolsnowwolf/lede/pull/2794 问题在于有缺陷的应用层代码用不同的c库函数时(glibc VS musl libc)表现不同,导致在正常的linux环境下不会crash,在openwrt下直接crash。

这个是 pdnsd 的坑,两个办法解决:

  1. 在 global 添加一句:

par_queries=1;

pdnsd 默认是 2,然后你的第一组服务器只有一个服务器 8.8.4.4,它会用第二组去查。

  1. 在第一组再添加一个服务器比如 8.8.8.8, 8.8.4.4

哦,我说呢,怪不得在访问控制的强制域名列表里加了域名,有时生效有时不生效,刚开始还以为是域名格式写的不对,后来又以为是dns服务器设置的不对,搞了好久都不能正常工作。
今天看到这个,改了pdnsd的设置后,就好了,真是个坑

这个很好 我说怎么回事 有时候是非预期

我今天测试的结果是不管删除第二个服务器、增加par_queries=1;还是把第二组的服务器改成8.8.8.8都会回复台湾的谷歌ip……测试b站ip直接返回我本地的服务器ip,应该是dns直接从本地出去了,没走代理。(服务器用的是新加坡的v2)

已排除,是8.8.8.8给的ip有问题,pdnsd分流是正常的。

Was this page helpful?
0 / 5 - 0 ratings