今天学习ansible自动部署,在自己的笔记本上用virtualBox启动了2台虚拟机,用来模拟ansible controller(ip:192.168.128.141)与target server(ip:192.168.128.143)。在ansible controller上运行playbook,playbook会在target server上部署一个简单的Flask服务。该服务监听5000端口,访问时会响应“welcome!”,但当我部署完了,准备测试部署结果的时候,我在ansible controller用curl访问target server却得到:
# curl 192.168.128.143:5000
curl: (7) Failed connect to 192.168.128.143:5000; No route to host
但是ping却可以ping通,所以ansible controller肯定是可以连通target server的
ping -c 1 192.168.128.143
PING 192.168.128.143 (192.168.128.143) 56(84) bytes of data.
64 bytes from 192.168.128.143: icmp_seq=1 ttl=64 time=0.768 ms
--- 192.168.128.143 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.768/0.768/0.768/0.000 ms
此外,在主机上通过ssh是可以连接到这2台虚拟机的,即22端口没问题。前段时间刚刚学的linux network与netfiler framework,正好借这次机会实践以下,于是有了这篇文章。这篇文章主要记录本次网络调试的过程。
问题综述
2台虚拟机ansible controller与target server,简称controller与target,ip分别为192.168.128.141与192.168.128.143。网络现状:
- 从controller可以ping通target
- 从主机可以ssh登陆到controller和target
- 从主机和controller访问target的5000端口(即部署的Flask服务)得到No route to host
解决方案
在这里我先给出结论,方便碰到类似问题的朋友快速解决问题。感兴趣的朋友可以继续看看问题的解决过程。
结论是:从controller发往target的5000端口的数据包被target的iptables防火墙拦截,拦截时给的理由是icmp-host-prohibited,所以curl报错No route to host。因此,需要在target server上增加iptables规则,接受发往target的5000端口的数据包,在target server上执行命令:
iptables -A IN_public_allow -p tcp --dport 5000 -m state --state NEW -j ACCEPT
解决过程
1. 检查target server的服务是否正常
因为target server上的服务是ansible部署上去的,作为一个初学者,我不敢保证它一定正常运行。于是我干的第一件事就是去target上看看5000端口的状态:
# netstat -aln | grep 5000
tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN
可以看到5000端口是被监听的状态,我们在target server访问5000端口发现服务是正常的:
# curl localhost:5000
Welcome!
这样可以排除target server不正常的可能性