歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> Unix教程 >> 基於OpenBSD的寬帶上網共享和網絡服務

基於OpenBSD的寬帶上網共享和網絡服務

日期:2017/2/27 17:40:27   编辑:Unix教程
OpenBSD



前言
隨著個人計算機的普及,對於家庭用戶來說,擁有一台以上PC的已經不少了,我們希望能夠方便地同時上網。一些規模較小的學校、科研單位、商業機構,由於難以負擔足夠IP地址的費用,對共享IP上網也有迫切的需要。
隨著寬帶上網的逐漸推廣,多台計算機共享一個Internet高帶寬的連接顯得越來越有意義。比較常見的做法一是購買專門的網絡地址翻譯(下簡稱NAT)機,二是在一台網關計算機上安裝NAT軟件或者應用程序代理服務軟件1,其他計算機通過這個網關上網。第一種方法雖然安裝、維護比較簡便,性能好,但是需要進行一定的設備投資,並且NAT機的功能相對比較單一,難以實現其他Internet服務。第二種方法,網關機的操作系統如果使用Windows 95/98則穩定性不佳,不適合長期開機;使用Windows NT/2000則對作為硬件配置要求相對較高。
於是手頭有一台低配置PC機的用戶可能會想到Linux,但是本文要介紹的是BSD。與Linux不同,BSD是AT&T UNIX的“後代”,它不象Linux那樣發行版本眾多,卻有更好的性能、可靠性與安全性。
目前有3個源碼開放的BSD版本:FreeBSD,NetBSD和OpenBSD。FreeBSD是用戶數最多的版本,它的主要特點是性能好,Yahoo、ftp.cdrom.com等知名網站用的就是這個操作系統。NetBSD的特點是對各種硬件平台的廣泛支持,它支持從手持設備到大型服務器的多種平台。OpenBSD的特點是安全性,在OpenBSD的網址,我們可以看到這樣一句話:“三年來沒有發現缺省安裝的OpenBSD的一個遠程安全漏洞!”,另外它支持的硬件平台也不少,不過目前還不支持SMP(對稱多處理器)。

現在我們就以線纜(Cable)寬帶接入為例,談談如何利用基於OpenBSD操作系統的網關機,使多台計算機共享一個線纜調制解調器(Cable Modem,下稱CM)的Internet連接。

安裝OpenBSD
我們先准備一下硬件:Pentium133 CPU,16M內存,1G硬盤,2塊以太網卡。其實OpenBSD可以在低得多的配置上運行得很好,不過既然我們會開通一些網絡服務,配置還是不要太低了。另外如果共享上網的客戶機很多,可以適當增加內存。顯卡、顯示器、軟驅、CDROM和鍵盤,僅僅在安裝、配置的過程中需要,一旦系統投入運行,就都不需要了。
兩點建議:(1) OpenBSD的分區工具的功能強大,但是易用性不大好(不如Linux),所以建議將整個硬盤全部分配給OpenBSD使用,不要和其他操作系統混用--不是不可以,而是分區比較麻煩。(2)網卡建議用常見的NE2000兼容網卡,比如Realtek RTL8029(AS)芯片的10M PCI卡。OpenBSD支持的網卡並不是很多,用名牌的網卡對於速度等方面並沒有太大的幫助,萬一兼容性有問題還要添麻煩。
OpenBSD有3種安裝方式:CDROM安裝,FTP安裝和硬盤安裝。如果PC的BIOS支持光盤啟動的話,那麼CDROM安裝是最方便的,我們來看一下安裝的主要過程。
從CDROM啟動後選擇(I)nstall,對提示的“Specify terminal type”直接按回車采用默認值,系統會列出當前所有的硬盤並提問“Which disk is the root disk?”。注意對於IDE接口的硬盤,BSD給它的設備名是 wd0,wd1,……;對於SCSI接口的硬盤是 sd0,sd1,……。我們的PC有一個IDE硬盤,輸入wd0並回車。系統提問“Do you want to use the *entire* disk for OpenBSD?”,輸入yes並回車,系統會啟動fdisk並將整個硬盤空間都分給BSD系統。輸入write、quit,系統會保存分區設置並啟動disklabel。Disklabel的作用是在fdisk建立的給BSD用的BIOS分區中,劃分出不同的BSD分區。我們可以在disklabel的命令提示符“>”下,隨時使用?命令顯示幫助信息,使用p命令打印當前的BSD分區劃分情況。為了不搞得太復雜,我們僅把它劃分為一個“/”和一個swap分區。先用z命令把BSD分區清空,再用“a b”命令添加一個新分區,offset直接回車用缺省值,size輸入“128M”(如果任務比較重而有足夠的磁盤空間,也可以大一些比如256M甚至512M),FS type用缺省的“swap”。然後用“a a”命令添加一個新分區,offset用缺省值,size輸入“*”使用全部剩余空間,FS type用缺省的“4.2BSD”。最後用w、q保存並退出disklabel。接著系統會提示更改mount point信息,看看wd0a和wd0b是不是分別mount到了“/”和“swap”,完成後輸入done結束。如果一切正確就一直回車直到看到“Are you really sure that you're ready to proceed?”,輸入“y”回車,系統就開始格式化硬盤了。格式化完畢,先不要進行網絡配置。接著是設置root用戶的口令。下面問要不要運行X Window System,這個圖形用戶界面對我們沒有用,如果硬盤空間夠的話,選上也可以。下一步就是正式開始安裝了,系統會問從什麼地方安裝(我們這裡是CDROM)、CDROM設備名、文件系統種類以及安裝文件位置,全部用缺省值。接著系統列出全部安裝包,可以輸入一個“*”全部選上,再輸入一個“done”開始安裝。安裝完畢後系統問“Extract more sets?”,直接回車跳過。下一步是設置時區,中國是在Asia下面,選擇你所在的城市。最後系統會建立啟動信息等等,直到看到“CONGRATULATIONS! You have successfully installed OpenBSD! ”說明安裝已經成功,系統返回命令提示符下,輸入“reboot”並回車,重新啟動系統。

