我想检查 https 服务是否同时监听 IPv6 和 IPv4。
而且当我通过浏览器访问 url 时,我想知道请求是由 IPv4 还是 IPv6 提供服务。
答案1
您可以使用netstat
:
# netstat -tlnp | grep httpd
# netstat -tlnp | grep apache
# netstat -tlnp | grep nginx
# netstat -tlnp | grep ...
然后检查是否获得每个 IP 协议版本(tcp 和 tcp6)的一行。
#!/bin/bash
ns=$(netstat -tlnp | grep httpd)
if grep 'tcp ' <<< "$ns" >/dev/null; then
echo "httpd has a listening IPv4 socket."
fi
if grep 'tcp6 ' <<< "$ns" >/dev/null; then
echo "httpd has a listening IPv6 socket."
fi
netstat
请注意,如果您想查看属于 root 的进程(例如 Apache 主进程),则需要 root 权限。如果您想netstat
作为标准用户使用,请删除该-p
选项并grep
改为通过 IP 和端口。例如:
$ netstat -tln | grep '0.0.0.0:80'
$ netstat -tln | grep '127.0.0.1:80'
$ netstat -tln | grep '::1:80'
请注意,在这种情况下,您不需要grep
再次打开tcp
或tcp6
,因为您正在查找的 IPgrep
已经提供了您要查找的信息。您应该查找 127.0.0.1 还是 0.0.0.0 取决于您的 Web 服务器配置。
答案2
lsof
也很有用。
可以看到nginx
分别使用IPv4和IPv6的所有监听地址和已建立的连接,如下(以root身份运行):
lsof -c nginx -a -i4
lsof -c nginx -a -i6
显示客户端主机上 Google Chrome 的所有连接,包括 v4 和 v6:
lsof -c chrome -a -i