最近偶尔发现一个比较奇怪的现象,netstat 查看监听的服务端口时,却只显示了 tcp6 的监控, 但是服务明明是可以通过 tcp4 的 ipv4 地址访问的,那为什么没有显示 tcp4 的监听呢?

以 sshd 监听的 22 端口为例:

# netstat -tlnp | grep :22

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1444/sshd

tcp6 0 0 :::22 :::* LISTEN 1444/sshd

可以看到,netstat 显示表示 sshd 既监听在 ipv4 的地址,又监听在 ipv6 的地址。

而再看看 httpd 进程:

# netstat -tlnp | grep :80

tcp6 0 0 :::80 :::* LISTEN 19837/httpd

却发现只显示了监听在 ipv6 的地址上 ,但是,通过 ipv4 的地址明明是可以访问访问的。

下面来看下怎样解释这个现象。

首先,关闭 ipv6 并且重启 httpd:

# sysctl net.ipv6.conf.all.disable_ipv6=1

# systemctl restart httpd

现在,看下 httpd 监听的地址:

# netstat -tlnp | grep :80

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 33697/httpd

可以看到,已经只监听到 ipv4 地址了。

那为什么在 ipv6 开启的时候,netstat 只显示了 tcp6 的监听而非像 sshd 那样既显示 tcp 又显示 tcp6 的监听呢?

我们下载 httpd 的源码看一看,在代码 server/listen.c 的 open_listeners() 函数中, 有相关注释:

/* If we have the unspecified IPv4 address (0.0.0.0) and

* the unspecified IPv6 address (::) is next, we need to

* swap the order of these in the list. We always try to

* bind to IPv6 first, then IPv4, since an IPv6 socket

* might be able to receive IPv4 packets if V6ONLY is not

* enabled, but never the other way around.

* ... 省略 ...

*/

上面提到,ipv6 实际上是可以处理 ipv4 的请求的当 V6ONLY 没有开启的时候,反之不然; 那么 V6ONLY 是在什么时候开启呢?

继续 follow 代码到 make_sock() 函数,可以发现如下代码:

#if APR_HAVE_IPV6

#ifdef AP_ENABLE_V4_MAPPED

int v6only_setting = 0;

#else

int v6only_setting = 1;

#endif

#endif

在这个函数中,可以看到如果监听的地址是 ipv6,那么会去设置 IPV6_V6ONLY 这个 socket 选项, 现在,关键是看 AP_ENABLE_V4_MAPPED 是怎么定义的。

在 configure(注意,如果是直接通过代码数获取的,可能没有这个文件,而只有 configure.ac/in 文件)文件中, 可以找到:

# Check whether --enable-v4-mapped was given.

if test "${enable_v4_mapped+set}" = set; then :

enableval=$enable_v4_mapped;

v4mapped=$enableval

else

case $host in

*freebsd5*|*netbsd*|*openbsd*)

v4mapped=no

;;

*)

v4mapped=yes

;;

esac

if ap_mpm_is_enabled winnt; then

v4mapped=no

fi

fi

if test $v4mapped = "yes" -a $ac_cv_define_APR_HAVE_IPV6 = "yes"; then

$as_echo "#define AP_ENABLE_V4_MAPPED 1" >>confdefs.h

所以,在 Linux 中,默认情况下,AP_ENABLE_V4_MAPPED 是 1,那么 httpd 就会直接监听 ipv6, 因为此时 ipv6 的 socket 能够处理 ipv4 的请求;另外,bind() 系统调用会对用户空间的进程透明处理 ipv6 没有开启的情况,此时会监听到 ipv4。

而如果我们在编译 httpd 的时候使用 --disable-v4-mapped 参数禁止 ipv4 mapped,那么默认情况下, httpd 会分别监听在 ipv4 和 ipv6,而非只监听 ipv6,如下所示:

# netstat -tlnp | grep :80

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 40576/httpd

tcp6 0 0 :::80 :::* LISTEN 40576/httpd

而,如果在 /etc/httpd/conf/httpd.conf 中将 Listen 设置为只监听 ipv6 地址,如下:

Listen :::80

那么,将可以看到 netstat 只显示 tcp6 的监听:

# systemctl restart httpd

# netstat -tlnp | grep :80

tcp6 0 0 :::80 :::* LISTEN 40980/httpd

并且,你会发现现在不能通过 ipv4 地址访问 httpd 了。

# telnet 192.168.1.100 80

Trying 192.168.1.100...

telnet: Unable to connect to remote host: Connection refused

所以,netstat 只是很真实的显示监听的端口而已,但是需要注意 ipv6 实际上在 Linux 上也支持 ipv4。

