天天看点

Linux 查看服务器开放的端口号

相关概念:

在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型。 

物理端口指的是物理存在的端口,如ADSL Modem、集线器、交换机、路由器上用 于连接其他网络设备的接口,如RJ-45端口、SC端口等等。 

逻辑端口是指逻辑意义上用于区分服务的端口,如TCP/IP协议中的服务端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等。

由于物理端口和逻辑端口数量较多,为了对端口进行区分,将每个端口进行了编号,这就是端口号

端口按端口号可以分为3大类:

  • 公认端口(Well Known Port)

    公认端口号从0到1023,它们紧密绑定与一些常见服务,例如FTP服务使用端口21,你在 /etc/services 里面可以看到这种映射关系。

  • 注册端口(Registered Ports):

    从1024到49151。它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的.

  • 动态或私有端口(Dynamic and/or Private Ports)

    动态端口,即私人端口号(private port numbers),是可用于任意软件与任何其他的软件通信的端口数,使用因特网的传输控制协议,或用户传输协议。动态端口一般从49152到65535

Linux中有限定端口的使用范围,如果我要为我的程序预留某些端口,那么我需要控制这个端口范围。 

/proc/sys/net/ipv4/ip_local_port_range定义了本地TCP/UDP的端口范围, 

你可以在/etc/sysctl.conf里面定义net.ipv4.ip_local_port_range = 1024 65000

[root@localhost ~]# cat /proc/sys/net/ipv4/ip_local_port_range
1024    65000
[root@localhost ~]# echo '1024 65535' > /proc/sys/net/ipv4/ip_local_port_range      

查看本机的端口是否启用:

1、netstat工具:打印Linux中网络系统的状态信息

选项

-a或--all:显示所有连线中的Socket;
-A<网络类型>或--<网络类型>:列出该网络类型连线中的相关地址;
-c或--continuous:持续列出网络状态;
-C或--cache:显示路由器配置的快取信息;
-e或--extend:显示网络其他相关信息;
-F或--fib:显示FIB;
-g或--groups:显示多重广播功能群组组员名单;
-h或--help:在线帮助;
-i或--interfaces:显示网络界面信息表单;
-l或--listening:显示监控中的服务器的Socket;
-M或--masquerade:显示伪装的网络连线;
-n或--numeric:直接使用ip地址,而不通过域名服务器;
-N或--netlink或--symbolic:显示网络硬件外围设备的符号连接名称;
-o或--timers:显示计时器;
-p或--programs:显示正在使用Socket的程序识别码和程序名称;
-r或--route:显示Routing Table;
-s或--statistice:显示网络工作信息统计表;
-t或--tcp:显示TCP传输协议的连线状况;
-u或--udp:显示UDP传输协议的连线状况;
-v或--verbose:显示指令执行过程;
-V或--version:显示版本信息;
-w或--raw:显示RAW传输协议的连线状况;
-x或--unix:此参数的效果和指定"-A unix"参数相同;
--ip或--inet:此参数的效果和指定"-A inet"参数相同。      
例:
[root@node1 ~]# netstat  -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      27643/sshd
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      1504/master
tcp        0      0 0.0.0.0:10050           0.0.0.0:*               LISTEN      9064/zabbix_agentd
tcp        0      0 0.0.0.0:10051           0.0.0.0:*               LISTEN      8903/zabbix_server
tcp6       0      0 :::3306                 :::*                    LISTEN      29116/mysqld
tcp6       0      0 :::22                   :::*                    LISTEN      27643/sshd
tcp6       0      0 :::25                   :::*                    LISTEN      1504/master
tcp6       0      0 :::36928                :::*                    LISTEN      11399/httpd
tcp6       0      0 :::10050                :::*                    LISTEN      9064/zabbix_agentd
tcp6       0      0 :::10051                :::*                    LISTEN      8903/zabbix_server
tcp6       0      0 :::10052                :::*                    LISTEN      8748/java
udp        0      0 192.168.20.59:123       0.0.0.0:*                           17915/ntpd
udp        0      0 127.0.0.1:123           0.0.0.0:*                           17915/ntpd
udp        0      0 0.0.0.0:123             0.0.0.0:*                           17915/ntpd
udp6       0      0 fe80::6a85:bbb1:ad5:123 :::*                                17915/ntpd
udp6       0      0 :::123                  :::*                                17915/ntpd
[root@node1 ~]#
这个工具没有nmap简洁明了。当然也确实没有nmap功能强大。      