配置網絡
重新啟動後,用root用戶和剛才設置的口令進入系統,鍵入“ifconfig -a”查看所有網絡接口,我們會看到有諸如“ne3: …… media: Ethernet ……”這樣的顯示,針對不同的網卡OpenBSD會有不同的接口名,這裡假設用的的是NE2000兼容網卡,命名為“ne”,後面的數字表示它插在第幾號PCI槽(從AGP槽的那面開始數)。現在假設我們的兩塊網卡分別插在3號、4號PCI槽裡,則它們的接口名分別是ne3、ne4。現在我們打算把ne4接到CM上,把ne3接到內部LAN的HUB上。
由於CM是通過DHCP來獲得IP地址的,我們先把ne4設置成通過DHCP獲得IP地址:
# echo dhcp > /etc/hostname.ne4
OpenBSD啟動的時候發現hostname.ne4中的內容是“dhcp”,就會啟動dhcp client去請求IP地址、子網掩碼、網關地址、DNS地址等設置。可以手工調整dhcp client的配置,但是這裡沒有必要了。
然後我們設置連接內部LAN的ne3的網絡設置(假設內部網絡使用的是保留的IP地址192.168.0.x,子網掩碼是255.255.255.0):
# echo "inet 192.168.0.1 255.255.255.0 NONE" > /etc/hostname.ne3
將ne3的IP地址設置為192.168.0.1,最後的那個NONE表示不指定網卡的media option。
為了在NAT機上可以正確進行DNS解析,我們還需要配置一下/etc/resolv.conf文件,舉例來說:
# cat /etc/resolv.conf
nameserver 210.52.149.2
nameserver 202.96.209.133
lookup file bind
第一、二行列出了兩個不同的DNS服務器的IP,第三行表示先從/etc/hosts文件中查找,如果失敗再到DNS服務器查找。
NAT大概的運作方式是這樣的:假設內部網絡上的計算機A需要訪問Internet,則A把數據包發送到網關機N,N收到A的數據包後,把請求者的IP地址換成自己,然後發送到目的地去。收到目的地發來的回答後,N再把它轉發到A機。NAT是在低層次起作用的,與在高層次起作用的代理比如應用層代理(常見的有HTTP proxy等)相比,對於A機來說,它不用將自己的應用程序設置成使用代理(有的應用程序並不支持代理),除了無法從外部直接連接到A機之外,所有的使用都和直接連接Internet一樣。
下面我們來配置NAT:
修改 /etc/rc.conf
ipfilter=YES
ipnat=YES
修改 /etc/sysctl.conf
net.inet.ip.forwarding=1
再修改配置防火牆規則,現在我們先不設置任何復雜規則,僅僅允許所有的信息通過:
# cat /etc/ipf.rules
pass in from any to any
pass out from any to any
然後是NAT規則:
# cat /etc/ipnat.rules
map ne4 192.168.0.0/24 -> ne4/32 portmap tcp/udp 10000:60000
map ne4 192.168.0.0/24 -> ne4/32
這些規則表示將內部網的IP地址192.168.0.x 、子網掩碼為255.255.255.0,映射到ne4網絡接口上去。第一行是映射TCP和UDP的,第二行是映射其他協議的。

現在所有的配置都完成了,把CM和ne4連接好,並把內部LAN的HUB連接到ne3上,鍵入reboot重啟動。將內部LAN上的計算機的網卡接口的IP設置成 192.168.0.2,192.168.0.3……,子網掩碼為255.255.255.0,網關為192.168.0.1,DNS服務器為ISP提供的DNS服務器的IP(比如210.52.149.2,202.96.209.133),根據需要可能需要重啟動。試試看是不是已經可以上Internet了?

