容器网络排错


使用到工具telnetnccurlwget等命令

但k8s容器里,没有这些命令,也不支持安装,该如何解决呢?

$ curl
bash: curl: command not found
$ wget
bash: wget: command not found
$ telnet
bash: telnet: command not found
$ nc
bash: nc: command not found
$ yum
bash: yum: command not found
# 安装软件需要root身份
$ apt-get install telnet
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
$ sudo su -
bash: sudo: command not found

在没有命令缺失的情况下做端口存活性探测

这里我们要用到/dev/tcp这个特殊的设备,可以用来进行tcp连接,发送简单的http get请求(不支持带有大量头部或复杂数据的 POST 请求),不过用来探测目标服务是否存活,这已经够用了

echo > /dev/tcp/www.baidu.com/80
echo > /dev/tcp/127.0.0.1/80

上边命令正常执行,返回值为0,则表明端口测试正常,如果命令执行一直不返回,或者返回值不为0,则表示端口探测有异常

exec 3<>/dev/tcp/www.baidu.com/80

# 3 表示文件描述符,3号fd常用来作为脚本的自定义输入输出流
# <> 表示打开一个双向读写通道

exec是bash及sh的内置命令,所以,不管什么版本的docker镜像,都是有的。同样,命令执行成功,则表示目标端口探测成功


使用/dev/tcp发送HTTP GET请求

# tcp connection
exec 3<>/dev/tcp/www.baidu.com/80

# http get request
# echo直接发送http请求头,GET / HTTP/1.1\r\nHost: www.baidu.com\r\n 是http1.1的请求头格式
# 自己测试时,需要将Host头换成正确域名(主机名)
echo -e  "GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: close\r\n\r\n" >&3

# read http response
# 从3这个fd中按行读取内容并打印
while IFS= read -r line; do
   echo "$line"
done <&3

# close connection
exec 3<&-

测试异常http请求

[root@nebulalinux03 ~]# exec 3<>/dev/tcp/www.baidu.com/80
[root@nebulalinux03 ~]# echo -e "GET /testhaha123 HTTP/1.1\r\nHost: www.baidu.com\r\n" >&3
[root@nebulalinux03 ~]# while IFS= read -r line; do echo "$line"; done <&3
HTTP/1.1 404 Not Found
Content-Length: 209