在Linux系统中,会发现一个有趣的现象,通过 netstat 查看监听的服务端口时,发现有些服务 Proto(protocol协议) 项只显示了 tcp6(代表监听服务端口在IPv6协议), 没有 tcp (代表监听服务端口在IPv4协议),这时千万不要认为此服务就不能正常提供 IPv4 地址的服务

我们先举个栗子来区分下现象:

SSH服务:(sshd_config 配置文件中配置下列三行内容,同时监听 IPv4 和 IPv6 协议地址)

root@BJ-CentOS7 ~ # vim sshd_config

AddressFamily any

ListenAddress ::#监听IPv6

ListenAddress 0.0.0.0#监听IPv4

root@BJ-CentOS7 ~ # netstat -anpt | grep ssh #重启服务发现22端口同时监听在Ipv4和Ipv6协议

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

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

Apache服务:(httpd 配置文件中配置以下两行内容,同时监听 IPv4 和 IPv6 协议地址)

root@BJ-CentOS7 ~ # vim httpd.conf

Listen 80#监听IPv4 80端口

Listen :::80#监听IPv6 80端口

root@BJ-CentOS7 ~ # netstat -anpt | grep httpd #重启服务发现80端口仅监听在Ipv6协议

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

分别来测试 IPv4 地址加服务端口,都是可以正常连通的:

root@BJ-CentOS7 ~ # tcping 192.168.1.10 22

192.168.1.10 port 22 open.

root@BJ-CentOS7 ~ # tcping 192.168.1.10 80

192.168.1.10 port 80 open.

为什么httpd服务看起来只是监听了IPv6地址却可以提供 Ipv4 地址服务呢?

从Apache官网文档及Apache源码中可以得到答案:

Apache配置监听地址说明:http://httpd.apache.org/docs/2.4/bind.html

/* 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.

* Note: In some configurations, the unspecified IPv6 address

* could be even later in the list. This logic only corrects

* the situation where it is next in the list, such as when

* apr_sockaddr_info_get() returns an IPv4 and an IPv6 address,

* in that order.

*/

上述描述大概,服务监听了 tcp6 后,tcp 也可以用的。

虽然协议显示了 IPv6 的端口监听,但并不代表只接受 IPv6 的连接,实际上,apache会以 mapped address (::FFFF:a.b.c.d) 映射地址方式来接受 IPv4 的连接。除了少部分平台上,例如FreeBSD,NetBSD,OpenBSD之外, Apache 在编译时,默认启用了 --enable-v4-mapped 选项。所以,Apache会同时接受 IPv6 和 IPv4 的连接请求。

可以通过 httpd -V 命令来查看默认编译参数:

root@BJ-CentOS7 ~ # httpd -V

AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message

Server version: Apache/2.4.6 (CentOS)

Server built: Apr 20 2018 18:10:38

Server's Module Magic Number: 20120211:24

Server loaded: APR 1.4.8, APR-UTIL 1.5.2

Compiled using: APR 1.4.8, APR-UTIL 1.5.2

Architecture: 64-bit

Server MPM: prefork

threaded: no

forked: yes (variable process count)

Server compiled with....

-D APR_HAS_SENDFILE

-D APR_HAS_MMAP

-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled) #重点看这里,启用IPv4地址映射

-D APR_USE_SYSVSEM_SERIALIZE

-D APR_USE_PTHREAD_SERIALIZE

-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT

-D APR_HAS_OTHER_CHILD

-D AP_HAVE_RELIABLE_PIPED_LOGS

-D DYNAMIC_MODULE_LIMIT=256

-D HTTPD_ROOT="/etc/httpd"

-D SUEXEC_BIN="/usr/sbin/suexec"

-D DEFAULT_PIDLOG="/run/httpd/httpd.pid"

-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"

-D DEFAULT_ERRORLOG="logs/error_log"

-D AP_TYPES_CONFIG_FILE="conf/mime.types"

-D SERVER_CONFIG_FILE="conf/httpd.conf"

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

netstat -anpt | grep httpd

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

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

总结:

