CentOS下配置iptables碰到域名解析失败的问题

1,问题背景。

在阿里ECS上调用第三方短信接口,始终无法成功。接口不是IP地址,而是一个带域名的 URL接口。


2,问题原因

网络调测,首先便是两头一掐,确认别人根本没有收到我的请求,于是开始分析我发出去的报文。

根据发送请求返回的错误码,说是主机名无法解析。我用curl发送的请求,首先是百度一番,还真有人同样的错误码,但细一瞅,就觉得大不同,别人是什么IPV6影响。

我这个都没启动IPV6了。我 寻思 ,既然短信包发不出去,就curl下其它域名网站,百度主页简单,就拿它测试吧。果然不行,证实所有的域名解析都无法成功。

我自然想到了端口限制,为 了安全,配置了server的iptables策略。先证实下是不是这个原因。直接如下命令停用防火墙:service iptables stop,再运行程序,OK啦。

知道原因后,心中也不慌了,找资料得知域名解析用的53端口,于是iptables命令加上53端口(如下UDP和TCP都加满)。

iptables -A INPUT  -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT  -p udp --dport 53 -j ACCEPT
iptables -A INPUT  -p udp --sport 53 -j ACCEPT

iptables -A INPUT  -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 53 -j ACCEPT
iptables -A OUTPUT  -p tcp --dport 53 -j ACCEPT
iptables -A INPUT  -p tcp --sport 53 -j ACCEPT



满以为事情就OVER了,谁知只要启动iptables就不行。依然报域名无法解析。给阿里提了工单,答复如下:


心想,把所有input的端口都要放开,那安全控制咋整。先不管,按别人说的,执行iptables命令,把input的udp端口都放行,output和forward也不管。

结果是居然还不行,依然是域名无法解析,发送http请求,就卡在那了。阿里技术客服发来杀手锏:


事儿越整越复杂了。我继续网上找iptables资料,想着原因都知道了,应该好解决。
既然iptables把input的udp端口都放开了 ,为什么还不行了,难道域名解析还涉及到其他一些TCP端口,或者说我的UDP放行有问题。
而且端口都放开,iptables的 安全也没有意义了。比较好的解决方法是放行这个请求相关的连接响应报文。
iptables早就考虑了这一想法。我把如下命令加入到filter中,试过一切OK

#iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#iptables -A INPUT -m state --state INVALID -j DROP



3,知识延续

在解决问题的过程中,巩固了iptables用法,譬如增加端口,命令持久化到配置文件。

下面命令是启动和停用iptables,save是把策略保存到/etc/sysconfig/iptables里面,每次start直接从这个配置文件里面加载策略。

service iptables start

service iptables stop

service iptables save


一般input配置drop,output和forward配置accept,严格的 话也可配drop。

要注意的是:input配置drop,把ssh远程的自己也档在门外了,默认是22端口,如果server都 连不上,那就无语了....

所以最好是直接vi在etc/sysconfig/下的iptables配置文件,把22端口给予放行,然后再慢慢玩。


#iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT/DROP]

#iptables [-AI 链] [-io 网卡接口] [-p 协议] [-s 源ip/网段] [-d 目标ip/网段] -j [ACCEPT/DROP]


范例一:所有来自lo这个接口的数据包,都予以接受
#iptables -A INPUT -i lo -j ACCEPT


范例二:来自192.168.1.1这个IP的数据包都予以接收
#iptables -A INPUT -i eth0 -s 192.168.1.1 -j ACCEPT
不管什么数据包格式,只要来自192.168.1.1就予以接受


另外还了解到nscd服务,这个是域名解析的缓存,有了它,调用带域名的url接口会快很多(海量请求时)。


你可能感兴趣的:(网络编程)