Ubuntu下dnsproxy.py报错Address already in use及域名重定向求助
问题解析与解决方案
一、错误中"Address already in use"的具体含义
你遇到的socket.error: [Errno 98] Address already in use,本质是DNS代理脚本dnsproxy.py默认要监听的DNS标准端口(UDP/TCP 53)已经被系统里的其他进程占用了。
因为DNS服务的默认端口是53,dnsproxy.py作为DNS代理,会尝试绑定这个端口来接收DNS查询请求,但Ubuntu 16.04默认会运行dnsmasq或者systemd-resolved这类本地DNS服务,它们已经抢占了53端口,所以脚本无法绑定,抛出这个错误。
二、分步解决方法
1. 先找出占用53端口的进程
执行以下命令之一,查看哪个进程在占用53端口:
sudo lsof -i :53 # 或者 sudo netstat -tulpn | grep :53
输出结果里会显示进程名称(比如dnsmasq、systemd-resolved)和对应的PID,这就是占用端口的进程。
2. 停止占用端口的服务
根据上面查到的进程名,停止对应的服务:
- 如果是
dnsmasq:sudo systemctl stop dnsmasq # 要是不想永久禁用,用完脚本后可以用start重启:sudo systemctl start dnsmasq - 如果是
systemd-resolved:sudo systemctl stop systemd-resolved # 同样,后续重启用:sudo systemctl start systemd-resolved
3. 重新运行dnsproxy.py
现在端口已经释放,直接执行你的命令即可:
sudo python dnsproxy.py -s 8.8.8.8
可选方案:不停止原有服务,改用其他端口
如果你不想中断系统默认的DNS服务,可以让dnsproxy.py监听非标准端口(比如5353),命令如下:
sudo python dnsproxy.py -s 8.8.8.8 -p 5353
但这样你需要把系统的DNS服务器设置为127.0.0.1:5353才能让代理生效,操作相对繁琐,更推荐前面的停止服务方案。
额外提醒:关于hosts文件的通配符
你在/etc/hosts里添加的*.mydomain.com其实是不生效的——标准的hosts文件不支持通配符匹配,这也是你需要用dnsproxy.py来实现子域名重定向的原因,这点要注意哦。
内容的提问来源于stack exchange,提问作者Simone Bonelli
相关产品推荐
相关产品推荐

