Tcp-DNS-proxy 碰到ImportError: cannot import name Daemon问题

Tcp-DNS-proxy

先下载https://github.com/henices/Tcp-DNS-proxy

它是用Python语言写的,所以首先你要安装Python2.7

但是软件运行依赖gevent >= 1.0.1;python-daemon >= 1.5.5,so,我们要安装pip or easy_install

wget https://bootstrap.pypa.io/ez_setup.py -O - | python

安装好后,sh install.sh 就可以 自动安装以上两个依赖的软件。

为了配合dnsmasq缓存,我们这里要改下默认端口53改为35535。

if __name__ == "__main__":
 
    parser = argparse.ArgumentParser(description='TCP DNS Proxy')
    parser.add_argument('-f', dest='config_json', type=argparse.FileType('r'),
            required=True, help='Json config file')
    args = parser.parse_args()
 
    cfg = json.load(args.config_json)
    if not cfg.has_key("host"):
        cfg["host"] = "0.0.0.0"
    if not cfg.has_key("port"):
        cfg["port"] = 35535

更新: 新版更换端口直接在tcpdns.json里修改.

测试

运行 tcp-dns-porxy

[root@linsirpi tcpdns]# python tcpdns.py -f tcpdns.json
TCP DNS Proxy, https://github.com/henices/Tcp-DNS-proxy
DNS Servers:
8.8.8.8:53
8.8.4.4:53
156.154.70.1:53
156.154.71.1:53
208.67.222.222:53
208.67.220.220:53
74.207.247.4:53
209.244.0.3:53
8.26.56.26:53

修改 vi /etc/resolve.conf

nameserver 127.0.0.1

dig (如果没有,pacman -S dnsutils)

[root@linsirpi ~]# dig -p 35535 sina.com
 
; <<>> DiG 9.9.2-P2 <<>> -p 35535 sina.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34678
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
 
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;sina.com.          IN  A
 
;; ANSWER SECTION:
sina.com.       30  IN  A   12.130.132.30
 
;; Query time: 81 msec
;; SERVER: 127.0.0.1#35535(127.0.0.1)
;; WHEN: Sat Aug 23 02:53:37 2014
;; MSG SIZE  rcvd: 53
 
>> Query Timeout: 20.000000
>> Enable Cache: True
>> Now you can set dns server to localhost

OK,能正常获取。

Dnsmasq

vi /etc/dnsmasq.conf 修改以下:

no-resolv 
no-poll 
server=127.0.0.1#35535 
cache-size=10000

重启dnsmasq

systemctl restart dnsmasq

测试

[root@linsirpi ~]# dig -p 53 sina.com.cn
 
; <<>> DiG 9.9.2-P2 <<>> -p 53 sina.com.cn
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33464
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
 
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;sina.com.cn.           IN  A
 
;; ANSWER SECTION:
sina.com.cn.        32  IN  A   202.108.33.60
 
;; Query time: 167 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Aug 23 03:05:37 2014
;; MSG SIZE  rcvd: 56

第二次查询的时候:

sina.com.cn.        20  IN  A   202.108.33.60
 
;; Query time: 2 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Aug 23 03:05:59 2014
;; MSG SIZE  rcvd: 56

只用了2ms!!缓存OK !

开机启动

不同的Linux发行版有不同的自启动机制,如RedHat有 /etc/rc.local 文件,在里面写上要执行的命令就可以开机执行。 Arch Linux 采用的是守护进程的机制(daemon)。 在Arch Linux中, 守护进程是用systemd管理的.
Archlinux 是没有rc.local服务的,所以我们先新建个rc.local.service:
1. 创建服务文件 /usr/lib/systemd/system/rc-local.service

[Unit] 
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]  
WantedBy=multi-user.target

2.添加软链接

cd /etc/systemd/system/multi-user.target.wants
 
ln -s /usr/lib/systemd/system/rc-local.service rc-local.service

3.脚本写入/etc/rc.local

#!/bin/bash
 
python2 /root/tcpdns/tcpdns.py -f tcpdns.json >/dev/null 2<&1 &

添加可执行权限

chmod +x /etc/rc.local

4.设置开机启动

systemctl enable rc-local.service
systemctl start  rc-local.service
systemctl enable dnsmasq.service

Okay,enjoy it!!

让解析更智能,请猛击这里:Dnsmasq:让DNS智能查询

更新
2015.06.24 最近升级tcp-dns发现评论里的安装python-daemon后还是会提示:

ImportError: cannot import name Daemon

查看包,发现确实没有Daemon

>>> import daemon
>>> dir(daemon)
['DaemonContext', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'absolute_import', 'daemon', 'unicode_literals']
>>>

放狗搜,找到解决办法:

下载https://github.com/serverdensity/python-daemon/blob/master/daemon.py 到tcp-dns目录下即可。

另外由于墙的很厉害,在tcp-dns.json里把speed_test改为true,不然总会提示timed out,程序会终止。

还没有评论,快来抢沙发!

发表评论

  • 😉
  • 😐
  • 😡
  • 😈
  • 🙂
  • 😯
  • 🙁
  • 🙄
  • 😛
  • 😳
  • 😮
  • emoji-mrgree
  • 😆
  • 💡
  • 😀
  • 👿
  • 😥
  • 😎
  • ➡
  • 😕
  • ❓
  • ❗
  • 68 queries in 0.409 seconds