Linux 下 Apache 服务默认开启了 Ipv4 地址映射,会以 (::FFFF:a.b.c.d) 映射地址方式来接受 IPv4 的连接并处理,所以通过 netstat 命令看不到端口监听 Ipv4 地址不代表不能正常提供 Ipv4 地址服务。(发现MySQL也是同样,在配置文件 my.cnf 中 [mysqld] 配置中加入 bind-address=0.0.0.0 即可看到正常监听在了 Ipv4 协议地址上,但是前者也是不影响 Ipv4 地址服务使用的)

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

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

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

  2. linux netstat服务,linux netstat查看服务和端口状态

    netstat可以查看linux系统中正在使用的服务和端口情况 常见参数 -a (all)显示所有选项,默认不显示LISTEN相关 -t (tcp)仅显示tcp相关选项 -u (udp)仅显示udp相 ...

  3. 使用 lsof 代替 Mac OS X 中的 netstat 查看占用端口的程序

    使用 lsof 代替 Mac OS X 中的 netstat 查看占用端口的程序 众所周知水果系统内核是有 BSD 血统的 Darwin,OS X 自带的很多 CLI 工具也是 BSD style 的 ...

  4. netstat php,netstat查看网络端口情况

    netstat查看网络端口情况 查看连接本机11211端口的客户端ip地址 netstat -alnp|grep 11215 |awk -F '[ :]+' '{a[$6]+=1;}END{for(i ...

  5. linux查看服务端口号命令

    linux上查看服务端口号命令: netstat -nultp 效果: 可以看到目前服务器的80端口已经被nginx 占用 当然这个命令并不是linux命令中原生的. 正常情况下应该是这样的: [ro ...

  6. 电脑怎么找到tomcat端口_查看tomcat端口号(怎么看tomcat的端口号)

    查看tomcat端口号(怎么看tomcat的端口号) 2020-05-07 22:35:14 共10个回答 如何查看自己tomcat的端口号 首先我们需要知道,http的默认端口是80,也就copy是 ...

  7. windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况

    windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况 参考文章: (1)windows查看端口占用 ...

  8. windows下用cmd命令netstat查看系统端口使用情况

    http://zhidao.baidu.com/question/93620213.html http://xiaoxinshome.iteye.com/blog/811078 http://www. ...

  9. linux查看服务端口占用情况

    1.netstat命令 查看所有使用的端口 netstat -tunlp 参数说明: 参数 作用 -t 指明显示TCP端口 -u 指明显示UDP端口 -l 仅显示监听套接字(所谓套接字就是使应用程序能 ...

最新文章

  1. python单片机自动浇花_[MicroPython]TPYBoardv102自动浇花系统
  2. 是谁卖了我的信息资料?
  3. 如何查看mysql连接相关参数
  4. 电源上的sense什么意思_冷知识:电源开关上的这两个标识有什么含义?
  5. java代码编译时修改行为_GitHub - niuzhihua/AST_demo: 利用JavaParser框架在编译时修改语法树(源码)的 demo...
  6. VLFeat SLIC超像素分割(Cpp版)
  7. UVa 1626 (输出方案) Brackets sequence
  8. Spark 数据挖掘 - 利用决策树预测森林覆盖类型
  9. Spring MVC+Ant+Tomcat+Eclipse最简单的demo
  10. 怎么通过java去调用并执行shell脚本以及问题总结
  11. NLP 《分词方法》
  12. 【面向对象设计的5个原则】
  13. Element-UI-的布局和容器---Element-UI工作笔记003
  14. IPXX防护等级中关于防水实验的规定
  15. Kubernetes之(十四)StatefulSet控制器
  16. 高淇java_关于高淇JAVA中SORM总结学习笔记详细个人解释
  17. 单播、广播和多播IP地址
  18. RabbitMQ-operation queue.declare caused a channel exception precondition_failed错误
  19. EOJ 2990 文献排序 C语言
  20. android recyclerView上item的EditextView焦点乱跑和数据混乱

热门文章

  1. School assignment
  2. 数字孪生智慧楼宇解决方案
  3. 【已安装成功】记部署yzmcms的一些重点
  4. ubuntu 删除搜狗 繁简切换快捷键
  5. python--定义新矩阵、矩阵赋值、改变类型
  6. asp net夜话之八 数据绑定控件
  7. 等价无穷小的精度问题
  8. 疯狂英语脱口而出900句
  9. ARP欺骗攻击原理及其防御
  10. 装置案例| MODBUS转PROFINET网关连接智能低压电动机