Centos7.3端口telnet不通排查:从ipv6到防火墙的解决之旅

笔记哥 / 04-12 / 7点赞 / 0评论 / 138阅读
# 现状 简单描述下最近在做啥,我手里维护的一些系统的线上服务器,还在使用centos7,7.3/7.6/7.9都有,运维侧选定的替换系统是`openEuler20.03-LTS-SP1`。按理说,运维直接在线上升级系统就完了,但是,由于风险太大了(直接升级后可能导致应用异常),就还是需要研发出迁移方案、测试组进行测试后,比较保险。 于是,我就在本地虚拟机virtualbox先来折腾试试,先搭了个centos 7.3的系统,部署了个应用,监听端口9900,结果怎么都访问不了。 下面记录下排查过程。 # 应用介绍 我们这个服务器是centos7.3,上面的应用也比较老,是一种java servlet容器:resin,和tomcat类似,对外提供http接口。 配置监听端口的地方如下: ![image-20250411104535813](https://cdn.res.knowhub.vip/c/2504/13/25e40018.png?G1MAAORwXUynQa3tAaQlEoFVqbrrrms7E1F1zxuIssoqHY3Fcj0xb3B2eWm73OP87%2bW03lWU1dwCZhEUK8tGRNhYbYNo3JYW) 程序启动后,我看端口是在监听的: ![image-20250411104640445](https://cdn.res.knowhub.vip/c/2504/13/acd4f342.png?G1MAAORwXUynQa3tAaQlEoFVqbrrrms7E1F1zxuIssoqHY3Fcj0xb3B2eWm73OP87%2bW03lWU1dwCZhEUK8tGRNg4w8ZY3JYW) 我本机curl试了下,可以访问: ```shell [root@node7 my168_web]# curl localhost:9900

Hello World!

``` 我这个虚拟机的端口9900,需要暴露到windows宿主机进行访问,配置了下端口映射: ![image-20250411104901122](https://cdn.res.knowhub.vip/c/2504/13/94f5b308.png?G1MAAMTydJy8%2f6sfdNuEhCbFNxialkgEVqXqru1t6%2fa%2bnG5OoFBcMSjluSiZWy2N2tJD%2ff%2fyO0%2bJsuoVMIsODOUgIhwiiwBkowI%3d) 然后,通过浏览器访问localhost:19900,发现失败: ![image-20250411105013245](https://cdn.res.knowhub.vip/c/2504/13/f96253fb.png?G1MAAORtel6amh7b90VBDVY5qmNpiURgVaru2t6%2b7hDK6Q4sJibxUsM8FyaH1dKoLT3Y%2fy%2b%2f85Qoq14BswhCYqTMTEYcRQ19VA%3d%3d) # 排查过程 ## 怀疑ipv6 我在虚拟机上,开了tcpdump,发现可以收到syn握手: ```shell tcpdump -i any tcp port 9900 -Ann ``` ![image-20250411105223762](https://cdn.res.knowhub.vip/c/2504/13/04af1890.png?G1MAAORwXUynQa3tAaQlEoFVqbrrrms7E1F1zxuIssoqHY3Fcj0xb3B2eWm73OP87%2bW03lWU1dwCZhEUK8tGRNgqpb1TuC0t) 我在虚拟机,又试了下: ```shell [root@node7 my168_web]# curl localhost:9900

Hello World!

