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
UDP协议:
nc命令默认情况下是检测/监听tcp协议的,如果我们需要处理udp协议的话,如下:
服务器端:
nc -u -l $port
客户端:
nc -u 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 ~]#
END