進階網路環境介紹

要架設一台伺服器,必定需要對網路環境有大致上的了解,我們今天針對一般商業市場上用途最廣的TCP/IP的架構於FreeBSD做介紹,當然FreeBSD也支援如IPX等協定,但留待日後有機會的時候在介紹。

1. 何謂“服務”

TCP/IP主要是通過IP的方式,連結到遠端的主機,但是一台主機可能提供E-mail伺服器、檔案伺服器、名稱伺服器等不計其數的服務,我們要如何判別我們使用的是什麼樣的服務呢?

其實個網路資料都還會帶有一個訊息,也就是標準的“服務”使用port,如E-mail使用的是SMTP、 POP3等協定,請先回想一下,我們在先前曾介紹過“/etc”這個目錄,這個目錄主要的功能就是放置各種設定檔,我們先看看“/etc/services”這個檔案:

# Network services, Internet style
..中略..
ftp-data 20/tcp #File Transfer [Default Data]
ftp-data 20/udp #File Transfer [Default Data]
ftp 21/tcp #File Transfer [Control]
ftp 21/udp #File Transfer [Control]
ssh 22/tcp #Secure Shell Login
ssh 22/udp #Secure Shell Login
telnet 23/tcp
telnet 23/udp
# 24/tcp any private mail system
# 24/udp any private mail system
smtp 25/tcp mail #Simple Mail Transfer
smtp 25/udp mail #Simple Mail Transfer

我們可以由中看到,第一個欄位指的是服務名稱,第二個就是使用的port及其型式,最後一欄就是基本的解說。

由上表我們可以看出來,smtp就是郵件伺服器所使用的port,他使用了25 port,而又分別擁有TCP與UDP的傳輸模式,TCP又稱之為“傳輸資料協定”,UDP又稱之為“使用者資料段協定”,這二個模式的差異主要是TCP提供可靠的資料傳輸服務,並且具有資料傳遞時的錯誤偵測與更正功能,UDP則直接傳輸資料,可以使得應用程式在最小的資源下完成工作,摘自歐萊禮“TCP/IP 網路管理”一書中即有提到,“UDP是一個不可靠、非連線性的資料段協定”,其意思指的是協定並不會做驗證的動作,也不確定資料是否正確,對這個部份有興趣的人,可以在去查這部份的資料,由於本文並不是專為TCP/IP協定所撰寫的,所以在此省略。

由上面的資訊,我們可以為“服務”下一個定義,就是“在以經標準化的通訊協定中,負責轉接各種應用的端口”,IP負責將資料傳輸到需要到達的地方,而交由port去將資料送至正確的服務程式之中。

2. 如何使用服務?

每一個以經被標準化的服務,都會有一個固定的port,一般而言,只要我們啟動了該服務,那麼所指定的服務port就會開始運行,接下來我們來看看/etc/inetd.conf 這個檔案:

# $FreeBSD: src/etc/inetd.conf,v 1.44.2.6 2001/10/09 07:47:47 jkh Exp $
#
# Internet server configuration database
#
# Define *both* IPv4 and IPv6 entries for dual-stack support.
# To disable a service, comment it out by prefixing the line with '#'.
# To enable a service, remove the '#' at the beginning of the line.
#
#ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
#ftp stream tcp6 nowait root /usr/libexec/ftpd ftpd -l
#telnet stream tcp nowait root /usr/libexec/telnetd telnetd
#telnet stream tcp6 nowait root /usr/libexec/telnetd telnetd
#shell stream tcp nowait root /usr/libexec/rshd rshd
#shell stream tcp6 nowait root /usr/libexec/rshd rshd
#login stream tcp nowait root /usr/libexec/rlogind rlogind
#login stream tcp6 nowait root /usr/libexec/rlogind rlogind
#finger stream tcp nowait/3/10 nobody /usr/libexec/fingerd fingerd -s
#finger stream tcp6 nowait/3/10 nobody /usr/libexec/fingerd fingerd -s
#exec stream tcp nowait root /usr/libexec/rexecd rexecd
#uucpd stream tcp nowait root /usr/libexec/uucpd uucpd
#nntp stream tcp nowait usenet /usr/libexec/nntpd nntpd

