2007-01-12

SSH 的設定和啟用

之前都是用 telnet 連進 router 做設定,但這是一種很不安全的連線方式,容易被監聽竊取帳號密碼,所以我們要另外跑一個安全的連線服務:SSH (Secure Shell)。Windows PC 端的連線程式 (SSH client) 可以找這裡 ,或是 piaip 開發中文版的 PieTTY

其實在 Oleg 的韌體裡已經有 SSH Server 在裡面,程式名稱叫 dropbear (丟熊?),要啟動該服務要做的事情有三件:1. 設定 dropbear 的 SSH 連線金鑰,2. 要求每次開機這個服務自動啟動,3.在防火牆上打洞讓你可以從外面連進來。接下來我們根據以上的步驟依序來進行設定。

1. 金鑰設定
首先,我們要先建立存放金鑰的目錄。Oleg 的韌體要求預設目錄在 /usr/local/etc/dropbear,所以我們手動建立目錄:

mkdir -p /usr/local/etc/dropbear

接下來要求產生 key pair (DSS & RSA),要多花一點點時間等待:

dropbearkey -t dss -f /usr/local/etc/dropbear/dropbear_dss_host_key
dropbearkey -t rsa -f /usr/local/etc/dropbear/dropbear_rsa_host_key

2. 開機自動啟動
還記得上一篇我們為了一開機時就自動 mount 磁碟機所產生的 /usr/local/sbin/post-boot 嗎?要 SSH 一開機啟動只要在這個檔案裡加兩行就行了。先用 nano 開啟這個檔案以便編輯:

/opt/bin/nano /usr/local/sbin/post-boot

然後在最後面加入下面兩行:

# Start SSH daemon
dropbear

ctrl+o 存檔然後 ctrl+x 離開就行了。

3. 防火牆設定
如果你有固定 IP 或網址,需要從外面連你的 router 進行設定才需要進行這個步驟,如果不開防火牆設定,你的 SSH 服務就只能在家裡面使用(外面連不進來)。同樣的還記得上一篇有提到,我們在建立 post-boot 時順道做了一個 post-firewall?這時候就派上用場了。同樣地用 nano 開啟檔案:

/opt/bin/nano /usr/local/sbin/post-firewall

然後加入下面的內容在檔案裡(裡面應該是空白的):

#!/bin/sh
iptables -D INPUT -j DROP

# Port 22 used for SSH server
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t nat -A PREROUTING -i $1 -p tcp --dport 22 -j DNAT --to-destination $4:22
iptables -A INPUT -j DROP

上面幾行的意思,就是要機器對外的 Port 22 打開,連線進來的時候轉向到機器本機的 Port 22。一樣使用 ctrl+o 存檔然後 ctrl+x 離開就行了。

別忘了,因為我們是動到 /usr 下面的檔案,都是存在 flash 裡面的,如果沒有去 save & commit 結果,重新開機就會消失喔!所以還是要要求寫入 flash:

flashfs save
flashfs commit
flashfs enable

完成之後就可以重新開機 (reboot) ,然後就用 SSH Client 程式從家裡或是外面連進來試試看能不能成功囉!(重開完,用 ps 這個命令應該會看到有 dropbear 這個 process 在跑才是)

參考文章:
Olegs firmware SSH Server guide
[HowTo] Getting started (Firmware upgr, Storage, Samba, SSH)

回應: 14

Unknown 提到...

趁著出差的空檔,依照abin兄的提示,已經把lighttpd+fastCGI、VSftp給搞定,有鑑於Abin的經驗,不敢裝太多服務。

從內部(LAN)已可以使用Web和ftp,但目前仍無法由外部(WAN)連進來,想請問Abin兄,在WL500g(WEB介面,非由Telnet或SSH登入)oleg的設定,如firewall等是否要調整?

另外,我的post-firewall內容如下,是否有誤呢?

#!/bin/sh
iptables -D INPUT -j DROP

# Port 21 used for VSFTP server
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -t nat -A PREROUTING -i $1 -p tcp --dport 21 -j DNAT --to-destination$4:21

