如何使用 CLI 检查 Linux 中的开放端口
为了解决服务器问题并避免安全问题,需要找出开放的 TCP 和 UDP 端口。在本教程中,您将学习不同的 Linux 命令来检查 Linux 中的开放端口,以进行审计和保护服务器。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 是的 |
要求 | Linux 终端 |
类别 | 命令 |
操作系统兼容性 | Alma • Alpine • Arch • CentOS • Debian • Fedora • Linux • Mint • openSUSE • Pop!_OS • RHEL • Rocky • Stream • SUSE • Ubuntu • WSL |
预计阅读时间 | 4 分钟 |
TCP 和 UDP 端口到底是什么?
端口不过是 0 到 65535 之间的 16 位数字。例如,TCP 端口号 22 可能被转发到 OpenSSH 服务器。因此,22 端口号是识别 sshd(OpenSSH 服务器)进程的一种方式。
端口号
- 知名端口是从0到1023 的端口。
- 注册端口是从1024到49151 的端口。
- 动态端口和私有端口是从49152到65535 的端口。
注册端口是由互联网号码分配机构分配的网络端口(可以使用cat /more/less/ bat 命令或grep 命令/ egrep 命令查看端口号和服务映射:
$ cat /etc/services
$ grep -w '80/tcp' /etc/services
$ grep -w '443/tcp' /etc/services
$ grep -E -w '22/(tcp|udp)' /etc/services
显示由 IANA 分配的应用程序及其端口列表
检查 Linux 中的开放端口
在Linux中监视并显示开放端口的步骤如下:
- 打开 Linux 终端应用程序
- 使用ss命令显示Linux中所有打开的TCP和UDP端口。
- 另一个选择是使用netstat命令列出 Linux 中的所有端口。
- 除了ss/之外netstat,还可以使用lsof命令列出基于 Linux 的系统上打开的文件和端口。
- 最后,也可以使用nmap命令来检查 TCP 和 UDP 端口。
让我们详细了解所有命令和示例。
使用 netstat 列出开放端口
输入以下 netstat 命令:
$ sudo netstat -tulpn | grep LISTEN
例如,cupsd 进程打开 TCP 端口 631,cupsd 仅列出环回地址 (127.0.0.1)。类似地,sshd 进程打开 TCP 端口 22,sshd 列出所有 IP 地址以进行 ssh 连接:
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 0 43385 1821/cupsd tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 0 44064 1823/sshd
在哪里,
- -t:所有 TCP 端口
- -u:所有 UDP 端口
- -l:显示监听服务器套接字
- -p:显示每个套接字所属程序的PID和名称
- -n:不解析名称
- | grep LISTEN:通过应用 grep 命令过滤器仅显示开放的端口。
使用 ss 列出开放端口
ss 命令用于转储套接字统计信息。它允许显示类似于 netstat 的信息。它可以显示比其他工具更多的 TCP 和状态信息。语法如下:
$ sudo ss -tulpn
示例输出:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 224.0.0.251:5353 0.0.0.0:* users:(("chromium-browse",pid=12893,fd=419)) udp UNCONN 0 0 224.0.0.251:5353 0.0.0.0:* users:(("chromium-browse",pid=12938,fd=395)) udp UNCONN 0 0 224.0.0.251:5353 0.0.0.0:* users:(("chrome",pid=10111,fd=178)) udp UNCONN 0 0 224.0.0.251:5353 0.0.0.0:* users:(("chrome",pid=10111,fd=139)) udp UNCONN 0 0 224.0.0.251:5353 0.0.0.0:* users:(("chrome",pid=10111,fd=48)) udp UNCONN 0 0 224.0.0.251:5353 0.0.0.0:* users:(("chrome",pid=10161,fd=43)) udp UNCONN 0 0 0.0.0.0:5353 0.0.0.0:* users:(("avahi-daemon",pid=1590,fd=15)) udp UNCONN 0 0 0.0.0.0:5355 0.0.0.0:* users:(("systemd-resolve",pid=1566,fd=12)) udp UNCONN 0 0 0.0.0.0:55204 0.0.0.0:* users:(("avahi-daemon",pid=1590,fd=17)) udp UNCONN 0 0 0.0.0.0:49112 0.0.0.0:* users:(("openvpn",pid=18342,fd=8)) udp UNCONN 0 0 10.205.77.1:53 0.0.0.0:* users:(("dnsmasq",pid=2416,fd=8)) udp UNCONN 0 0 192.168.122.1:53 0.0.0.0:* users:(("dnsmasq",pid=2081,fd=5)) udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=1566,fd=17)) udp UNCONN 0 0 0.0.0.0%lxdbr0:67 0.0.0.0:* users:(("dnsmasq",pid=2416,fd=4)) udp UNCONN 0 0 0.0.0.0%virbr0:67 0.0.0.0:* users:(("dnsmasq",pid=2081,fd=3)) udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:* users:(("dhclient",pid=18263,fd=7)) udp UNCONN 0 0 127.0.0.1:323 0.0.0.0:* users:(("chronyd",pid=1652,fd=6)) udp UNCONN 0 0 [::]:5353 [::]:* users:(("avahi-daemon",pid=1590,fd=16)) udp UNCONN 0 0 [::]:5355 [::]:* users:(("systemd-resolve",pid=1566,fd=14)) udp UNCONN 0 0 [::]:60302 [::]:* users:(("avahi-daemon",pid=1590,fd=18)) udp UNCONN 0 0 [fd42:400:b94d:ad98::1]:53 [::]:* users:(("dnsmasq",pid=2416,fd=12)) udp UNCONN 0 0 [fe80::e400:44ff:feb7:3233]%lxdbr0:53 [::]:* users:(("dnsmasq",pid=2416,fd=10)) udp UNCONN 0 0 [::1]:323 [::]:* users:(("chronyd",pid=1652,fd=7)) udp UNCONN 0 0 [::]%lxdbr0:547 [::]:* users:(("dnsmasq",pid=2416,fd=6)) tcp LISTEN 0 128 127.0.0.1:53306 0.0.0.0:* users:(("AgentAntidote.b",pid=6206,fd=16),("AgentAntidote",pid=6164,fd=16),("AgentConnectix.",pid=3371,fd=16)) tcp LISTEN 0 5 127.0.0.1:44321 0.0.0.0:* users:(("pmcd",pid=3784,fd=0)) tcp LISTEN 0 5 127.0.0.1:4330 0.0.0.0:* users:(("pmlogger",pid=9725,fd=9)) tcp LISTEN 0 128 0.0.0.0:5355 0.0.0.0:* users:(("systemd-resolve",pid=1566,fd=13)) tcp LISTEN 0 5 10.205.77.1:53 0.0.0.0:* users:(("dnsmasq",pid=2416,fd=9)) tcp LISTEN 0 32 192.168.122.1:53 0.0.0.0:* users:(("dnsmasq",pid=2081,fd=6)) tcp LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=1566,fd=18)) tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1823,fd=5)) tcp LISTEN 0 5 127.0.0.1:631 0.0.0.0:* users:(("cupsd",pid=1821,fd=10)) tcp LISTEN 0 5 [::1]:44321 [::]:* users:(("pmcd",pid=3784,fd=3)) tcp LISTEN 0 5 [::1]:4330 [::]:* users:(("pmlogger",pid=9725,fd=10)) tcp LISTEN 0 128 [::]:5355 [::]:* users:(("systemd-resolve",pid=1566,fd=15)) tcp LISTEN 0 5 [fd42:400:b94d:ad98::1]:53 [::]:* users:(("dnsmasq",pid=2416,fd=13)) tcp LISTEN 0 5 [fe80::e400:44ff:feb7:3233]%lxdbr0:53 [::]:* users:(("dnsmasq",pid=2416,fd=11)) tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1823,fd=7)) tcp LISTEN 0 5 [::1]:631 [::]:* users:(("cupsd",pid=1821,fd=9))
使用 lsof 命令监听端口和应用程序
让我们运行以下命令,使用 lsof 命令检查打开的 TCP 和 UDP 端口:
$ sudo lsof -i -P -n | grep LISTEN
其中,
- -i:查找列表端口
- -P:禁止将端口号转换为网络文件的端口名。禁止转换可能会使 lsof 运行得更快一些。当端口名查找无法正常工作时,它也很有用。
- -n:不使用 DNS 名称
- | grep LISTEN:再次使用grep 命令作为过滤器仅显示处于 LISTEN 状态的端口。
nmap 命令
此外,除了上述命令之外,还可以使用nmap 命令,这是一个用于网络探索和安全审计的开源工具。我们将使用 nmap 查找并列出 Linux 中的开放端口:
示例输出:
$ sudo nmap -sT -O localhost
$ sudo nmap -sU -O 192.168.2.254 ##[ list open UDP ports ]##
$ sudo nmap -sT -O 127.0.0.1 ##[ list open TCP ports ]##
$ sudo nmap -sTU -O 192.168.2.24
Starting Nmap 7.70 ( https://nmap.org ) at 2019-07-22 23:49 IST Nmap scan report for localhost (127.0.0.1) Host is up (0.00024s latency). Other addresses for localhost (not scanned): ::1 Not shown: 998 closed ports PORT STATE SERVICE 22/tcp open ssh 631/tcp open ipp Device type: general purpose Running: Linux 2.6.X OS CPE: cpe:/o:linux:linux_kernel:2.6.32 OS details: Linux 2.6.32 Network Distance: 0 hops OS detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 2.31 seconds
开放端口并不意味着任何外部人员都可以访问这些端口
到目前为止,您已经知道如何在 Linux 上查找和列出开放的 TCP 和 UDP 端口。但是,这些端口仍然可能被软件、云或硬件防火墙阻止。因此,您需要验证您的公司防火墙是否未阻止传入或传出访问。例如,在Linux 服务器上,我们使用以下语法列出或转储防火墙规则:
$ sudo iptables -S
# IPv6 #
$ sudo ip6tables -S
相关另外,请查看我们针对Alpine Linux Awall、CentOS 8、OpenSUSE、RHEL 8、Debian 12/11、Ubuntu Linux 版本16.04 LTS / 18.04 LTS / 20.04 LTS和22.04 LTS 的
所有完整防火墙教程。
结论
总之,出于安全原因,找出开放端口是 Linux 系统管理员最基本的职责之一。因此,关闭所有不需要的端口,并配置防火墙(如UFW和FirewallD)以根据您的要求打开或阻止端口。阅读本教程后,您应该很好地了解如何检查 Linux 中的开放端口。有关更多信息,请参阅此处的IANA 官方 TCP、UDP 和其他端口列表。使用 man 命令查看以下手册页:
$ man ss
$ man netstat
$ man lsof
$ man nmap