這裡我們能看到,在這個檔案裡面提供了大量的資訊,其實不要被這些資訊把你的腦子給搞迷糊了,他重要的就只有六個部份:

  1. 服務名稱:如 ftp、telnet。
  2. 使用的傳輸方式:stream tcp、stream tcp6。
  3. 用什麼方式執行?:如 nowait。
  4. 用什麼身份執行?:如root。
  5. 程式在那裡?:如/usr/libexec/ftpd
  6. 用什麼方式執行?要加參數嗎?:ftpd -l

這樣子看起來,是不是就簡單多了?

從上面的範例表來看,有沒有發現大部份的行數前面都標示了#號呢?

#一般而言指的是忽略這一整行的設定,從這裡會發現,為什麼大部份的協定前面都以經加了個#號呢?

因為從安全的角度而言,開放了愈多的服務,就表示系統的漏洞愈多,而且現在的軟體都傾向獨立的傾聽port的要求,因此大部份在這個檔案裡要求的都是不啟動的,我們先來試試看,當我們修改了這個檔案,重新啟動inetd的服務後,就可以利用ftp的服務對外提供檔案傳輸的服務了。

但在這裡我們為了安全問題,並不鼓勵大家使用內定的wu-ftp,往後的章節會介紹大家如何架設各種伺服器。


說完一般較會接觸到並且也較為傳統的服務監聽inetd(念 i net d)服務後,我們開始來介紹其它的網路設定,我們一樣把焦點放到/etc下的這個目錄:

在使用TCP/IP時,我們需要還是需要設定如NameServer,這在TCP/IP可以說是關鍵技術,將給電腦認的IP轉化為我們一般人能看的懂的名稱“DomainName”,我們需要在“resolv.conf”做設定:

domain  brain-c.com
nameserver 168.95.1.1

domain:自己電腦的名稱,筆者的domain是brain-c.com。
nameserver:我們使用的NS,在未架設DNS前,我們指向Hinet的名稱伺服器。

這個設定後,在系統需要查詢 DN時,就會到168.95.1.1去詢找,但是大家可能會覺得,每次我要連到外面,都還要記如“www.brain-c.com”這麼長的DN ,不是很麻煩嗎?

其實我們可以在另一個檔案事先設定DN所需要指向的位置,設定的檔案就是“/etc/hosts”:

# $FreeBSD: src/etc/hosts,v 1.11.2.2 2001/10/08 09:32:08 ru Exp $
#
# Host Database
# This file should contain the addresses and aliases
# for local hosts that share this file.
# In the presence of the domain name service or NIS, this file may
# not be consulted at all; see /etc/host.conf for the resolution order.
#
#
::1 localhost localhost.my.domain
127.0.0.1 localhost localhost.my.domain
..下略..

從這個檔案可以發現,有一個叫localhost的DN被分配的IP是127.0.0.1,我們一樣利用ping這個指令來試試看:

bbs# ping localhost
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.126 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.110 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.088 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.089 ms
^C
--- localhost ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.088/0.103/0.126/0.016 ms

如果今天把localhost拿掉的話:


bbs# ping localhost
ping: cannot resolve localhost: Unknown host
bbs#

看吧,這樣子就ping不到了!

我們在加一行“168.95.1.1 DN”到hosts後在試著ping看看:


bbs# ping DN
PING DN (168.95.1.1): 56 data bytes
64 bytes from 168.95.1.1: icmp_seq=0 ttl=246 time=58.732 ms
64 bytes from 168.95.1.1: icmp_seq=1 ttl=246 time=59.287 ms
64 bytes from 168.95.1.1: icmp_seq=2 ttl=246 time=58.881 ms
^C
--- DN ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 58.732/58.967/59.287/0.235 ms
bbs#

看到了嗎?就是這麼簡單的事,因此我們可以在這裡紀錄許多我們平常常用的DN,這樣子只要在這裡紀錄我們常用的簡單的名稱,就可以讓系統對映到該IP囉!