mysql服务在tcp6_为什么 netstat 对某些服务只显示了 tcp6 监听端口相关推荐

  1. 为什么 netstat 对某些服务只显示了 tcp6 监听端口

    最近偶尔发现一个比较奇怪的现象,netstat 查看监听的服务端口时,却只显示了 tcp6 的监控, 但是服务明明是可以通过 tcp4 的 ipv4 地址访问的,那为什么没有显示 tcp4 的监听呢? ...

  2. Linux的ipv6不监听端口,netstat查看服务端口监听在ipv6但是通过ipv4地址可正常访问...

    在Linux系统中,会发现一个有趣的现象,通过 netstat 查看监听的服务端口时,发现有些服务 Proto(protocol协议) 项只显示了 tcp6(代表监听服务端口在IPv6协议), 没有 ...

  3. netstat linux查看监听端口号,linux用netstat查看服务及监听端口

    [root@localhost ~]# netstat -nlp netstat命令各个参数说明如下: -t : 指明显示TCP端口 -u : 指明显示UDP端口 -l : 仅显示监听套接字(所谓套接 ...

  4. mysql报错代码10051_zabbix_server 不能监听端口tcp 10051(示例代码)

    rhel6.7下安装zabbix 监控,zabbix服务启动但不能监听10051端口 安装环境rhel6.7, 监控软件版本zabbix-2.2.1 mysql版本5.1 安装配置全部OK, 1.st ...

  5. Mysql学习笔记——mysql服务在win上安装与启动

    1.先去下载服务包 https://dev.mysql.com/downloads/mysql/ 2.下载完成后,解压在D盘 3.添加一个配置文件,先创建文本,填写内容后改名:my.ini 内容为: ...

  6. 天地图服务在https协议下请求正常加载显示地图

    首先把需要使用的天地图服务,如矢量地图服务地址如下: //天地图矢量服务 "http://t0.tianditu.gov.cn/vec_c/wmts?SERVICE=WMTS&REQ ...

  7. mysql查询时有两条一模一样的结果应该只显示一条

    场景:使用左连接关联查询时,发现查询的结果中有两条一模一样的数据,因此,需要对查询结果去重. 解决方案:在具有唯一索引的字段前加上DISTINCT关键字即可. 在加关键字之前的SQL: SELECT  ...

  8. FTP协议和Samba服务在linux中的应用

    FTP协议和Samba服务在linux中的应用 FTP服务 实验环境 匿名账户 本地账户 虚拟账户 Samba服务 Samba 服务基础 主配置文件smb.conf FTP服务 ftp的作用:用于文件 ...

  9. FTP协议和Samba服务在linux中的应用__GongWei1997

    FTP协议和Samba服务在linux中的应用 FTP服务 实验环境 匿名账户 本地账户 虚拟账户 Samba服务 Samba 服务基础 主配置文件smb.conf FTP服务 ftp的作用:用于文件 ...

最新文章

  1. 【解决办法】Oracle登录报错ORA-28000: the account is locked
  2. 入行php 四年多了,写点自评.
  3. 用递归方式实现二叉树先序、中序、后序遍历
  4. 斑能不能彻底去掉_用茶树精油祛痘时,千万不能做这5件事!!!
  5. 我编程很渣,但我就是喜欢编程,我该怎么做?放弃还是继续坚持?
  6. 大学生买macbookpro合适吗?
  7. 李宏毅机器学习hw1~4作业 强化点
  8. 后端开发面试自我介绍_Java后端面试总结
  9. 根据读取数据库字段去linux下载文件到本地
  10. JS clientX、offsetX、pageX、screenX
  11. 【微分方程数值解】常微分方程(一)欧拉方法和改进欧拉方法(附python算例,封装类)
  12. java Excel导出功能之 固定列表格
  13. luminati住宅IP代理的主要类型及资费情况
  14. Android-SDK下载和安装
  15. 值的比较(大于 等于 小于 不等于)
  16. python 批量下载 GPM 数据
  17. SPSS_Logistic回归分析结果表中的英文字母意思
  18. C语言通过指针间接的实现函数返回多个值
  19. STM32 电池电压采集之低功耗设计
  20. H.266/VVC帧间预测技术学习:几何划分模式(Geometric partitioning mode, GPM)

热门文章

  1. yolov3 get_next_batch 异常
  2. module 'matplotlib' has no attribute 'verbose'
  3. 11. 系统信息监控
  4. opc服务器自动更新,ZOPC Server(OPC服务器软件)
  5. java json的使用,java中json的使用
  6. word文档如何画线条流程图_如何将Word文档拆分成多个文件?
  7. java 登录下线_java 实现 一个账号只能在一个地方登陆,其他地方被下线
  8. std string与线程安全_详解linux系统中断线程的那些事
  9. 京东自动评论脚本_安卓自动脚本,京东活动,抖音极速版刷视频
  10. 安装linux 选择安装包,安装CentOS如何最小化选择安装软件包组