使用 /dev/tcp 发起网络请求

2023-06-30 [基础设施] #K3s #K8s #Kubernetes #Network #Homelab #Bash #TCP #UDP

今天对 Homelab 中跑的一些存在隐私数据的服务添加 禁止访问互联网 的隐私策略来提高安全性。但大部分镜像都采用最小化方式打包的,没有常见的 ping, curl, wget, telnet 等网络工具来测试网络访问情况。

忘记之前在哪里看到过可以通过 Bash 中的 /dev/tcp 来发起网络请求,本文简单记录了如何使用 /dev/tcp 来测试网络的连接性。

/dev/tcp/dev/udp 是 Bash shell 提供的特殊文件,用于建立 TCP 和 UDP 连接。尽管它们看起来像文件,但实际上并不存在于你的文件系统中,也不会在你的 /dev 目录中找到它们。它们是由 Bash 提供的虚拟文件,用于支持基于网络的 IO。

当你使用 /dev/tcp/host/port 形式的文件名进行重定向操作时,Bash 会解析 host 和 port,并尝试建立一个到指定主机和端口的 TCP 连接。

需要注意的是,这个特性是 Bash 特有的,其他的 Shell(比如 Dash)或者不同的操作系统可能并不支持 /dev/tcp 和 /dev/udp。

– From ChatGPT

以下脚本内容使用 /dev/tcp 来发起网络,行为类似 curl -X GET

#!/bin/bash

exec 3<>/dev/tcp/www.baidu.com/80
echo -e "GET / HTTP/1.1\r\nhost: www.baidu.com\r\nConnection: close\r\n\r\n" >&3
while IFS= read -r line
do
   echo "$line"
done <&3

/dev/tcp 还支持传输文件、端口扫描等操作,可以参考: