先前為了想檔暴力試 ssh 的狀況,在 SA 上找到了一些資料參考。
1. http://phorum.study-area.org/viewtopic.php?t=33194
2. 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. knockd
2. 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。

至於 client 端:
1. 可用內附的 knonk 程式 (有 Linux, Cygwin, & Windows)

knock -v host port1 port2 port3

2. 也可以用 nmap:

nmap -sT -P0 -PSPort1,Port2,Port3 --packet_trace -v host

3. 也可以用 Telnet:

telnet host Port1
telnet host Port2
telnet host Port3


不過,我比較偏好用第一及第二種方法。

當然這不只能用在 ssh 上,還有很多用法就請您再發揮自己的想像力囉!

這兩天我會再補上在 Linux 下,用 wrapper 簡化 ssh 的步驟!

設定的部份我有參考一些網站:
1. http://www.zeroflux.org/cgi-bin/cvstrac.cgi/knock/wiki
2. http://frobnosticate.com/?p=81
3. http://gentoo-wiki.com/HOWTO_autossh_and_knockd