先前為了想檔暴力試 ssh 的狀況,在 SA 上找到了一些資料參考。
1.
http://phorum.study-area.org/viewtopic.php?t=331942.
http://phorum.study-area.org/viewtopic.php?t=30083&highlight=兩個方式都不錯,我稍微修改了一下,算是把兩種方式做一點小結合。不過對我來說,會 ssh 到我這台電腦的人不多,就小貓兩三隻,所以,以上兩種方式是 ssh 一直開著,等到發現有人在試密碼時再將他擋掉。
可是我懶,當 IP 抓下來後,我還是得手動加到 bad IP list 裡,這樣子我每次執行 iptables 的 script 時,那些 banned IPs 才會一直被 ban。
另外一個原因是,我的電腦老舊,這 banned IP list 越來越長,越來越長,執行一個 iptables 的 scripy 竟要 20~30 秒。想想這樣下去也不是辦法。
所以換個角度來想,換個方式來作。
ssh port 一直都保持關閉,這樣就不用擔心會被狂試密碼。等到我要連進來的時候把我的 IP 加到允許連入 ssh 就好了。
有幾個現成的套件可以滿足我的需求:
1.
knockd2.
portknocking當然還有其他的,我就不詳列了。
我選擇的是 knockd。
為啥呢?倒不是我深入去比較覺得它比較好,而是... 我懶... knockd 有現成的套件可以安裝,也符合我的需要如此而已。
要做的第一件事當然是安裝套件。
還是一句老話,親愛的 Debian 用戶,請執行:
apt-get install knockd
至於不是用 Debian 的人,knockd 的官方網站在:
http://www.zeroflux.org/cgi-bin/cvstrac.cgi/knock/wiki請自行下載來安裝囉!
安裝好後自然是要設定囉!
第一步先修改 /etc/default/knockd
# control if we start knockd at init or not
# 1 = start
# anything else = don't start
START_KNOCKD=1
# command line options
KNOCKD_OPTS="-i eth0"
我修改的部份:
START_KNOCKD=1 就是讓 knockd 在 init 時啟動。
KNOCKD_OPTION 的部份就是啟動 knockd 時的參數。我只列了他要監聽的介面。其他的部份請詳閱 man page。
第二步就是修改 /etc/knockd.conf
[options]
logfile = /var/log/knockd.log
[openSSH]
sequence = port1,port2,...portx
seq_timeout = 30
tcpflags = syn
start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
[closeSSH]
sequence = portA,portB,...portX
seq_timeout = 5
command = /etc/init.d/firewall
tcpflags = syn
[options] 這裡的設定就是:
指定 logfile 的檔案。
[openSSH] 的部份就是先設定:
1. sequence 指定你選用的幾個 ports 及順序。
2. seq_timeput = 30 就是這個 sequence 的 knocking 要在 30 秒內完成
3. tcpflags 設定 tcp 的 flag。
4. start_command 就是你要執行的東西!在這例子就是接受你做 knocking 動作的 IP 到 22 port。
[closeSSH] 的部份大同小異:
唯一有差的就是執行的指令而已。
修改完 /etc/knockd.conf 後請記得重新啟動 knockd。
Server 設定完了,接下來就是 client 要如何使用:
在 client 端,執行:
knock host port1 port2 portx
依照你先前設定的 ports 及順序就 ok 了!
當然這不只能用在 ssh 上,還有很多用法就請您再發揮自己的想像力囉!
其實還有許多設定的方式,端看您的需要。
我這一篇其實算是蠻精簡的,我下面提供的連結及 man page 有更多的範例可參考!
設定的部份我有參考一些網站:
1.
http://www.zeroflux.org/cgi-bin/cvstrac.cgi/knock/wiki2.
http://frobnosticate.com/?p=813.
http://gentoo-wiki.com/HOWTO_autossh_and_knockd