# Port 8080 used for internal THTTP server, port 80 used for external access
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i $1 -p tcp --dport 80 -j DNAT --to-destination $4:8080

iptables -A INPUT -j DROP

Abin 提到...

裝完 Oleg 的 Firmware,其實就很少用 WEB 介面了,現在會用,就是拿來關閉 Telnet 或是 Wireless 服務而已。

機器不能從外面連進來,只有防火牆設定因素 (不過,還要確定你使用的電腦防火牆、你家裡固定 IP 或網址環境和設定都正確)。iptables -A 這一行主要是在防火牆上打洞,而 iptables -t 這行是設 routing rule,把外面某個 port 進來的連線 ($1) 轉到哪裡,router 本機是 $4,也可以設你家裡的其他 private IP。

FTP 的部分,destination 和 $4 中間少了一個空格(其實刪掉這行也可以,本機的 Port 不用 re-route)。Web 的部分,看來你是把外面的連線 (port 80) 轉到 router 本身的 8080,所以你在內部測試,應該看看 port 8080 能不能用,像是 http://wl500g:8080 (防火牆 8080 也有開,如果 Web service 有跑,內外應該都可以連),最後在外面再測試 port 80。基本上只要服務有跑在 port 8080,你 Web 的防火牆設定看來沒錯。

Unknown 提到...