2、lsof 工具:

查看进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,需要root用户执行。

-a:列出打开文件存在的进程;
-c<进程名>:列出指定进程所打开的文件;
-g:列出GID号进程详情;
-d<文件号>:列出占用该文件号的进程;
+d<目录>:列出目录下被打开的文件;
+D<目录>:递归列出目录下被打开的文件;
-n<目录>:列出使用NFS的文件;
-i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号>:列出指定进程号所打开的文件;
-u:列出UID号进程详情;
-h:显示帮助信息;
-v:显示版本信息。      
[root@node1 ~]# systemctl status mysqld.service
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since 四 2018-04-12 08:50:17 CST; 1 months 9 days ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
 Main PID: 29116 (mysqld)
   CGroup: /system.slice/mysqld.service
           └─29116 /data/mysql/bin/mysqld --defaults-file=/etc/my.cnf

4月 12 08:50:17 node1 systemd[1]: Started MySQL Server.
4月 12 08:50:17 node1 systemd[1]: Starting MySQL Server...
[root@node1 ~]# lsof -i :3306
COMMAND   PID  USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
mysqld  29116 mysql   33u  IPv6 25300019      0t0  TCP *:mysql (LISTEN)      

3、ss命令

显示处于活动状态的套接字信息。ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。 

ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。

-h:显示帮助信息;
-V:显示指令版本信息;
-n:不解析服务名称,以数字方式显示;
-a:显示所有的套接字;
-l:显示处于监听状态的套接字;
-o:显示计时器信息;
-m:显示套接字的内存使用情况;
-p:显示使用套接字的进程信息;
-i:显示内部的TCP信息;
-4:只显示ipv4的套接字;
-6:只显示ipv6的套接字;
-t:只显示tcp套接字;
-u:只显示udp套接字;
-d:只显示DCCP套接字;
-w:仅显示RAW套接字;
-x:仅显示UNIX域套接字。      
[root@node1 ~]# ss -tnlu   
Netid  State      Recv-Q Send-Q      Local Address:Port    Peer Address:Port
udp    UNCONN     0      0           192.168.20.59:123                *:*
udp    UNCONN     0      0           192.168.19.59:123                *:*
udp    UNCONN     0      0            192.168.0.59:123                *:*
udp    UNCONN     0      0            192.168.1.59:123                *:*
udp    UNCONN     0      0               127.0.0.1:123                *:*
udp    UNCONN     0      0                       *:123                *:*
udp    UNCONN     0      0                      :::123               :::*
tcp    LISTEN     0      128                     *:22                 *:*
tcp    LISTEN     0      100                     *:25                 *:*
tcp    LISTEN     0      128                     *:10050              *:*
tcp    LISTEN     0      128                     *:10051              *:*
tcp    LISTEN     0      80                     :::3306              :::*
tcp    LISTEN     0      128                    :::22                :::*
tcp    LISTEN     0      100                    :::25                :::*
tcp    LISTEN     0      128                    :::36928             :::*
tcp    LISTEN     0      128                    :::10050             :::*
tcp    LISTEN     0      128                    :::10051             :::*
tcp    LISTEN     0      50                     :::10052             :::*
[root@node1 ~]#      

查看其它服务器指定端口是否可访问:

1、telnet::用于登录远程主机,对远程主机进行管理。

telnet因为采用明文传送报文,安全性不好,很多Linux服务器都不开放telnet服务,而改用更安全的ssh方式。 

服务器端口即使处于监听状态,但是防火墙iptables屏蔽了该端口,是无法通过该方法检测端口是否开放的。

