本文是按照lfree的博客(https://www.cnblogs.com/lfree/p/10368332.html)中的內容,進行學習、測試、總結的。有些知識點也是在閱讀這篇博文時,發現不瞭解這方面的知識,遂網上搜索相關資料總結了一下。 1:Linux 設備裡面有個比較特殊的文件:/dev/[t... ...
本文是按照lfree的博客(https://www.cnblogs.com/lfree/p/10368332.html)中的內容,進行學習、測試、總結的。有些知識點也是在閱讀這篇博文時,發現不瞭解這方面的知識,遂網上搜索相關資料總結了一下。
1:Linux 設備裡面有個比較特殊的文件:/dev/[tcp|upd]/host/port 只要讀取或者寫入這個文件,相當於系統會嘗試連接:host 這台機器,對應port埠。如果主機以及埠存在,就建立一個socket 連接。將在,/proc/self/fd目錄下麵,有對應的文件出現。
/dev/tcp/${HOST}/${PORT} 這個字元串看起來很像一個文件系統中的文件,並且位於 /dev 這個設備文件夾下。但是:這個文件並不存在,而且並不是一個設備文件。這隻是 bash 實現的用來實現網路請求的一個介面,其實就像我們自己編寫的一個命令行程式,按照指定的格式輸入host port參數,就能發起一個socket連接完全一樣
[root@DB-Server ~]# cat < /dev/tcp/10.20.57.24/23
-bash: connect: Connection refused
-bash: /dev/tcp/10.20.57.24/23: Connection refused
[root@DB-Server ~]# cat < /dev/tcp/10.20.57.24/22
SSH-2.0-OpenSSH_4.3
[root@DB-Server ~]# echo a > /dev/tcp/10.20.57.24/22
[root@DB-Server ~]# echo $?
0
[root@DB-Server ~]# echo a > /dev/tcp/10.20.57.24/23
-bash: connect: Connection refused
-bash: /dev/tcp/10.20.57.24/23: Connection refused
[root@DB-Server ~]# echo $?
1
[root@DB-Server ~]# netstat -ntlp
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:42304 0.0.0.0:* LISTEN 7497/ora_d009_gsp
tcp 0 0 0.0.0.0:50336 0.0.0.0:* LISTEN 7481/ora_d005_gsp
tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN 2936/hpiod
tcp 0 0 0.0.0.0:57505 0.0.0.0:* LISTEN 7521/ora_d015_gsp
tcp 0 0 0.0.0.0:769 0.0.0.0:* LISTEN 2707/rpc.statd
tcp 0 0 0.0.0.0:31298 0.0.0.0:* LISTEN 7533/ora_d018_gsp
tcp 0 0 0.0.0.0:13026 0.0.0.0:* LISTEN 7469/ora_d002_gsp
tcp 0 0 0.0.0.0:40227 0.0.0.0:* LISTEN 7485/ora_d006_gsp
tcp 0 0 0.0.0.0:62788 0.0.0.0:* LISTEN 7537/ora_d019_gsp
tcp 0 0 0.0.0.0:58151 0.0.0.0:* LISTEN 7473/ora_d003_gsp
tcp 0 0 0.0.0.0:18728 0.0.0.0:* LISTEN 7505/ora_d011_gsp
tcp 0 0 0.0.0.0:29705 0.0.0.0:* LISTEN 7529/ora_d017_gsp
tcp 0 0 0.0.0.0:60011 0.0.0.0:* LISTEN 7493/ora_d008_gsp
tcp 0 0 0.0.0.0:19819 0.0.0.0:* LISTEN 7461/ora_d000_gsp
tcp 0 0 0.0.0.0:50605 0.0.0.0:* LISTEN 7513/ora_d013_gsp
tcp 0 0 0.0.0.0:11149 0.0.0.0:* LISTEN 7465/ora_d001_gsp
tcp 0 0 0.0.0.0:25487 0.0.0.0:* LISTEN 7501/ora_d010_gsp
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 2662/portmap
tcp 0 0 0.0.0.0:28021 0.0.0.0:* LISTEN 7517/ora_d014_gsp
tcp 0 0 0.0.0.0:46038 0.0.0.0:* LISTEN 7525/ora_d016_gsp
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2953/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 2964/cupsd
tcp 0 0 0.0.0.0:22392 0.0.0.0:* LISTEN 7489/ora_d007_gsp
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2999/sendmail: acce
tcp 0 0 0.0.0.0:12508 0.0.0.0:* LISTEN 7477/ora_d004_gsp
tcp 0 0 0.0.0.0:26302 0.0.0.0:* LISTEN 7509/ora_d012_gsp
[root@DB-Server ~]# seq 1 65535 | xargs -I{} echo "echo a > /dev/tcp/10.20.57.24/{} 2>/dev/null 2&>1 ; echo ok=\$?,{}" | bash 2>/dev/null | grep ok=0 | cut -d, -f2
22
111
769
11149
12508
13026
18728
19819
22392
25487
26302
28021
29705
31298
40227
42304
45826
46038
50336
50605
50741
52199
56371
57505
58151
60011
62788
如上測試所示,上面腳本不會記錄環回地址(127.0.0.1)的LISTEN埠。而且腳本執行的效率較低,等待時間過長。
2:使用nc命令測試,測試結果發現,這個命令的速度完全秒殺上面腳本。但是也是不能定位環回地址(127.0.0.1)的LISTEN埠。需要指定IP地址127.0.0.1才能定位定位環回地址(127.0.0.1)的LISTEN
root@DB-Server ~]# echo a | nc -w 1 -n -v 10.20.57.24 1-65535 2>/dev/null | grep "succeeded"
Connection to 10.20.57.24 22 port [tcp/*] succeeded!
Connection to 10.20.57.24 111 port [tcp/*] succeeded!
Connection to 10.20.57.24 769 port [tcp/*] succeeded!
Connection to 10.20.57.24 11149 port [tcp/*] succeeded!
Connection to 10.20.57.24 12508 port [tcp/*] succeeded!
Connection to 10.20.57.24 13026 port [tcp/*] succeeded!
Connection to 10.20.57.24 18728 port [tcp/*] succeeded!
Connection to 10.20.57.24 19819 port [tcp/*] succeeded!
Connection to 10.20.57.24 22392 port [tcp/*] succeeded!
Connection to 10.20.57.24 25487 port [tcp/*] succeeded!
Connection to 10.20.57.24 26302 port [tcp/*] succeeded!
Connection to 10.20.57.24 28021 port [tcp/*] succeeded!
Connection to 10.20.57.24 29705 port [tcp/*] succeeded!
Connection to 10.20.57.24 31298 port [tcp/*] succeeded!
Connection to 10.20.57.24 40227 port [tcp/*] succeeded!
Connection to 10.20.57.24 42304 port [tcp/*] succeeded!
Connection to 10.20.57.24 46038 port [tcp/*] succeeded!
Connection to 10.20.57.24 50111 port [tcp/*] succeeded!
Connection to 10.20.57.24 50336 port [tcp/*] succeeded!
Connection to 10.20.57.24 50605 port [tcp/*] succeeded!
Connection to 10.20.57.24 57505 port [tcp/*] succeeded!
Connection to 10.20.57.24 58151 port [tcp/*] succeeded!
Connection to 10.20.57.24 60011 port [tcp/*] succeeded!