在Linux系统中,“映射”是一个广义概念,涵盖网络端口映射、进程与文件的映射、内存映射、网络连接映射等多个场景,不同场景下查看映射的方法各有侧重,本文将详细介绍常见映射类型的查看方式,包括命令工具、输出解析及实际示例。
网络端口映射查看
网络端口映射通常指通过NAT(网络地址转换)将内网服务端口映射到公网IP或本地端口,常见于服务器端口转发、容器端口暴露等场景,查看端口映射主要依赖iptables
、firewalld
、ss
等工具。
使用iptables
查看NAT规则
iptables
是Linux内核的防火墙工具,其nat
表记录了端口转发规则,通过以下命令查看:
sudo iptables -t nat -L -n -v
-t nat
:指定操作nat
表;-L
:列出所有规则链;-n
:以数字形式显示IP和端口(避免域名解析延迟);-v
:显示详细信息(如数据包数量、字节大小)。
输出示例中,DNAT
(目标地址转换)和SNAT
(源地址转换)规则即为端口映射的核心,
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:192.168.1.100:80
表示将本机的8080端口映射到内网IP 168.1.100
的80端口。
使用firewalld
查看端口转发
若系统使用firewalld
(如CentOS/RHEL 7+),可通过以下命令查看已配置的端口转发:
sudo firewall-cmd --list-forward-ports --permanent
--permanent
:查看永久配置(临时配置需去掉该参数);- 输出示例:
port=8080:proto=toc:toport=80:toaddr=192.168.1.100
,含义同iptables
的DNAT规则。
使用ss
或netstat
查看监听端口
映射生效后,目标端口需处于监听状态,通过ss
(推荐,比netstat
更高效)查看:
ss -tuln | grep 8080
-t
:TCP端口,-u
:UDP端口,-l
:仅显示监听端口,-n
:数字形式;- 输出示例:
LISTEN 0 128 *:8080 *:*
,表示8080端口正在监听所有IP地址。
进程与文件映射查看
进程与文件的映射指进程打开的文件、网络连接、设备文件等资源,可通过/proc
文件系统或lsof
工具查看。
通过/proc
文件系统查看进程文件描述符
Linux中,/proc/PID/fd
目录存储了进程ID为PID
的文件描述符(每个描述符是一个符号链接,指向实际文件):
ls -l /proc/$(pgrep nginx)/fd
pgrep nginx
:获取nginx进程的PID;- 输出示例:
lrwx------ 1 root root 64 Dec 1 10:00 0 -> /dev/null
(标准输入)、lrwx------ 1 root root 64 Dec 1 10:01 1 -> /var/log/nginx/access.log
(标准输出),分别对应进程的输入输出文件。
使用lsof
查看进程打开的文件
lsof
(list open files)可查看进程打开的文件、网络连接等:
lsof -p $(pgrep nginx) # 查看nginx进程打开的文件 lsof -i :80 # 查看占用80端口的进程
-p
:指定进程ID;-i
:显示网络连接;- 输出示例:
nginx 1234 root 6u IPv4 12345 0t0 TCP *:http (LISTEN)
,表示进程1234(nginx)正在监听80端口(http)。
内存映射查看
内存映射指进程将文件或设备映射到虚拟内存空间,可通过/proc/PID/maps
或pmap
工具查看。
通过/proc/PID/maps
查看内存映射
/proc/PID/maps
记录了进程的虚拟内存地址映射关系,包括权限、偏移量、文件路径等:
cat /proc/$(pgrep nginx)/maps
输出格式为:虚拟地址范围 权限 偏移量 设备 inode 文件路径
,
7f8a5a1b2000-7f8a5a1b3000 r-xp 00000000 08:02 123456 /usr/sbin/nginx
表示进程将/usr/sbin/nginx
文件的0x7f8a5a1b2000-0x7f8a5a1b3000
地址范围映射为可执行(r-x
)。
使用pmap
查看详细内存映射
pmap
(process memory map)提供更易读的内存映射信息:
pmap -d $(pgrep nginx)
-d
:显示设备映射信息;- 输出包含进程的代码段、数据段、堆、栈、共享库等映射详情,
7f8a5a1b2000 64K r-x-- nginx 7f8a5a1b3000 16K r---- nginx 7f8a5a1b4000 8K rw--- nginx
网络连接映射查看
网络连接映射指本地IP与端口、远程IP与端口的对应关系,可通过ss
、netstat
或lsof
查看。
使用ss
查看TCP/UDP连接
ss
是netstat
的替代工具,性能更优,常用参数:
ss -tulnp # 查看所有监听端口及进程 ss -t # 仅查看TCP连接 ss -4 # 仅查看IPv4连接
-n
:数字形式,-p
:显示进程ID和名称;- 输出示例:
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
,表示sshd进程监听所有IP的22端口。
使用netstat
查看连接状态(传统工具)
若系统未安装ss
,可用netstat
:
netstat -tulnp
输出格式与ss
类似,但netstat
已逐渐被废弃。
工具对比与适用场景
映射类型 | 常用工具 | 核心命令示例 | 适用场景 |
---|---|---|---|
网络端口映射 | iptables, firewalld, ss | iptables -t nat -L , firewalld --list-forward-ports |
查看NAT端口转发规则、容器端口暴露 |
进程文件映射 | /proc, lsof | ls /proc/PID/fd , lsof -p PID |
查看进程打开的文件、日志、网络连接 |
内存映射 | /proc/PID/maps, pmap | cat /proc/PID/maps , pmap -d PID |
分析进程内存占用、共享库加载情况 |
网络连接映射 | ss, netstat, lsof | ss -tulnp , netstat -tulnp |
查看端口占用、网络连接状态 |
相关问答FAQs
Q1: 如何查看某个进程(如Nginx)打开了哪些文件和网络连接?
A1: 可通过lsof
工具结合进程ID查看,具体命令为:
lsof -p $(pgrep nginx) # 查看nginx进程打开的所有文件 lsof -i -p $(pgrep nginx) # 仅查看nginx进程的网络连接
若需查看特定端口(如80端口)的占用进程,使用:
lsof -i :80
Q2: 如何查看Linux中端口转发的当前配置(如iptables的NAT规则)?
A2: 使用iptables
查看nat
表的规则,命令为:
sudo iptables -t nat -L -n -v
若需查看具体链(如PREROUTING、POSTROUTING)的规则,可添加-t nat -S
或指定链名称(如-t nat -L PREROUTING
),对于firewalld
用户,使用:
sudo firewall-cmd --list-forward-ports --permanent
临时配置可通过去掉--permanent
参数查看。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/38067.html