用過這些東西之後,我們來玩玩看對網際網路的連線,還記得在“基本網路環境裡”中“Network Configure”中曾經設定過“IPv4 Gateway”嗎?

Gateway中文翻起來叫“匣道器”,不過我們還是建議在與人討論時講Gateway,因為許多術語一翻釋到中文,常常會失去原本的意思,而Gateway指的是當我們要連結到外面的網路時,要走那一條路?

上圖就是一個簡略的Gateway示意圖,本地端在做連線時,並不會使用到Gateway,但是當你要用的網域並不在本地端時,就需要利用Gateway到該到的地方,我們利用一個指令來認識一下我們機器上的Gateway:

> netstat -r
Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            211.74.198.174     UGSc     4714    15492   fxp0
localhost          localhost          UH       1591    90308    lo0
211.74.198.168/29  link#1             UC          7        0   fxp0
PC1                00:02:b3:9e:1a:5a  UHLW        3     2466   fxp0    925
bbs                00:50:bf:34:01:6d  UHLW        1    11005   fxp0     52
brain-c.com        00:02:b3:46:8c:ae  UHLW       81    30156    lo0
PC2                link#1             UHLW        1    69064   fxp0
PC3                00:50:ba:7b:36:2d  UHLW        1   563799   fxp0   1143
211.74.198.174     00:03:c9:20:45:6f  UHLW       20        0   fxp0   1183
211.74.198.175     ff:ff:ff:ff:ff:ff  UHLWb       1     7503   fxp0


netstat 是一個在觀查一般網路一般路由資訊的指令,我們可以看到一個上面黃色標示出來的資訊是一個“default”,也就是如果不是私有網路的部份,當我們要使用時要往那裡去找呢?

我們在用另一個指令來看看,如果今天我們想要到“www.study-area.org”時,會經過那些Gateway呢?

> traceroute www.study-area.org
traceroute to study-area.ks.edu.tw (163.16.1.199), 64 hops max, 40 byte packets
 1  211.74.198.174 (211.74.198.174)  1.029 ms  0.943 ms  1.342 ms
 2  172.30.9.165 (172.30.9.165)  42.851 ms  42.931 ms  41.524 ms
 3  139.175.169.2 (139.175.169.2)  40.218 ms  39.590 ms  39.818 ms
 4  * * *
 5  R56-146.seed.net.tw (139.175.56.146)  43.149 ms  41.980 ms  43.264 ms
 6  163.18.251.254 (163.18.251.254)  43.456 ms  44.771 ms  42.270 ms
 7  192.83.196.92 (192.83.196.92)  44.168 ms  42.365 ms  42.004 ms
 8  163.16.2.1 (163.16.2.1)  43.740 ms  45.240 ms  45.193 ms
 9  163.16.1.199 (163.16.1.199)  45.919 ms  43.095 ms  43.775 ms
>

這是一個基本的追縱網路情況指令,我們使用DN來做追縱的基礎,機器先向DNS詢問www.study-area.org正確的IP(163.16.1.199),接著開始將所有經過的Gateway利用ICMP的訊號了解要多少的時間(xx.xxx ms),總共經過了幾個Gateway。

所以從上面來看,我們就可以知道,我們從211.74.198.174到163.16.1.199這台機器,需要幾個Gateway才能到達目地呢?

幸運的是,這個路由會自動的做更新,一般而言我們並不需要太擔心這個部份,但是大家一定要清楚這個工作的目得“網路問題排除”,比如,當你連不上公司的server,你就需要這個指令,確定是其中的路由掛掉呢?抑或是你自己的網路出了問題?甚至是一開始自己的路由表設定錯誤。

我們來說個實例,我們現在分別向Seednet跟台灣固網牽了條ADSL以備不時之需,偏偏因為Hinet的線路Seednet的網路被中斷了,這個時候我們就可以利用這個方式了解由於線路的關系我們無法向外面實行通聯,此時我們就可以利用route變更預定的路由改為以台灣固網路線路出去,這樣子是不是就安穩多了呢?