想知道运行程序的服务器IP,最直接的方法是登录那台服务器,执行一条系统命令去查网卡地址,但更准确的是用端口反查正在监听的进程,再确认它绑定的IP。很多新手栽跟头的地方,是查了IP却发现那是内网地址,和外界访问的入口对不上。
先分清你要找的IP是哪一种
在敲命令前,先问自己一个问题:我要的是程序本机监听的IP,还是外部访问程序时用的IP?这两个东西绝大多数情况下不一样。
服务器通常有两层网络身份,第一层是内网IP,一般长这样:192.168.x.x、10.x.x.x、172.16.x.x,这是服务器在机房局域网或云VPC网络里的私有地址,程序日志里显示的往往就是这个,第二层是公网IP,也就是互联网上路由可达的地址,你从家里电脑访问一个网站,域名解析到的那个IP就是公网IP,云服务器厂商会把公网IP通过NAT映射到内网IP上,所以在服务器内部用命令看,默认看到的几乎都是内网IP。
还有一种叫回环地址,永远都是127.0.0.1,程序如果绑定了这个地址,表示只能本机访问,外部设备连不进来,排查的时候看到这个地址,别急着抄下来,它不算真正的服务器对外IP。
主流Linux服务器查看IP的实用命令
国内生产环境使用Linux的比例相当高,尤以CentOS、Ubuntu、Debian为主,登录服务器后,推荐按以下顺序操作。
第一步,用ip addr命令查看所有网卡信息,这个命令输出里,lo是回环接口,eth0或ens33是物理网卡,重点看eth0下面inet后面的地址,那就是这台服务器当前的主IP。
ip addr
如果你的系统比较老旧,没有ip命令,就用ifconfig,若提示找不到,先装个网络工具包,CentOS执行yum install net-tools,Ubuntu执行apt install net-tools。
第二步,只提取IP地址本身,避免被一堆MTU和MAC地址干扰:
hostname -I
这条命令会把所有网卡的IP一次性列出来,空格分隔,干净利落,多个IP时,第一个通常是主IP。
第三步,如果你想确认具体是哪个进程在监听端口,以及它绑定的IP,用ss命令:
ss -lntp
输出里Local Address:Port那一列,比如0.0.0:8080表示监听所有网卡的8080端口,168.1.10:8080表示只监听这个内网IP,配合-p参数显示进程名,能直接看到PID和程序名称。
行业共识认为,ss命令是netstat的替代方案,速度快且信息更全,老习惯用netstat -lntp也完全没问题,输出格式类似。
Windows服务器查看IP和程序端口
Windows Server在国内占有率也不低,尤其是传统企业。
查看IP最简单的方法,在CMD或PowerShell里输入:
ipconfig
输出里的IPv4 地址就是你要找的答案,如果有多个网卡,带Default Gateway的那个通常是主用网卡。
如果你的Windows服务器跑了Java、.NET或数据库程序,想知道程序发布在哪个端口,对应IP是多少,用组合拳,先查端口和PID:
netstat -ano | findstr :8080
最后一列就是PID,然后用任务管理器或者命令看这个PID对应哪个程序:
tasklist | findstr 1234
至于程序绑定的IP,在netstat -ano输出里看Local Address列,如果显示0.0.0:8080,说明程序监听所有IP,你从任何能路由到这台服务器的地址都能访问,如果显示0.0.1:8080,那这个服务只有服务器本机能访问。
PowerShell用户还可以用更现代的写法:
Get-NetIPAddress -AddressFamily IPv4
Get-Process -Id 1234 | Select-Object ProcessName
云服务器怎么查看公网IP
如果你用的是简米云、酷番云、华为云的云服务器,情况特殊一些,在服务器内部执行ip addr,看到的通常是内网IP,因为云厂商的架构决定了公网IP是映射到内网IP上的,行业内存在一种常见的误解:认为在服务器里看到的IP就是对外IP。
查云服务器公网IP,最权威的地方是云厂商控制台,登录网页控制台,找到云服务器ECS或CVM实例列表,页面上直接显示公网IP和内网IP,这是排查时最直接、最不容易错的方式。
如果你只想从服务器命令行里知道公网IP,可以访问一些接口,比如curl ifconfig.me或curl ip.sb,但这些接口依赖外网连通性,在某些安全组限制严格的机房可能不通,注意这些公共服务不是标准,仅作为辅助手段。
云服务器的安全组规则决定了哪些IP能访问你的程序,即使公网IP正确,安全组没放行对应端口,外部依然无法访问,控制台里的安全组配置,和公网IP同等重要。
程序日志和配置文件里的IP线索
有时候你不能登录服务器,或者服务器太多,逐一排查效率太低,这时候要从程序本身下手找线索。
第一个线索是启动脚本和配置文件,Java应用看application.yml或application.properties里的server.address,Nginx看nginx.conf里的listen指令,Tomcat看server.xml里的Connector标签,这些配置里写的IP可能是0.0.0.0、内网IP或者具体的地址,能明确告诉你程序设计上监听哪个IP。
第二个线索是日志文件,很多程序启动时会打印监听地址,比如Spring Boot的启动日志里会有Tomcat started on port(s): 8080 (http) with context path '',虽然没直接写IP,但可以推断是监听所有地址,数据库日志、消息队列日志同理,通常会记录本节点监听的Host。
第三个线索是进程的环境变量,某些部署平台会把当前节点的IP注入环境变量,比如HOSTNAME、POD_IP,在Linux下用env命令查看全部环境变量,或者在容器里用printenv,常常能找到线索。
多IP和容器环境下的IP选择
一台服务器有多个IP的情况很常见,这时候IP选错了会出大问题。
物理机多网卡场景:服务器有内网网卡和存储网卡,程序需要对外提供服务,应该绑定业务网卡的IP,绑定错了存储网卡的IP,外部访问就会间歇性失败。
容器场景:Docker容器有独立的网络命名空间,在宿主机上用docker ps看容器ID,然后docker exec -it 容器ID bash进入容器,再执行ip addr看容器自己的IP,宿主机IP和容器IP不是一回事,端口映射遵循宿主机IP:映射端口->容器IP:实际端口的规则。
Kubernetes集群更复杂,查看Pod的IP用kubectl get pod -o wide,查看Service的ClusterIP用kubectl get svc,你要访问的是Service,不是背后某一个Pod的IP,这些技术在运维面试里是高频考点,生产环境也极常用。
从外部确认程序IP是否真的可达
查到了IP和端口,最后一步是验证,用ping只能确认服务器在线,不能确认端口通,测试TCP端口连通性,推荐用telnet或者Linux下的nc:
telnet 你的IP 8080
或者:
nc -zv 你的IP 8080
如果提示Connected to,说明IP和端口都能正常访问,如果Connection refused,要么是程序没启动,要么是防火墙拦截了。
还有一个细节:数据库程序常用的3306端口,Redis的6379端口,很多厂商默认只允许内网访问,你需要从另一台同内网的机器去测试,而不是直接从你本地的Mac或Windows去连,这一点常常让人困惑,明明IP没错,却总是连不上。
常见误区与快速排查思路
- 看了
ifconfig的IP就直接用,多数情况下那只是内网地址,公网访问要用控制台上显示的IP。 - 以为
0.0.0是一个真实IP,它不是,它表示“本机所有地址”。 - 把容器IP当成宿主机IP,容器重启后IP会变,外部访问应该用宿主机IP加映射端口。
快速排查路径归纳如下:先确认程序监听端口,用ss -lntp,再看监听地址是0.0.0.0还是具体IP,若是云服务器,去控制台确认公网IP和安全组,最后从外部用telnet验证。
怎么查看运行程序的服务器IP:完整实操总结
怎么查看运行程序的服务器IP,最终落地的步骤可以凝练成五步,第一步,登录服务器查看网卡IP,Linux用ip addr,Windows用ipconfig,第二步,查看程序监听的端口和地址,Linux用ss -lntp,Windows用netstat -ano,第三步,区分内网IP和公网IP,云服务器以控制台为准,第四步,检查防火墙和安全组是否放行该端口,第五步,从外部用telnet或nc验证连通性。
Q&A:关于服务器IP的常见疑问
为什么我查到的IP和域名解析出来的IP不一致
因为你查到的通常是内网IP,而域名解析到的是公网IP,云服务器内部永远看不到自己的公网IP,只能看内网,这是NAT机制决定的正常现象。
程序日志里显示的IP是127.0.0.1,外部还能访问吗
能,程序绑定了127.0.0.1时,外部确实无法直接访问,但如果前面有Nginx反代,Nginx通过本机回环地址转发请求,程序就不需要绑定外部IP,这种情况常见于前后端分离的部署架构,对于Spring Boot应用设置server.address=127.0.0.1,搭配Nginx代理是标准安全做法。
netstat查不到我想找的端口,是不是IP有问题
先确认程序是否真的启动了,可能进程崩溃导致端口根本没监听,其次确认你有权限看到所有进程,有些程序以其他用户身份运行,需要sudo netstat -lntp,最后确认你找的端口号正确,程序默认端口常有改动。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/771816.html