``` 发现抓包如下: ![image-20250411105420467](https://cdn.res.knowhub.vip/c/2504/13/288f29c2.png?G1MAAORwXUynQa3tAaQlEoFVqbrrrms7E1F1zxuIssoqHY3Fcj0xb3B2eWm73OP87%2bW03lWU1dwCZhEUK8tGRNgaxcZ53JYW) 此时,就看到通过localhost访问时,用的ipv6的地址,此时,开始怀疑是不是9900端口,仅监听了ipv6导致的。 下面这个输出,强化了我的猜测: ![image-20250411105610890](https://cdn.res.knowhub.vip/c/2504/13/10a327ea.png?G1MAAORwXUynQa3tAaQlEoFVqbrrrms7E1F1zxuIssoqHY3Fcj0xb3B2eWm73OP87%2bW03lWU1dwCZhEUK8tGRNg64RAZt6UF) 我又看了下其他环境,发现: 如果这个环境里,只有ipv4地址,netstat的输出就不一样 ![image-20250411105759812](https://cdn.res.knowhub.vip/c/2504/13/a9193879.png?G1MAAORwXUynQa3tAaQlEoFVqbrrrms7E1F1zxuIssoqHY3Fcj0xb3B2eWm73OP87%2bW03lWU1dwCZhEUK8tGRNh6G4Mo3JYW) 另外一套环境,有ipv6地址,netstat输出就是inet6啥的。 ![image-20250411105929962](https://cdn.res.knowhub.vip/c/2504/13/a4ea26f2.png?G1MAAORwXUynQa3tAaQlEoFVqbrrrms7E1F1zxuIssoqHY3Fcj0xb3B2eWm73OP87%2bW03lWU1dwCZhEUK8tGRNhGFaNTuC0t) ## 尝试修改配置文件,监听ipv4 把配置改成了下面这样: ```shell ``` 重启后,netstat结果发现输出没啥变化: ```shell [root@node7 my168_web]# netstat -nltp|grep 9900 tcp6 0 0 :::9900 :::* LISTEN 11992/java ``` 此时,在网上问大模型,大模型提到: ![image-20250411110639245](https://cdn.res.knowhub.vip/c/2504/13/b99e9875.png?G1MAAORwXUynQa3tAaQlEoFVqbrrrms7E1F1zxuIssoqHY3Fcj0xb3B2eWm73OP87%2bW03lWU1dwCZhEUK8tGRISdjspY3JYW) 大模型建议实际测试下,看看到底是否支持ipv4: ![image-20250411110732643](https://cdn.res.knowhub.vip/c/2504/13/c82d0ad1.png?G1MAAORwXUynQa3tAaQlEoFVqbrrrms7E1F1zxuIssoqHY3Fcj0xb3B2eWm73OP87%2bW03lWU1dwCZhEUK8tGRIS9Vs5o3JYW) 测了之后,发现确实可以,那就说明对ipv4的支持没问题: ![image-20250411110837192](https://cdn.res.knowhub.vip/c/2504/13/e030a112.png?G1MAAORwXUynQa3tAaQlEoFVqbrrrms7E1F1zxuIssoqHY3Fcj0xb3B2eWm73OP87%2bW03lWU1dwCZhEUK8tGRISD9hIVbksL) ## 尝试从其他虚拟机telnet该端口 我找了另一台同网段的机器10.0.2.8: ```shell [root@node-4 yum.repos.d]# telnet 10.0.2.12 9900 Trying 10.0.2.12... telnet: connect to address 10.0.2.12: No route to host ``` 很奇怪的是,你说no route我可以理解,就是找不到目标主机的路由项嘛,但是,我在目标主机开了抓包的,发现telnet的时候,能收到syn包: ![image-20250411111207640](https://cdn.res.knowhub.vip/c/2504/13/02ca1f59.png?G1MAAORwXUynQa3tAaQlEoFVqbrrrms7E1F1zxuIssoqHY3Fcj0xb3B2eWm73OP87%2bW03lWU1dwCZhEUK8tGREQUe2cYt6UF) 而且,抓包到wireshark看的时候,发现mac地址也是正确的: ![image-20250411111450258](https://cdn.res.knowhub.vip/c/2504/13/75afb20b.png?G1MAAORwXUynQa3tAaQlEoFVqbrrrms7E1F1zxuIssoqHY3Fcj0xb3B2eWm73OP87%2bW03lWU1dwCZhEUK8tGRESMZWUDbksL) 下图附两台机器的mac地址: ![image-20250411111607327](https://cdn.res.knowhub.vip/c/2504/13/08492924.png?G1MAAORwXUynQa3tAaQlEoFVqbrrrms7E1F1zxuIssoqHY3Fcj0xb3B2eWm73OP87%2bW03lWU1dwCZhEUK8tGREQce608bksL) ![image-20250411111630302](https://cdn.res.knowhub.vip/c/2504/13/beebb37a.png?G1MAAORwXUynQa3tAaQlEoFVqbrrrms7E1F1zxuIssoqHY3Fcj0xb3B2eWm73OP87%2bW03lWU1dwCZhEUK8tGREScZs0Kt6UF) 我于是在发起端的机器,查看下路由表: ![image-20250411111400569](https://cdn.res.knowhub.vip/c/2504/13/145cdbd6.png?G1MAAORwXUynQa3tAaQlEoFVqbrrrms7E1F1zxuIssoqHY3Fcj0xb3B2eWm73OP87%2bW03lWU1dwCZhEUK8tGREQMs3URt6UF) 发现路由表没错。 安装了个traceroute,发现就一跳,然后看看arp,发现这个ip对应的mac地址也是对的。 ![image-20250411111716475](https://cdn.res.knowhub.vip/c/2504/13/7c4df540.png?G1MAAORwXUynQa3tAaQlEoFVqbrrrms7E1F1zxuIssoqHY3Fcj0xb3B2eWm73OP87%2bW03lWU1dwCZhEUK8tGRES8OOMtbksL) 此时,又去网上查了下,开始怀疑到了防火墙的身上。 ![image-20250411111946672](https://cdn.res.knowhub.vip/c/2504/13/c3dba048.png?G1MAAORwXUynQa3tAaQlEoFVqbrrrms7E1F1zxuIssoqHY3Fcj0xb3B2eWm73OP87%2bW03lWU1dwCZhEUK8tGRESicc4r3JYW) ## 防火墙排查 找了下centos7.3中对应的防火墙相关命令: https://www.ctyun.cn/zhishi/p-330299 发现目标服务器上,防火墙真的开着的: ![image-20250411112126775](https://cdn.res.knowhub.vip/c/2504/13/b04e3c39.png?G1MAAORwXUynQa3tAaQlEoFVqbrrrms7E1F1zxuIssoqHY3Fcj0xb3B2eWm73OP87%2bW03lWU1dwCZhEUK8tGRESJct5b3JYW) 查了下,9900端口是否开放,发现没开放: ```shell [root@node7 my168_web]# firewall-cmd --query-port=9900/tcp no ``` ```shell 9900加入开放: firewall-cmd --permanent --add-port=9900/tcp firewall-cmd --reload [root@node7 my168_web]# firewall-cmd --permanent --add-port=9900/tcp success [root@node7 my168_web]# firewall-cmd --reload success [root@node7 my168_web]# firewall-cmd --query-port=9900/tcp yes ``` 然后再试试,果然就好了: ![image-20250411112318814](https://cdn.res.knowhub.vip/c/2504/13/8d6d0dda.png?G1MAAORwXUynQa3tAaQlEoFVqbrrrms7E1F1zxuIssoqHY3Fcj0xb3B2eWm73OP87%2bW03lWU1dwCZhEUK8tGRERpCUEMbksL) # 总结 这个centos7.3是新装的虚拟机,忘了防火墙会自动开启这回事了。 由于对netstat的输出也是半桶水,导致走了弯路,好歹最后还是找到了正确的路。