進一步的配置
下面介紹一下在我們剛才構築的基於OpenBSD的NAT網關機的基礎上,進一步設置一些網絡服務的方法。值得注意的是:從安全性考慮,不是必要的服務就不要開!

1. 遠程登錄
OpenBSD缺省安裝後,啟動的服務很少。telnet服務是缺省關閉的,因為telnet是明文的協議,有被竊聽的危險。OpenBSD打開了ssh服務,這是一個加密的遠程登錄服務。為了使用這個服務,必須在客戶機上安裝支持ssh協議的終端軟件。在Windows操作系統下,可以用SecureCRT。安裝完終端軟件後,建立到服務器192.168.0.1的連接,注意使用standard SSH。

2. 串口終端
對於這個NAT服務器來說,我們可以不要顯卡、顯示器和鍵盤。但是如果配置網絡出了問題,遠程登錄無法連接到服務器就比較麻煩了--因為我們已經把服務器的顯示系統和鍵盤都去掉了。所以有必要建立一個比較保險的連接途徑。我們可以通過串口終端的方式,連接到服務器。
a) echo -P > /boot.config 這個目的是告訴boot模塊,如果發現鍵盤不存在,就進入serial console模式;
b) 修改 /etc/ttys,將tty00的status改為on,後面可以加上secure(允許root從serial console登錄)--這裡假設你用的是COM1口;如果你沒有那種標准的null modem線,而只有那種RX、TX、地三根線的串口電纜,就再加上一個 softcar;
c) 在COM1上接終端,或者接到另一台電腦,比如運行Windows的PC,隨便安裝一個支持串口終端方式的軟件,比如Hypertermial、Netterm、SecureCRT,新建立一個session,用串口協議,速率9600,data 8, parity none, stopbit 1,flow control XON/XOFF(假設用的是softcar);
d) 重啟OpenBSD的機器,不要忘記拔掉鍵盤!
如果覺得9600bps的速率太慢,可以在 /etc/ttys中設置,並且將終端或者終端仿真軟件的速率設置成相同的就可以了。舉個例子:
tty00 "/usr/libexec/getty std.57600" vt100 on secure softcar

3. WEB服務
將/etc/rc.conf中,找到httpd_flags=NO,將NO去掉,下次啟動的時候WEB服務就打開了。WEB服務的缺省根目錄是/var/www,配置文件是/var/www/conf/httpd.conf。

4. 匿名FTP服務
首先要增加一個用戶名ftp,但是為了安全原因,這個用戶不允許登陸,僅僅作為匿名FTP使用:
a) echo /usr/bin/false >> /etc/shells
這是允許/usr/bin/false作為用戶的shell
b) 添加一個用戶ftp,屬於ftp組,HOME為/home/ftp,注意將該用戶的shell設置為/usr/bin/false,這樣ftp用戶就不能登陸到系統了。
再建立一些目錄:
c) mkdir /home/ftp/pub
chmod 555 /home/ftp/pub
這個目錄對所有人都是只讀的,提供下載。
d) mkdir /home/ftp/incoming
chmod 777 /home/ftp/incoming
這個目錄對所有人都是可寫的2,提供上傳和下載。
然後是設置ftpd的啟動:
e) 編輯/etc/rc.conf,找到ftpd_flags,修改為ftpd_flags="-DllUSA"。
這些參數將使得ftpd作為守護進程啟動,只允許匿名FTP,並且會將詳細的連接、使用情況記錄到/var/log/ftpd和/var/log/xferlog中。
最後,還有一些信息文件可以修改:
f) /etc/ftpwelcome
當用戶使用ftp客戶端軟件連接到服務器後,顯示的歡迎信息。
g) .message
/home/ftp下面的任何目錄裡都可以有這個文件,用戶進入這個目錄後就會顯示這個文件的內容。