嗯,一天進步一點點,看了你的說明後,回家不甘心又試了幾個地方,目前成果如下:
1. 在Lan下,已經可以正常連到lightpd server,直接正常顯示我自己的撰寫WEB畫面(http://192.168.1.2:8080)。
2. 在Wan下,外部也可以連結到,但是會跳出輸入使用者ID和PASSWORD視窗,目前這裡尚找不到解決方法。
3. 原本不能執行的Samba,進到OLEG的WEB設定,加入Hostname:WL500g後(和你的網站設定一樣,之前透過TELNET改Hostname,ReBoot後均會消失),網路芳鄰也可以正常看到了。
後來發現有很大的原因是我在WEB設定了DMZ,改掉之後就正常了,除了第2項外。

加油,快要成功了!

Abin 提到...

恭喜~
嗯!我是沒設過 DMZ,所以一切步驟都很順利。你剩下的第二個問題,會跳出詢問帳號和密碼,想必又是連到 WL-500g 原來的設定介面了,也就是外面的 Web 連線 port 80 還是 route 到本機的 port 80,這應該要是 route 到本機的 port 8080才是。

Unknown 提到...

可以了,搞定,感謝Abin的提醒,原來我把POST-FIREWALL那一行設定給分成2行而不自覺。

過年前把我的給搞定,真是快樂。接下來回嘉義去就可以遠端遙控啦。

目前剩下CGI的部分尚未測試(其實我也不甚了解,就是計算到訪次數的部分啦)。

感謝喔!

Unknown 提到...

抱歉,多問一下,我在登入後執行PS指令,會發現有重複執行的服務,分別為dropbear和php-fcgi,這樣是正常的嗎?

以下為我的服務。

PID Uid VmSize Stat Command
1 admin 260 S /sbin/init
2 admin SW [keventd]
3 admin SWN [ksoftirqd_CPU0]
4 admin SW [kswapd]
5 admin SW [bdflush]
6 admin SW [kupdated]
7 admin SW [mtdblockd]
39 admin 64 S telnetd
44 admin 332 S httpd eth1
47 admin 116 S klogd
51 admin 164 S syslogd -m 0 -O /tmp/syslog.log -S -l 7
52 nobody 312 S dnsmasq
57 admin SW [khubd]
70 admin SW [usb-storage-0]
71 admin SW [scsi_eh_0]
74 admin 212 S pppoe-relay -C br0 -S eth1 -F
88 admin 552 S pppd file /tmp/ppp/options.wan0
90 admin 368 S watchdog
93 admin 136 S ntp
102 admin SW [kjournald]
112 admin 284 S /opt/sbin/xinetd
115 admin 3260 S /opt/bin/php-fcgi -b 1026
124 admin 572 S /opt/sbin/lighttpd -f /opt/etc/lighttpd/lighttpd.conf
129 admin 276 S dropbear
132 admin 2328 S /opt/bin/php-fcgi -b 1026
175 admin 708 S dropbear
176 admin 544 S -sh
184 admin 420 S upnp -D -L br0 -W ppp0
189 admin 408 R ps

Abin 提到...

這樣是正常的。並不一定每個服務都只有一個 pProcess,像 CGI 和 SSH 只要有多個連線或程式在跑,就會有多個 process 跑出來,我實際的狀況也是如此。
不過,如果連線都斷了,程式也都沒在跑,還有「很多」 process 在跑不結束,那就要小心系統記憶體用完,機器莫名其妙當掉囉!(SSH 不會,不過 CGI 就不一定了)

Unknown 提到...

Thanks Abin so much.
It will be a nice year.

Happy new year for you and all others.

匿名 提到...

When i:

[admin@asus root] flashfs save
tar: Removing leading '/' from member names
tmp/local/
tmp/local/local/root/
-rw-r--r-- 1 root root 116 Jun 28 03:56 /tmp/flash.tar.gz
Check saved image and type "/sbin/flashfs commit" to commit changes

[admin@asus root]$ cat /.version
1.9.2.7-7g

who can help me solve this problem ,tks!

Abin 提到...

What is your problem? "flashfs save" is used for backup your configuration with a tar file. That is normal.
You have to "flashfs commit" to apply all configurations after backup, then "enable" it.
That is why there are three commands to apply changes to FLASH.

匿名 提到...

出现这个问题时我以为这是错误提示,我原本是想SSH设定进用这FLASHFS SAVE命令的,但是后来因为出现了这个问题,把我折腾了两天,我试了很多方法,都还是这个样子,现在我把原来设定好的文件(POST-BOOT和POST-FIREWALL)都删了,现在应该怎么做呢?请指教,谢谢,还有现在我最想做的是安装FTP.MYSQL和APACHE.请帮帮忙好吗?

Abin 提到...

原來您是誤會了,以上的都是正確的訊息。
那兩個設定檔砍掉了,另外在新建檔案就是了啊,一個是開機會執行的檔案,一個是防火牆設定檔,預設本來就是沒有的,照本文的方式手動建立存檔就是了。
另外要架 FTP,請參閱這篇文章。MySQL 和 Apache 在這台小 Router 上應該是跑不動,即使成功裝起來,效能會出奇的差。我自己是試裝過 thttpdlighttpd 來取代 Apache,SQLite 取代 MySQL,這些羽量級的服務跑起來都不甚理想了,要跑負載更重的服務可能辛苦安裝會徒勞無功,請三思。

匿名 提到...

不好意思我想請問一下,我的SSH和ftp都安裝完成了,但是都沒有辦法從外面連進來,firewall我也都設定好了,以下是我的設定

#!/bin/sh
iptables -D INPUT -j DROP

# Port 21 used for VSFTP server
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -t nat -A PREROUTING -i $1 -p tcp --dport 21 -j DNAT --to-destination $4:21

# Port 22 used for SSH server
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t nat -A PREROUTING -i $1 -p tcp --dport 22 -j DNAT --to-destination $4:22
iptables -A INPUT -j DROP

是不是設定出錯了??
還有我的ip是學校的固定ip,這些設定只有輸入192.168.1.1才有辦法連到,但輸入我的固定ip就會連不到,希望abin能夠給我一些建議,謝謝

Abin 提到...

「還有我的ip是學校的固定ip,這些設定只有輸入192.168.1.1才有辦法連到」,既然你是用固定 IP,你有改過你 500g 的 IP 位置嗎?你說你用 192.168.1.1 連得上,那代表不是防火牆或服務設定的問題,是你根本就沒有把機器的 IP 改成固定 IP,那外面當然連不進來啊!
請先用瀏覽器連上「192.168.1.1」,用官方的設定網頁去調整 500g 的 IP 成為「固定 IP」,才能從外面連進你這台機器!

張貼留言

歡迎留言或發表意見,不過要理性不做人身攻擊。匿名的朋友得到回應的速度會比較慢喔~
發問相關的禮貌和規矩請先參考這篇文章,不當留言、和本文無關的回應可能會被直接刪除無視喔!