格式:
telnet ip 端口号(如本机的35465:telnet localhost 35465)      
[root@node1 ~]# telnet 192.168.1.102 80
Trying 192.168.1.102...
telnet: connect to address 192.168.1.102: Connection timed out      # 连接超时,端口没开

[root@node1 ~]# telnet 192.168.1.102 81
Trying 192.168.1.102...
Connected to 192.168.1.102.                                         # 连接到此端口,此端口目前开放且有应用占用;
Escape character is '^]'.
Connection closed by foreign host.

[root@node1 ~]# telnet 192.168.1.102 82
Trying 192.168.1.102...
telnet: connect to address 192.168.1.102: Connection refused        # 连接被拒绝;此端口开放,暂无应用占用此端口;
[root@node1 ~]#      

2、nmap工具

nmap是一款网络扫描和主机检测的工具。

nmap的安装
debian:apt-get install nmap
redhat:yum install nmap      
[root@node1 ~]# nmap 192.168.1.102
Starting Nmap 6.40 ( http://nmap.org ) at 2018-05-22 14:36 CST
Nmap scan report for 192.168.1.102
Host is up (0.058s latency).
Not shown: 985 filtered ports
PORT     STATE  SERVICE
22/tcp   open   ssh
81/tcp   closed hosts2-ns
82/tcp   closed xfer
83/tcp   closed mit-ml-dev
84/tcp   closed ctf
85/tcp   closed mit-ml-dev
88/tcp   closed kerberos-sec
89/tcp   closed su-mit-tg
90/tcp   closed dnsix
99/tcp   closed metagram
100/tcp  closed newacct
1434/tcp closed ms-sql-m
3690/tcp closed svn
8021/tcp closed ftp-proxy
9090/tcp closed zeus-admin

Nmap done: 1 IP address (1 host up) scanned in 5.67 seconds
[root@node1 ~]#      

3、nc命令:nc命令是netcat命令的简称

经常被用于代替nmap进行端口扫描,当然这只是nc命令功能的冰山一角。

-g<网关>:设置路由器跃程通信网关,最多设置8个;
-G<指向器数目>:设置来源路由指向器,其数值为4的倍数;
-h:在线帮助;
-i<延迟秒数>:设置时间间隔,以便传送信息及扫描通信端口;
-l:使用监听模式,类似于长连接,一直监听在指定port不会断开,可以发送数据信息;
-n:直接使用ip地址,而不通过域名服务器;
-o<输出文件>:指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存;
-p<通信端口>:设置本地主机使用的通信端口;
-r:指定源端口和目的端口都进行随机的选择;
-s <来源位址>:设置本地主机送出数据包的IP地址;
-u:使用UDP传输协议;
-v:显示指令执行过程;
-w <超时秒数>:设置等待连线的时间;
-z:使用0输入/输出模式,只在扫描通信端口时使用。      
安装:
yum install nmap-ncat      
检查指定服务器的指定端口是否被监听
[root@node1 ~]# nc -zv -w 3 192.168.1.102 80
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connection timed out.                         # 连接超时,端口没开

[root@node1 ~]# nc -zv -w 3 192.168.1.102 81
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.1.102:81.                # 连接到,此端口目前开放且有应用占用;
Ncat: 0 bytes sent, 0 bytes received in 0.06 seconds.

[root@node1 ~]# nc -zv -w 3 192.168.1.102 81
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connection refused.                           # 连接被拒绝;此端口开放,暂无应用占用此端口;
[root@node1 ~]#      
测试指定端口是否可以正常通讯

TCP协议: 

    服务器端: 

        nc -l $port 

    客户端: 

        nc ip $port

服务端:        
[root@node2 ~]# nc -l 82               # 第1步:服务端通过82端口开启监听
hello
hi
how are you?
[root@node2 ~]#

客户端:
[root@node1 ~]# nc 192.168.1.102 82        # 第2步:客户端连接服务端的82端口,然后双方可以开启聊天模式。
hello
hi
how are you?
^C                                      # 通过“Ctrl+C”结束对话
[root@node1 ~]#      

继续阅读