5. 動態域名解析
一般寬帶接入商不一定提供固定IP給用戶,每次開機動態分配的IP都有可能不同。為了方便外界連接,最好有一個動態的域名解析。Internet上提供免費域名解析的服務商很多,這裡我們以hammernode為例介紹一下如何配置動態域名解析。
首先是申請一個免費的域名。訪問hammernode的主頁http://www.hn.org,點擊Create an Account申請一個帳號。具體過程並不復雜,這裡從略。假設申請到的用戶名是someuser,那麼我們就有了一個someuser.hn.org的域名。
然後我們要設置OpenBSD在啟動獲得DHCP分配的IP地址後,自動去更新someuser.hn.org對應的IP地址,我們可以在/etc/rc.local的末尾運行一個程序來完成這個更新。
# Register someuser.hn.org with IP address of ne4 interface
if [ -x /usr/local/sbin/hn-register.pl ]; then
/usr/local/sbin/hn-register.pl &
fi
在服務器關機的時候,有必要將someuser.hn.org動態域名關閉,不知情的使用者連接到別的主機上去,修改/etc/rc.shutdown,在末尾加上:
# Turn off someuser.hn.org IP address
if [ -x /usr/local/sbin/hn-turnoff.pl ]; then
/usr/local/sbin/hn-turnoff.pl
fi
上面的hn-register.pl和hn-turnoff.pl是根據
http://www.technopagan.org/software/hammernode.pl
改寫的,這是一段用perl寫的簡單程序(必須先安裝perl的package)。 hn-register.pl是連接到服務器,提供用戶名和密碼後,服務器會根據探測到的IP地址,自動進行注冊,5分鐘之內會生效。Hn-turnoff.pl是將IP地址注冊為指定的0.0.0.0。

6. 電子郵件服務sendmail
一般來說sendmail服務需要一個固定的IP,但是由於服務器一般是常開的,所以我們還是可以運行sendmail服務的。這裡有一個難點,就是一般免費的動態域名注冊服務都是進行域名->IP的正向解析,而IP->域名的反向解析不能實現。但是sendmail服務啟動的過程中卻會使用gethostbyaddr取得域名,才能正常使用。為此我們必須做一點手腳:
a) 再次訪問hammernode的主頁,點擊Modify your Account,輸入someuser和用戶名,在Primary MX前面打鉤。
b) 檢查/etc/rc.conf中,sendmail_flag=NO。因為我們不能在ne4通過DHCP得到IP之前啟動sendmail。
c) 將原先的/etc/hosts保存到另一個文件中
cp /etc/hosts /etc/hosts.fixed
d) 在/etc/rc.local的末尾添加這些內容:
# Set hosts
if [ -e /etc/hosts.fixed ]; then
cp /etc/hosts.fixed /etc/hosts
/sbin/ifconfig ne4|grep "inet "|awk '{print($2," someuser someuser.hn.org");}' >> /etc/hosts
fi
# Start sendmail
/usr/sbin/sendmail -bd -q15m
第一部分是將ne4的IP和域名加hosts中。前文說到,在resolv.conf裡我們有
lookup file bind
這一句,所以系統會先到hosts文件去進行域名解析。這樣,gethostbyaddr就能夠成功了。
e) 在/etc/rc.shutdown的末尾添加這些內容:
# Set hosts back
if [ -e /etc/hosts.fixed ]; then
cp /etc/hosts.fixed /etc/hosts
fi
這樣做是在關機前恢復原來的hosts文件,這一步不是必需的。
f) 在/etc/mail/sendmail.cf中找到這樣一行:
#Dj$w.Foo.COM
在這行的後面加一行:
Djsomeuser.hn.org
這樣設置以後,下一次重啟的時候,sendmail就可以工作了。從其他地方發一封email到[email protected],過一段時間看看,是不是root用戶收到了一封信?

7. IP防火牆
在這台網關機上,我們可以設置基於IP過濾的防火牆,規則配置文件是/etc/ipf.rules。比如我們如果修改一下這個文件:
# cat /etc/ipf.rules
pass in quick on ne4 proto icmp from any to any icmp-type echorep
block in quick on ne4 proto icmp from any to any icmp-type redir
block in quick on ne4 proto icmp from any to any
block in quick on ne4 proto icmp from any to any icmp-type echo
pass in from any to any
pass out from any to any
第一行是允許內部LAN上的機器ping外部的IP得到的應答進入,第二到第四行是禁止其它的ICMP包進入,這樣Internet上的機器就無法ping通OpenBSD機的IP地址了。最後的兩行是允許其它的信息包進出。
上面的規則只是舉例說明防火牆的設置,它並不是一個很嚴格的規則,對這方面有興趣的朋友可以參考http://www.obfuscation.org/ipf/,那裡有詳細的IP過濾的資料。


基於OpenBSD的寬帶上網共享和網絡服務就介紹這些,OpenBSD的官方網站是www.openbsd.org,配置、使用中有什麼問題可以去那裡尋找答案,也歡迎探討:[email protected],請不要發廣告郵件給我!

注:
1 NAT與應用程序代理工作在TCP/IP的不同層次上,前者的好處是對應用程序基本透明,後者的好處是能夠進行基於內容的過濾,但是需要應用程序支持代理並進行正確的設置,並且系統開銷比較大,對服務器的配置要求比較高。
2 OpenBSD 2.8的發行版中,ftpd有一個漏洞,如果匿名FTP提供可寫的目錄,必須打一個補丁,否則有被黑掉的可能性。

Copyright © Linux教程網 All Rights Reserved