相關概念:
在網絡技術中,端口(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 ~]#