設置防火牆策略時,關於SSH:22訪問權限,我們常常會設置服務器只接受某個固定IP(如公司IP)訪問,但是當我們出差或在家情況需要登錄服務器怎么辦呢?
常用兩種解決方案:1.通過VPN操作登錄主機; 2.使用ping鑰匙臨時開啟遠程主機SSH:22端口;
我們今天就討論第2種方案,闡述如何通過ping鑰匙來臨時打開SSH:22的訪問權限
原理: recent 模塊可以記錄最近訪問者IP,常利用此功能做DROP策略應對syn-flood及ddos攻擊。但在本例中我們反其道,利用recent模塊做ACCEPT策略,就是創建一個sshKeyList列表,當此列表內的IP地址達到命中次數后,讓服務器放行此IP地址對SSH:22端口的訪問,我們要做的就是想辦法將我們當前客戶端這個動態IP記錄進去,怎么記錄進去呢?利用ping命令就可以,ping命令可以把源IP帶給遠程服務器啊!ping命令就好比一把臨時打開遠程服務器SSH:22的鑰匙。
方案: 是鑰匙就得有鑰匙齒,要有一定的安全級別,不能讓人那么容易猜出規律,怎么造鑰匙齒呢?length模塊可以匹配報文總長度,所以第1個鑰匙齒就是ping包大小必須是我們自定義的,第2個齒就是ping的次數也是我們自定義的,第3個齒就是要在指定的時間內登錄SSH:22。
小結一下,服務器只有在“指定時間內收到固定大小的ping包+ping次數”才臨時為此源IP放行SSH:22端口訪問權。
實施: 任一客戶端向服務器發送Data大小為1050字節的ping包,發5次,服務器就自動為此客戶端開啟SSH:22端口訪問權限(30秒內有效)
注意:ICMP報文結構: IP頭部(20Bytes) + ICMP頭部(8Bytes) + 數據部分Data
計算:若按此方案服務器端實際接收的ICMP數據包總大小為 20+8+1050=1078Bytes
規則: 共5條規則
# 規則1 只接受Data為1078字節的ping包,並將源IP記錄到自定義名為sshKeyList的列表中 # iptables -A INPUT -p icmp -m icmp --icmp-type 8 -m length --length 1078 -m recent --name sshKeyList --set -j ACCEPT # 規則2 若30秒內發送次數達到6次(及更高),當發起SSH:22新連接請求時拒絕 # iptables -A INPUT -p tcp -m tcp --dport 22 --syn -m recent --name sshKeyList --rcheck --seconds 30 --hitcount 6 -j DROP # 規則3 若30秒內發送次數達到5次,當發起SSH:22新連接請求時放行 # iptables -A INPUT -p tcp -m tcp --dport 22 --syn -m recent --name sshKeyList --rcheck --seconds 30 --hitcount 5 -j ACCEPT # 規則4 對於已建立的連接放行 # iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT # 規則5 老規矩:最后的拒絕 # iptables -A INPUT -j DROP
測試效果
Windows下默認ping次數為4次,默認ping包大小為32字節
C:\Users\Administrator>ping 192.168.137.66 -l 1050 -n 5 正在 Ping 192.168.137.66 具有 1050 字節的數據: 來自 192.168.137.66 的回復: 字節=1050 時間<1ms TTL=64 來自 192.168.137.66 的回復: 字節=1050 時間<1ms TTL=64 來自 192.168.137.66 的回復: 字節=1050 時間<1ms TTL=64 來自 192.168.137.66 的回復: 字節=1050 時間<1ms TTL=64 來自 192.168.137.66 的回復: 字節=1050 時間<1ms TTL=64
Linux下默認ping次數為無限次,默認ping包大小為56字節
[root@martin ~]# ping 192.168.137.66 -s 1050 -c 5 PING 192.168.137.66 (192.168.137.66) 1050(1078) bytes of data. 1058 bytes from 192.168.137.66: icmp_seq=1 ttl=64 time=0.711 ms 1058 bytes from 192.168.137.66: icmp_seq=2 ttl=64 time=1.00 ms 1058 bytes from 192.168.137.66: icmp_seq=3 ttl=64 time=0.629 ms 1058 bytes from 192.168.137.66: icmp_seq=4 ttl=64 time=1.32 ms 1058 bytes from 192.168.137.66: icmp_seq=5 ttl=64 time=1.02 ms
然后呢,就可以登錄SSH了(30秒內有效,動作快點),由於有"--state ESTABLISHED -j ACCEPT"護駕,所以也不用擔心被踢,OK,實現遠程安全SSH登錄管理就這么簡單。