Archive for the ‘電腦科學’ Category
Apache 設定
Apache 的說明文件其實很完整,所有的 options 都有詳細說明。不過感覺對初學者不是很友善,國中的時候很多地方都看不懂。
有時候也要用一下搜尋才找的到需要的資料,因為東西太多了,像是模組 就有數十個。
Apache 的設定檔位於 /usr/local/etc/apache22/httpd.conf(Includes/ 和 extra 裡面也有一些設定)。
節錄一下設定檔:
# 這是 Apache 程式、設定檔的路徑,正常人不會想改他
ServerRoot "/usr/local"
# 設 Apache 要聽哪個 port(前面可加 IP),除非有用 reverse proxy 否則不需要更動
Listen 80
# 載入一堆模組,有很多可以移除,但不確定的話建議別亂改
# LoadModule foo_module modules/mod_foo.so
# Apache 要以什麼使用者和群組執行
# 要注意一下會有一個程序是以 root 執行,原因是
# port 80 需要權限才有辦法 bind,因此需要 root
User www
Group www
# 管理員信箱
# 根據 RFC 2142 應該設成 webmaster@domain.tld,www@ 為 alias
ServerAdmin webmaster@hs.ntnu.edu.tw
# 網頁的資料,我通常都設成 /home/www/hostname
DocumentRoot "/home/www/www"
# 目錄之權限,預設當然是封鎖所有目錄
<Directory />
AllowOverride None
Order deny,allow
Deny from all
</Directory>
# 網頁所在的目錄之設定
<Directory "/home/www/www">
# 允許 symlinks,預設有 Indexes 但被我拿掉了
Options FollowSymLinks
# 建議不要用 .htaccess 設定,效能差
AllowOverride None
# Allow 所有人
Order allow,deny
Allow from all
</Directory>
# 預設送哪些檔案,我加了 PHP
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>
# 拒絕看 .htaccess 與 .htpasswd
<FilesMatch "^\.ht">
Order allow,deny
Deny from all
Satisfy All
</FilesMatch>
# 紀錄檔位置,我通常會改目錄,這樣比較整齊
ErrorLog /var/log/httpd/httpd-error.log
# 紀錄之詳細程度
LogLevel warn
基本的設定檔就到這裡。接下來就是模組、額外的設定。看到 httpd.conf 最下面有很多被註解掉的設定檔。
extra/httpd-mpm.conf:管理 Apache 程序,除非流量很大否則預設就好extra/httpd-userdir.conf:使用者網頁專用的模組extra/httpd-info.conf:一些 server 的資訊extra/httpd-vhosts.conf:虛擬主機,很有用,但 SSL方面有些限制extra/httpd-default.conf:一些 Apache 的設定extra/httpd-ssl.conf:SSL 的設定
通常我會改 httpd-info.conf、httpd-default.conf,httpd-vhosts.conf、httpd-ssl.conf 有用到才會設。
httpd-info.conf:最好設成只有 127.0.0.1 可以看,或乾脆拿掉,有需要再啟用。另外,可以用 ExtendedStatus On。
httpd-default.conf:改 ServerTokens Prod 和 ServerSignature Off。
因為 httpd-vhosts.conf、httpd-ssl.conf 設定比較複雜,先跳過。
一些常見的設定:
<Directory>:目錄<FilesMatch>:檔案<Location>:URL 的部分AddType:Content 種類Header:HTTP headerFileETag:ETag 的設定SetOutputFilter:可以用來壓縮Alias:別名RedirectRewrite:有點像 mod_alias 的加強版- IndexOptions
一些常用的模組:
- headers
- cache
- expires
- deflate
- alias
- rewrite
- ssl
- vhost_alias
除此之外,CGI、PHP 和 content negotiation 也是一些常用的功能。
安裝 Apache
網路上有很多種不同的 server,其中 Apache 是最受歡迎也是使用最久的 server 之一。現在 Netcraft 的 survey 顯示 Apache 佔了市場的 47%,接下來才是 IIS、nginx、lighttpd。
Apache 因為使用廣泛、歷史悠久,主要的優點包含:
- 功能完整
- 穩定
- 支援度高
但比起 nginx、lighttpd 這兩個後起之秀,效能沒有那麼好。
現在仍然有許多網站使用 Apache,如 Wikipedia、W3C、ISC、Google(據說是用改版的 Apache)。
Apache 除了靜態網頁之外,還可以配合 PHP 與 MySQL 做動態網頁。
灌 Apache 其實很簡單,只要下:
# cd /usr/ports/www/apache22 && make install clean
模組很多,基本上用預設就好,不過可以不選 DAV、DAV_FS、CERN_META、IMAGEMAP(若要用 Subversion 要留 DAV、DAV_FS)。
接下來把 apache22_enable="YES" 加入 /etc/rc.conf 就可以啟動 Apache 了:# /usr/local/etc/rc.d/apache22 start。
除了 script 以外,還有 apachectl 可以使用。
測試設定檔有沒有問題:
# apachectl configtest
啟動 Apache:
# apachectl start
停止 Apache:
# apachectl stop
重新啟動 Apache:
# apachectl restart
重新啟動 Apache:
# apachectl graceful
restart 與 graceful 的差別在於 graceful 會先等現有的連線結束後才重新啟動。通常建議用 # apachectl graceful。若 Apache 沒有啟動,restart 與 graceful 都會啟動 Apache。
Apache 的設定檔位於 /usr/local/etc/apache22/httpd.conf(Includes/ 和 extra 裡面也有一些設定)。
詳細設定之後在打。
一次設定完 ports
FreeBSD 上編 ports 的時候,常常會有 options 選單跳出來。有時候想下完指令然後給他自己跑,結果到某一步又有選單跑出來,沒辦法繼續。不久之前看到了一個解決方式:config-recursive。一次將所有的 dependencies 設完再開始安裝。
若第一次安裝就用:
# make config-recursive install clean
其實 ports 有很多關於 make 的選項,都可以在 /usr/ports/Mk/bsd.port.mk 裡找到(大約 700 行的地方)。
升級到 FreeBSD 8.0-RELEASE
從段考前就一直期待 FreeBSD 8.0-RELEASE(害我沒辦法專心看書…)。直到昨天才 announce。其實幾天前 mirror 上面早就有了,不過要等大部分的 mirror 都 sync 完之後才會公佈。
這次 release 改了很多東西(每次 FreeBSD 邁入下一個版本的時候都是如此)。綜合一下這幾篇的重點:
主要更新有:
- 新的虛擬化技術「vimage」,這是針對 FreeBSD Jails,現在每個 jail 都可以有獨立的 network stack
- 舊的 TTY layer 被取代了,新的對 SMP 有更好的支援
- Linux emulation layer 更新成
2.6.16,Linux port 則用emulators/linux_base-f10 GENERIC核心包含 Trusted BSD MAC- 整個 USB stack 被重寫
- ZFS 版本更新到 13
- 支援 NFSv4
- gvinum 被更新
- ULE scheduler 被改善
這次升級出了狀況,太早將 old libraries 砍掉,結果破壞了 backward compatibility。很多 ports 無法使用。幸好有修好。
更新其實還算簡單,沒有碰到什麼問題(除了我腦殘以外)。
先抓 RELENG_8_0 的 source 回來。將 supfile 的 RELENG_7_2 改成 RELENG_8_0,然後 # csup -g -L 2 standard-supfile:
*default host=cvsup3.tw.freebsd.org *default base=/var/db *default prefix=/usr *default release=cvs tag=RELENG_8_0 *default delete use-rel-suffix *default compress src-all
接下來就設定 kernel。把 /usr/src/sys/i386/conf/GENERIC 複製到 /root/kernels/MYKERNEL,然後再 symlink 到 /usr/src/sys/i386/conf/MYKERNEL。這次 kernel 沒什麼大變化,除了 acpi 被加進 GENERIC。
設好後就開始編了:
# cd /usr/src # make -j 6 buildworld # make -j 6 buildkernel KERNCONF=MYKERNEL # make installkernel # reboot
跟 Handbook 步驟差不多,-j 會加快速度,kernel 也用 custom 的。雖然說 major upgrade 最後先用 GENERIC,但懶得用,所以就冒險一下(其實我有從 mirror 抓回 GENERIC 然後放到 /boot/kernel.GENERIC)。
家裡編 world + kernel 大概要 40 分鐘吧,新的電腦可能不用 20 分鐘就完成了。
重開機進入「single user mode」:
# adjkerntz -i # mount -a -t ufs # mergemaster -p # cd /usr/src # make installworld # mergemaster -Fi # reboot
也跟 Handbook 差不多,但 mergemaster 加上了 -Fi。-F 會自動更只有 $FreeBSD$ 不一樣的檔案,-i 會自動安裝 /etc/ 底下不存在的檔案。應該沒什麼困難。
這樣就跟新完了。Kernel 有留 COMPAT_FREEBSD7 的話 ports 應該還可以用,舊的 libraries 也別急著刪掉。
像我就不小心看掉 libraries,只好放大絕(# pkg_delete -a),然後用 packages 重裝。大部分的時間都花在下載 packages。
話說星期一要換新的 mail server 了,等了好久 :-)。
HiNet DNS 伺服器不正常?
大概是暑假的時候發現 HiNet 的 DNS 伺服器(dns.hinet.net)有點奇怪。有某些網路正解會 freeze 住,不知道原因。換其他 DNS 伺服器就沒問題。
這兩個就會 freeze:
# dig @dns.hinet.net www.over-yonder.net # dig @dns.hinet.net www.cinepaint.org
www.undeadly.org 正解也有點問題。
正常的應該像這樣:
# dig www.over-yonder.net ; <> DiG 9.4.3-P2 <> www.over-yonder.net ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33885 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2 ;; QUESTION SECTION: ;www.over-yonder.net. IN A ;; ANSWER SECTION: www.over-yonder.net. 390 IN A 75.65.60.123 ;; AUTHORITY SECTION: over-yonder.net. 390 IN NS ns.silohost.com. over-yonder.net. 390 IN NS ns2.silohost.com. ;; ADDITIONAL SECTION: ns.silohost.com. 169590 IN A 66.20.47.5 ns2.silohost.com. 169590 IN A 66.20.47.2 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Sat Nov 14 14:19:12 2009 ;; MSG SIZE rcvd: 132
試了幾次都沒辦法解決,所以現在都沒在用 dns.hinet.net(168.95.1.1)了。反正學校有 ns1、ns2,家裡直接用 BIND 在 localhost 架一個 caching 的 DNS 伺服器。
更新:和 buganini 學長做了一些測試,發現應該是 timeout 所造成的。從某些地方連到上面的 DNS 伺服器 latency 比較高,因此 query 的時候可能會有 timeout,不過還不完全確定。已經寄信去問了。
更改 MySQL 使用者的密碼
我印象中第一次在 FreeBSD 上灌 MySQL 的時候應該是高一吧。那時候不知道怎麼用 mysql 改 root 的密碼,因為國中都用 phpMyAdmin,對 SQL 一無所知。
自從暑假用 MySQL 當作 mail server 的 backend,就開始學 SQL 了。一直用 phpMyAdmin 不是辦法。當然,最重要的指令就是更改 root 的密碼了。
安裝、啟動 MySQL 之後,進入命令列:
# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 80 Server version: 5.1.40-log FreeBSD port: mysql-server-5.1.40 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
第一次看到這個就傻眼了,因為不知道該做什麼。其實很簡單,只要執行:
mysql> UPDATE mysql.user SET password = PASSWORD('newpass') WHERE user = 'root'; mysql> FLUSH PRIVILEGES;
就可以更換 root 的密碼了(記得把「newpass」改成自己的密碼)。
UPDATE 是更新 mysql 資料庫裡的 user table。SET 是設定,PASSWORD 是 MySQL 內建的 hash function,用來加密密碼。後面的 WHERE 限制更改使用者為 root 的密碼。最後 FLUSH PRIVILEGES 會告訴 server 重新載入權限的資訊。
glabel
其實 glabel 在 FreeBSD 上是一個很實用的程式,不過平常可能很少聽到他。之前灌 FreeBSD 有提過 glabel。
當硬碟、隨身碟插在不同的 port,名稱會變來變去。硬碟可能從 /dev/ad0 變成 /dev/ad1,隨身碟可能從 /dev/da3 變成 /dev/da7。原因是作業系統通常指認得硬體插在主機板上那一個 port。
如果插在不同電腦或 port 上名稱會改變是一件非常麻煩的事。因此,就會想給他一個固定的名稱。此時,glabel 就可以發揮公用。
因為 glabel 會將資料寫入硬體當中,因此必須先卸載裝置才能 label 上去。最簡單的方式就是重新開機,然後進入「single user mode」。
使用 glabel 前請先確認 kernel 是否有加 GEOM_LABEL 這個選項(GENERIC 預設有)或有 geom_label.ko 這個模組。沒有的話,請先重新編譯 kernel。
進入 single user mode 之後就可以開始下 # glabel label -v name dev(-v 會增加訊息的詳細程度)。
之前灌新的 mail server 的時候,我就開始用 glabel 了(主要原因其實是建 RAID-Z)。按照 /etc/fstab 的順序 label 比較不會搞混或漏掉:
# glabel label -v swap /dev/ad4s1b # glabel label -v root /dev/ad4s1a # glabel label -v home /dev/ad4s1g # glabel label -v tmp /dev/ad4s1e # glabel label -v usr /dev/ad4s1f # glabel label -v var /dev/ad4s1d
標完後可以用 # glabel status 或 # glabel list 看結果:
# glabel status Name Status Components label/root N/A ad4s1a label/swap N/A ad4s1b label/var N/A ad4s1d label/tmp N/A ad4s1e label/usr N/A ad4s1f label/home N/A ad4s1g
確定 label 成功後就更新一下 /etc/fstab :
# Device Mountpoint FStype Options Dump Pass# /dev/label/swap none swap sw 0 0 /dev/label/root / ufs rw 1 1 /dev/label/home /home ufs rw 2 2 /dev/label/tmp /tmp ufs rw 2 2 /dev/label/usr /usr ufs rw 2 2 /dev/label/var /var ufs rw 2 2
下次開機就會使用這些 label 了。重新開機前,請再三確認 label 有成功和 /etc/fstab 沒有錯誤,因為沒弄好的話可能無法開機,需要用救援光碟去救回來。
這樣就完成了。Man page 上有更詳細的說明。
OpenSSH
熟悉 BSD、Unix、Linux 的人應該都聽過 SSH 這個協定。SSH 主要用途是遠端登入,不過也可以做 port forwarding、tunneling(通常用來鑽防火牆)、SOCKS 或用來傳檔案。SSH 之所以會出現是要取代 telnet 等程式,因為 telnet 連線未經過加密,容易被竊聽。
這篇會提到怎麼架 OpenSSH 和一些常用的指令。
大部分的 BSD、Unix、Linux 作業系統上都有 SSH 的程式,其中使用最廣泛的應該是 OpenSSH。OpenSSH 是由 OpenBSD 的開發者開發。
OpenSSH 是 OpenBSD 的一個部分,而開發的時候會釋出一個「portable」的版本,可以移植到其他作業系統。目前 FreeBSD 7.2 的 base 包含 OpenSSH 5.1p1。
阻擋 SSH brute force
架好 FreeBSD 或 Linux 之後,常常見到的一個現象就是 SSH 持續的遭受攻擊。在 security run output 會看到這樣的訊息:
ns.hs.ntnu.edu.tw login failures: Oct 30 02:25:01 ns sshd[12801]: Invalid user master from 140.124.62.197 Oct 30 07:13:22 ns sshd[14529]: Invalid user globus from 213.99.38.3 Oct 30 07:13:31 ns sshd[14535]: Invalid user condor from 213.99.38.3 Oct 30 07:13:32 ns sshd[14534]: Invalid user cadi from 213.99.38.3 Oct 30 07:26:44 ns sshd[14591]: Invalid user simoni from 124.193.106.107
看到就覺得很煩,因為每天都有,而且若不阻檔的話,可能會有數千比,系統也有機會遭到入侵。
為了阻擋 SSH brute force,我在 FreeBSD 上裝了 security/sshguard-pf,sshguard 的好處是他可以判別很多種紀錄檔,也支援許多種防火牆。另外,也可以調整多久時間內登入失敗幾次,還有要擋掉多久。
目前可以判讀這些軟體的紀錄檔:
支援的防火牆包含: