SSH應用簡述vim
1、非標準端口啓動SSH安全
ssh的默認端口是22這是你們都知道的事情,可是在有些時候Cracker會掃描Internet上面的22號端口,所以有些時候有些ISP廠商會在會在入口處關閉22號端口。服務器
爲了提升安全性咱們能夠將SSH的端口開放在非標準的端口,這樣Cracker就不會掃描到該端口,ISP廠商也不會對該端口進行關閉,它能夠和SSH同樣正常使用。網絡
好比咱們將SSH端口設定爲22和23(前提是23端口不能夠被佔用)兩個端口監聽的方式,配置以下:ssh
修改SSH配置文件tcp
vim /etc/ssh/sshd_configide
port 22測試
port 33加密
重啓SSHD服務service sshdrestarturl
若是開啓SELinux,可能會出現一個SELinux的錯誤,由於根據SSH規範僅能啓動22號端口,因此咱們須要自定義一個SELinux規則進行放行模塊才能夠。具體流程以下:
根據提示在日誌中找出SSH有關的AVC信息,並轉爲本地模塊
cat /var/log/audit/audit.log |grep AVC |grep ssh|audit2allow -m sshlocal >sshlocal.te (後綴必定要是.te)
grep sshd_t /var/log/audit/audit.log |audit2allow -M sshlocal(sshlocal是剛纔創建的.te文件名)
semodule -i sshlocal.pp(這條命令是編譯爲.pp模塊,並加入到SELINUX的管理機制中)
service sshd restart(重啓SSHD服務)
這樣就完成了非標準端口啓動ssh的配置過程,最後經過查看端口進行驗證就能夠了。
netstat -tlunp |grep ssh
若是正常的話會出現22和23兩個端口,下面進行鏈接測試
ssh -p 23 root@localhost
而後在經過端口進行查看
netstat -tnp|grep 23
你能夠看到只有23端口處於鏈接狀態,由於網絡鏈接是雙向的因此即便本身鏈接本身也能夠捕獲到兩個鏈接。
2、經過SSH通道加密原本無加密的服務
你們都知道rsync能夠經過ssh通道進行加密以進行鏡像傳輸,那麼其餘服務也是應該能夠經過SSH通道進行加密傳輸的,下面我先介紹一下作法。
我先以VNC服務爲例:
假設在服務端port5901啓動了VNC服務,客戶端使用VNCview鏈接到服務端的port5901,在開始以前咱們的客戶端沒有啓動任何的VNC端口,咱們能夠在客戶端啓動一個port5911,而後經過ssh鏈接到服務器端的sshd中,而服務器端的SSHD再去鏈接VNCport5901,整個過程以下:
下面我簡單介紹一下命令的格式:
ssh -L 本地端口:127.0.0.1:遠程端口 [-N] 遠程主機
例如:
ssh -L 5911:127.0.0.1:5911 -N 192.168.100.100(遠程主機IP)
鏈接後在客戶端查看你會發現SSH開啓了5911的端口
若是想取消這個鏈接,須要先關閉VNC,而後再按Ctrl+C中斷加密通道就能夠了。
照此咱們能夠加密一些沒有加密的服務來進行加密傳輸,如VNC/XDMCP/RDP/FTP........
3、詳解SSH端口轉發
SSH 端口轉發格式[1]
[-L [bind_address:]port:host:hostport]
[-R [bind_address:]port:host:hostport]
[-D [bind_address:]port]
本地端口轉發
-L<local_port>:<host>:<host_port> <ssh_server>
這會使本地主機監聽端口local_port,一旦與該端口創建鏈接,通過該端口的數據會被轉發到安全通道,同時遠程主機會與主機host的端口host_port創建鏈接。
$ ssh -L 7001:localhost:7070 sisca@216.194.70.6
登錄前本地主機端口監聽狀態:
$ sudo netstat -lnput | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 927/sshd tcp6 0 0 :::22 :::* LISTEN 927/sshd
登錄後本地主機端口監聽狀態:
$ sudo netstat -lnput | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 927/sshd tcp 0 0 127.0.0.1:7001 0.0.0.0:* LISTEN 3475/ssh tcp6 0 0 :::22 :::* LISTEN 927/sshd tcp6 0 0 ::1:7001 :::* LISTEN 3475/ssh
登錄後遠程主機端口監聽狀態:
$ sockstat -4l USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS (什麼都沒有)
小結:咱們從中能夠看出,本地端口轉發的時候確實是本地主機的ssh在監聽端口7001
遠程端口轉發
-R<remote_port>:<host>:<host_port> <ssh_server>
這會使ssh_server(遠程端)監聽端口remote_port,一旦與該端口創建鏈接,通過該端口的數據會被轉發到安全通道,而且本地主機會與主機host的端口host_port創建鏈接。
$ ssh -R 7001:localhost:7070 sisca@216.194.70.6
登錄前本地主機端口監聽狀態:
$ sudo netstat -lnput | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 927/sshd tcp6 0 0 :::22 :::* LISTEN 927/sshd
登錄後本地主機端口監聽狀態:
$ sudo netstat -lnput | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 927/sshd tcp6 0 0 :::22 :::* LISTEN 927/sshd
登錄後遠程主機端口監聽狀態:
$ sockstat -4l USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS sisca sshd 66196 7 tcp4 127.0.0.1:7001 *:*
小結:很明顯,使用遠程端口轉發時,本地主機的端口監聽並無發生變化,相反遠程主機卻開始監聽咱們指定的7001端口
小提示:
這裏的remote_port,local_port能夠歸併爲listen_port,所以咱們獲得這樣的助記格式:
ssh [-L|-R] <listen_port>:<host>:<host_port>
本地端口轉發應用:[2]
背景:在實驗室裏有一臺 LDAP 服務器(LDAP Server),可是限制了只有本機上部署的應用才能直接鏈接此 LDAP 服務器。如今咱們想臨時從本地機器(LDAP Client)直接鏈接到這個 LDAP 服務器,只須要在LDAP Client上運用本地端口轉發:
$ ssh -L 7001:localhost:389 LdapServerHost
圖1 本地端口轉發
數據流向:
該命令首先使本地主機(LDAP Client)與遠程主機(LDAP Server)創建一個SSH安全鏈接(安全通道)
而後本地主機會監聽端口7001(注意是ssh在監聽)
一旦本地LDAP客戶端程序將數據發送到端口7001(即創建鏈接),遠程主機上的sshd將主動與端口389(LDAP服務的端口)創建鏈接
從而來自LDAP客戶端的請求轉發到該端口389上(固然是經過安全通道)
注意:
本地主機有兩個客戶端:
1) ssh – 用於與遠程主機創建ssh鏈接
2) LDAP客戶端 – 用於與遠程主機的LDAP服務程序進行通信
遠程主機對應地有兩個服務進程:
1) sshd – 監聽端口22
2) ldapd -監聽端口389
遠程端口轉發應用:[2]
背景:此次假設因爲網絡或防火牆的緣由咱們不能用 SSH 直接從 LDAP Client 鏈接到 LDAP 服務器(LDAP Server),可是反向鏈接倒是被容許的。那此時咱們的選擇天然就是遠程端口轉發了。咱們此次在LDAP Server上運用遠程端口轉發,所以LDAP Client必須安裝了sshd
$ ssh -R 7001:localhost:389 LdapClientHost
圖2 遠程端口轉發
數據流向:
該命令首先使LDAP Server與 LDAP Client 創建一個SSH安全鏈接(安全通道)
而後LDAP Client開始監聽端口7001(注意是sshd在監聽)
一旦LDAP Client將數據發送到端口7001(即創建鏈接),LDAP Server上的ssh將主動與端口389(LDAP服務端口)創建鏈接
從而來自LDAP客戶端的請求轉發到該端口389上(固然是經過安全通道)
本地轉發與遠程轉發的對比與分析
本地端口轉發:ssh客戶端發起ssh鏈接,而且監聽指定端口
遠程端口轉發:ssh客戶端發起ssh鏈接,可是由遠程主機上的sshd監聽指定端口
多主機轉發應用[2]
圖3 多主機端口轉發
$ ssh -g -L 7001:<B>:389 <D>
注意:咱們在命令中指定了「 -g 」參數以保證機器(A)可以使用機器(C)創建的本地端口轉發。
動態端口轉發
-D <port>
這會使本地主機監聽端口port,一旦與該端口創建鏈接,通過該端口的數據會被轉發到安全通道發送到遠程主機。遠程主機的sshd會根據數據包的應用層協議(如HTTP)自動創建對應的鏈接。
$ ssh -D 7070 sisca@216.194.70.6
登錄前本地主機端口監聽狀態:
$ sudo netstat -lnput | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 927/sshd tcp6 0 0 :::22 :::* LISTEN 927/sshd
登錄後本地主機端口監聽狀態:
$ sudo netstat -lnput | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 927/sshd tcp 0 0 127.0.0.1:7070 0.0.0.0:* LISTEN 5205/ssh tcp6 0 0 :::22 :::* LISTEN 927/sshd tcp6 0 0 ::1:7070 :::* LISTEN 5205/ssh
登錄後遠程主機端口監聽狀態:
$ sockstat -4l
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS (什麼都沒有)
小結:咱們發現,動態端口轉發的時候確實是本地主機的ssh在監聽端口7070的
使用ether-wake實現遠程自動開機
前提條件:
被控端須要使用ATX電源,而且網卡和主板須要支持網絡喚醒功能,還須要知道被控端的MAC地址
具體配置過程以下:
在一臺DHCP服務器(或者任何一臺Linux主機)上安裝net-tools軟件,而後就會產生ether-wake命令,這樣咱們就可使用命令遠程開機了,命令格式以下:
ether-wake -i eth1 被控端MAC地址
具體幫助信息可使用命令ether-wake -u得到幫助。