## 5.2 網絡偵錯與觀察指令
在網絡的互助論壇中,最常聽到的一句話就是:『高手求救!我的 Linux 不能連上網絡了!』我的天吶!不能上網絡的原因多的很!而要完全搞懂也不是一件簡單的事情呢! 不過,事實上我們可以自己使用測試軟件來追蹤可能的錯誤原因,而很多的網絡偵測指令其實在 Linux 里頭已經都預設存在了,只要你好好的學一學基本的偵測指令,那么一些朋友在告訴你如何偵錯的時候, 你應該就立刻可以知道如何來搞定他啰!
其實我們在[第四章談到的五個檢查步驟](http://linux.vbird.org/linux_server/0130internet_connect.php#connect_fix_IP)已經是相當詳細的網絡偵錯流程了! 只是還有些重要的偵測指令也得要來了解一下才好!
* * *
### 5.2.1 兩部主機兩點溝通: ping
這個 ping 是很重要的指令,ping 主要透過 [ICMP 封包](http://linux.vbird.org/linux_server/0110network_basic.php#tcpip_network_icmp) 來進行整個網絡的狀況報告,當然啦,最重要的就是那個 ICMP type 0, 8 這兩個類型, 分別是要求回報與主動回報網絡狀態是否存在的特性。要特別注意的是, ping 還是需要透過 [IP 封包](http://linux.vbird.org/linux_server/0110network_basic.php#tcpip_network_head)來傳送 ICMP 封包的, 而 IP 封包里面有個相當重要的 TTL 屬性,這是很重要的一個路由特性, 詳細的 IP 與 ICMP 表頭資料請參考[第二章網絡基礎](http://linux.vbird.org/linux_server/0110network_basic.php)的詳細介紹。
```
[root@www ~]# ping [選項與參數] IP
選項與參數:
-c 數值:后面接的是執行 ping 的次數,例如 -c 5 ;
-n :在輸出數據時不進行 IP 與主機名的反查,直接使用 IP 輸出(速度較快);
-s 數值:發送出去的 ICMP 封包大小,預設為 56bytes,不過你可以放大此一數值;
-t 數值:TTL 的數值,預設是 255,每經過一個節點就會少一;
-W 數值:等待響應對方主機的秒數。
-M [do|dont] :主要在偵測網絡的 MTU 數值大小,兩個常見的項目是:
do :代表傳送一個 DF (Don't Fragment) 旗標,讓封包不能重新拆包與打包;
dont:代表不要傳送 DF 旗標,表示封包可以在其他主機上拆包與打包
# 范例一:偵測一下 168.95.1.1 這部 DNS 主機是否存在?
[root@www ~]# ping -c 3 168.95.1.1
PING 168.95.1.1 (168.95.1.1) 56(84) bytes of data.
64 bytes from 168.95.1.1: icmp_seq=1 ttl=245 time=15.4 ms
64 bytes from 168.95.1.1: icmp_seq=2 ttl=245 time=10.0 ms
64 bytes from 168.95.1.1: icmp_seq=3 ttl=245 time=10.2 ms
--- 168.95.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2047ms
rtt min/avg/max/mdev = 10.056/11.910/15.453/2.506 ms
```
ping 最簡單的功能就是傳送 ICMP 封包去要求對方主機回應是否存在于網絡環境中,上面的響應消息當中,幾個重要的項目是這樣的:
* 64 bytes:表示這次傳送的 ICMP 封包大小為 64 bytes 這么大,這是默認值, 在某些特殊場合中,例如要搜索整個網絡內最大的 MTU 時,可以使用 -s 2000 之類的數值來取代;
* icmp_seq=1:ICMP 所偵測進行的次數,第一次編號為 1 ;
* ttl=243:TTL 與 IP 封包內的 TTL 是相同的,每經過一個帶有 MAC 的節點 (node) 時,例如 router, bridge 時, TTL 就會減少一,預設的 TTL 為 255 , 你可以透過 -t 150 之類的方法來重新設定預設 TTL 數值;
* time=15.4 ms:響應時間,單位有 ms(0.001秒)及 us(0.000001秒), 一般來說,越小的響應時間,表示兩部主機之間的網絡聯機越良好!
如果你忘記加上 -c 3 這樣的規定偵測次數,那就得要使用 [ctrl]-c 將他結束掉了!
例題:寫一支腳本程序 ping.sh ,透過這支腳本程序,你可以用 ping 偵測整個網域的主機是否有響應。此外,每部主機的偵測僅等待一秒鐘,也僅偵測一次。答:由于僅偵測一次且等待一秒,因此 ping 的選項為: -W1 -c1 ,而位于本機所在的區網為 192.168.1.0/24 ,所以可以這樣寫 (vim /root/bin/ping.sh):
```
#!/bin/bash
for siteip in $(seq 1 254)
do
site="192.168.1.${siteip}"
ping -c1 -W1 ${site} &> /dev/null
if [ "$?" == "0" ]; then
echo "$site is UP"
else
echo "$site is DOWN"
fi
done
```
特別注意一下,如果你的主機與待偵測主機并不在同一個網域內, 那么 TTL 預設使用 255 ,如果是同一個網域內,那么 TTL 預設則使用 64 喔!
* 用 ping 追蹤路徑中的最大 MTU 數值
我們由第二章的[網絡基礎](http://linux.vbird.org/linux_server/0110network_basic.php)里面談到加大訊框 (frame) 時, 對于網絡效能是有幫助的,因為封包打包的次數會減少,加上如果整個傳輸的媒體都能夠接受這個 frame 而不需要重新進行封包的拆解與重組的話,那么效能當然會更好,那個修改 frame 大小的參數就是 [MTU](http://linux.vbird.org/linux_server/0110network_basic.php#tcpip_link_mtu) 啦!
好了,現在我們知道網絡卡的 MTU 修改可以透過 [ifconfig](#ifconfig) 或者是 [ip](#ip_cmd) 等指令來達成,那么追蹤整個網絡傳輸的最大 MTU 時,又該如何查詢?呵呵!最簡單的方法當然是透過 ping 傳送一個大封包, 并且不許中繼的路由器或 switch 將該封包重組,那就能夠處理啦!沒錯!可以這樣的:
```
# 范例二:找出最大的 MTU 數值
[root@www ~]# ping -c 2 -s 1000 -M do 192.168.1.254
PING 192.168.1.254 (192.168.1.254) 1000(1028) bytes of data.
1008 bytes from 192.168.1.254: icmp_seq=1 ttl=64 time=0.311 ms
# 如果有響應,那就是可以接受這個封包,如果無響應,那就表示這個 MTU 太大了。
[root@www ~]# ping -c 2 -s 8000 -M do 192.168.1.254
PING 192.168.1.254 (192.168.1.254) 8000(8028) bytes of data.
From 192.168.1.100 icmp_seq=1 Frag needed and DF set (mtu = 1500)
# 這個錯誤訊息是說,本地端的 MTU 才到 1500 而已,你要偵測 8000 的 MTU
# 根本就是無法達成的!那要如何是好?用前一小節介紹的 ip link 來進行 MTU 設定吧!
```
不過,你需要知道的是,由于 [IP 封包表頭 (不含 options) 就已經占用了 20 bytes](http://linux.vbird.org/linux_server/0110network_basic.php#tcpip_network_head) ,再加上 ICMP 的表頭有 8 bytes ,所以當然你在使用 -s size 的時候,那個封包的大小就得要先扣除 (20+8=28) 的大小了。 因此如果要使用 MTU 為 1500 時,就得要下達『 ping -s 1472 -M do xx.yy.zz.ip 』才行啊!
另外,由于本地端的網絡卡 MTU 也會影響到偵測,所以如果想要偵測整個傳輸媒體的 MTU 數值, 那么每個可以調整的主機就得要先使用 ifcofig 或 ip 先將 MTU 調大,然后再去進行偵測, 否則就會出現像上面提供的案例一樣,可能會出現錯誤訊息的!
不過這個 MTU 不要隨便調整啊!除非真的有問題。通常調整 MTU 的時間是在這個時候:
* 因為全部的主機群都是在內部的區網,例如叢集架構 (cluster) 的環境下, 由于內部的網絡節點都是我們可以控制的,因此可以透過修改 MTU 來增進網絡效能;
* 因為操作系統默認的 MTU 與你的網域不符,導致某些網站可以順利聯機,某些網站則無法聯機。 以 Windows 操作系統作為聯機分享的主機時,在 Client 端挺容易發生這個問題;
如果是要連上 Internet 的主機,注意不要隨便調整 MTU ,因為我們無法知道 Internet 上面的每部機器能夠支持的 MTU 到多大,因為......不是我們能夠管的到的嘛 ^_^! 另外,其實每種聯機方式都有不同的 MTU 值,常見的各種接口的 MTU 值分別為︰
```
| 網絡接口 | MTU |
| --- | --- |
| Ethernet | 1500 |
| PPPoE | 1492 |
| Dial-up(Modem) | 576 |
```
* * *
### 5.2.2 兩主機間各節點分析: traceroute
我們前面談到的指令大多數都是針對主機的網絡參數設定所需要的,而 ping 是兩部主機之間的回聲與否判斷, 那么有沒有指令可以追蹤兩部主機之間通過的各個節點 (node) 通訊狀況的好壞呢?舉例來說,如果我們聯機到 yahoo 的速度比平常慢,你覺得是 (1)自己的網絡環境有問題? (2)還是外部的 Internet 有問題?如果是 (1) 的話,我們當然需要檢查自己的網絡環境啊,看看是否又有誰中毒了?但如果是 Internet 的問題呢?那只有『等等等』啊! 判斷是 (1) 還是 (2) 就得要使用 traceroute 這個指令啦!
```
[root@www ~]# traceroute [選項與參數] IP
選項與參數:
-n :可以不必進行主機的名稱解析,單純用 IP ,速度較快!
-U :使用 UDP 的 port 33434 來進行偵測,這是預設的偵測協議;
-I :使用 ICMP 的方式來進行偵測;
-T :使用 TCP 來進行偵測,一般使用 port 80 測試
-w :若對方主機在幾秒鐘內沒有回聲就宣告不治...預設是 5 秒
-p 埠號:若不想使用 UDP 與 TCP 的預設埠號來偵測,可在此改變埠號。
-i 裝置:用在比較復雜的環境,如果你的網絡接口很多很復雜時,才會用到這個參數;
舉例來說,你有兩條 ADSL 可以連接到外部,那你的主機會有兩個 ppp,
你可以使用 -i 來選擇是 ppp0 還是 ppp1 啦!
-g 路由:與 -i 的參數相仿,只是 -g 后面接的是 gateway 的 IP 就是了。
# 范例一:偵測本機到 yahoo 去的各節點聯機狀態
[root@www ~]# traceroute -n tw.yahoo.com
traceroute to tw.yahoo.com (119.160.246.241), 30 hops max, 40 byte packets
1 192.168.1.254 0.279 ms 0.156 ms 0.169 ms
2 172.20.168.254 0.430 ms 0.513 ms 0.409 ms
3 10.40.1.1 0.996 ms 0.890 ms 1.042 ms
4 203.72.191.85 0.942 ms 0.969 ms 0.951 ms
5 211.20.206.58 1.360 ms 1.379 ms 1.355 ms
6 203.75.72.90 1.123 ms 0.988 ms 1.086 ms
7 220.128.24.22 11.238 ms 11.179 ms 11.128 ms
8 220.128.1.82 12.456 ms 12.327 ms 12.221 ms
9 220.128.3.149 8.062 ms 8.058 ms 7.990 ms
10 * * *
11 119.160.240.1 10.688 ms 10.590 ms 119.160.240.3 10.047 ms
12 * * * <==可能有防火墻裝置等情況發生所致
```
這個 traceroute 挺有意思的,這個指令會針對欲連接的目的地之所有 node 進行 UDP 的逾時等待, 例如上面的例子當中,由鳥哥的主機連接到 Yahoo 時,他會經過 12 個節點以上,traceroute 會主動的對這 12 個節點做 UDP 的回聲等待,并偵測回復的時間,每節點偵測三次,最終回傳像上頭顯示的結果。 你可以發現每個節點其實回復的時間大約在 50 ms 以內,算是還可以的 Internet 環境了。
比較特殊的算是第 10/12 個,會回傳星號的,代表該 node 可能設有某些防護措施,讓我們發送的封包信息被丟棄所致。 因為我們是直接透過路由器轉遞封包,并沒有進入路由器去取得路由器的使用資源,所以某些路由器僅支持封包轉遞, 并不會接受來自客戶端的各項偵測啦!此時就會出現上述的問題。因為 traceroute 預設使用 UDP 封包,如果你想嘗試使用其他封包, 那么 -I 或 -T 可以試看看啰!
由于目前 UDP/ICMP 的攻擊層出不窮,因此很多路由器可能就此取消這兩個封包的響應功能。所以我們可以使用 TCP 來偵測呦! 例如使用同樣的方法,透過等待時間 1 秒,以及 TCP 80 埠口的情況下,可以這樣做:
```
[root@www ~]# traceroute -w 1 -n -T tw.yahoo.com
```
* * *
### 5.2.3 察看本機的網絡聯機與后門: netstat
如果你覺得你的某個網絡服務明明就啟動了,但是就是無法造成聯機的話,那么應該怎么辦? 首先你應該要查詢一下自己的網絡接口所監聽的端口 (port) 來看看是否真的有啟動,因為有時候屏幕上面顯示的 [OK] 并不一定是 OK 啊! ^_^
```
[root@www ~]# netstat -[rn] <==與路由有關的參數
[root@www ~]# netstat -[antulpc] <==與網絡接口有關的參數
選項與參數:
與路由 (route) 有關的參數說明:
-r :列出路由表(route table),功能如同 route 這個指令;
-n :不使用主機名與服務名稱,使用 IP 與 port number ,如同 route -n
與網絡接口有關的參數:
-a :列出所有的聯機狀態,包括 tcp/udp/unix socket 等;
-t :僅列出 TCP 封包的聯機;
-u :僅列出 UDP 封包的聯機;
-l :僅列出有在 Listen (監聽) 的服務之網絡狀態;
-p :列出 PID 與 Program 的檔名;
-c :可以設定幾秒鐘后自動更新一次,例如 -c 5 每五秒更新一次網絡狀態的顯示;
# 范例一:列出目前的路由表狀態,且以 IP 及 port number 顯示:
[root@www ~]# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth0
# 其實這個參數就跟 route -n 一模一樣,對吧!這不是 netstat 的主要功能啦!
# 范例二:列出目前的所有網絡聯機狀態,使用 IP 與 port number
[root@www ~]# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
....(中間省略)....
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 52 192.168.1.100:22 192.168.1.101:1937 ESTABLISHED
tcp 0 0 :::22 :::* LISTEN
....(中間省略)....
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 11075 @/var/run/hald/dbus-uukdg1qMPh
unix 2 [ ACC ] STREAM LISTENING 10952 /var/run/dbus/system_bus_socket
unix 2 [ ACC ] STREAM LISTENING 11032 /var/run/acpid.socket
....(底下省略)....
```
netstat 的輸出主要分為兩大部分,分別是 TCP/IP 的網絡接口部分,以及傳統的 Unix socket 部分。 還記得我們在基礎篇里面曾經談到檔案的類型嗎?那個 socket 與 FIFO 檔案還記得吧? 那就是在 Unix 接口用來做為程序數據交流的接口了,也就是上頭表格內看到的 Active Unix domain sockets 的內容啰~
通常鳥哥都是建議加上『 -n 』這個參數的,因為可以避過主機名與服務名稱的反查,直接以 IP 及端口號碼 (port number) 來顯示,顯示的速度上會快很多!至于在輸出的訊息當中, 我們先來談一談關于網絡聯機狀態的輸出部分,他主要是分為底下幾個大項:
* Proto:該聯機的封包協議,主要為 TCP/UDP 等封包;
* Recv-Q:非由用戶程序連接所復制而來的總 bytes 數;
* Send-Q:由遠程主機所傳送而來,但不具有 ACK 標志的總 bytes 數, 意指主動聯機 SYN 或其他標志的封包所占的 bytes 數;
* Local Address:本地端的地址,可以是 IP (-n 參數存在時), 也可以是完整的主機名。使用的格是就是『 IP:port 』只是 IP 的格式有 IPv4 及 IPv6 的差異。 如上所示,在 port 22 的接口中,使用的 :::22 就是針對 IPv6 的顯示,事實上他就相同于 0.0.0.0:22 的意思。 至于 port 25 僅針對 lo 接口開放,意指 Internet 基本上是無法連接到我本機的 25 埠口啦!
* Foreign Address:遠程的主機 IP 與 port number
* stat:狀態欄,主要的狀態含有:
* ESTABLISED:已建立聯機的狀態;
* SYN_SENT:發出主動聯機 (SYN 標志) 的聯機封包;
* SYN_RECV:接收到一個要求聯機的主動聯機封包;
* FIN_WAIT1:該插槽服務(socket)已中斷,該聯機正在斷線當中;
* FIN_WAIT2:該聯機已掛斷,但正在等待對方主機響應斷線確認的封包;
* TIME_WAIT:該聯機已掛斷,但 socket 還在網絡上等待結束;
* LISTEN:通常用在服務的監聽 port !可使用『 -l 』參數查閱。
基本上,我們常常談到的 netstat 的功能,就是在觀察網絡的聯機狀態了,而網絡聯機狀態中, 又以觀察『我目前開了多少的 port 在等待客戶端的聯機』以及 『目前我的網絡聯機狀態中,有多少聯機已建立或產生問題』最常見。 那你如何了解與觀察呢?通常鳥哥是這樣處理的:
```
# 范例三:秀出目前已經啟動的網絡服務
[root@www ~]# netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:34796 0.0.0.0:* LISTEN 987/rpc.statd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 969/rpcbind
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1231/master
tcp 0 0 :::22 :::* LISTEN 1155/sshd
udp 0 0 0.0.0.0:111 0.0.0.0:* 969/rpcbind
....(底下省略)....
# 上面最重要的其實是那個 -l 的參數,因為可以僅列出有在 Listen 的 port
```
你可以發現很多的網絡服務其實僅針對本機的 lo 開放而已,因特網是連接不到該埠口與服務的。 而由上述的數據我們也可以看到,啟動 port 111 的,其實就是 rpcbind 那只程序,那如果想要關閉這個埠口, 你可以使用 kill 刪除 PID 969,也可以使用 killall 刪除 rpcbind 這個程序即可。如此一來, 很輕松的你就能知道哪個程序啟動了哪些端口啰!
```
# 范例四:觀察本機上頭所有的網絡聯機狀態
[root@www ~]# netstat -atunp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 969/rpcbind
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1155/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1231/master
tcp 0 52 192.168.1.100:22 192.168.1.101:1937 ESTABLISHED 4716/0
....(底下省略)....
```
看到上頭的特殊字體吧?那代表目前已經建立聯機的一條網絡聯機,他是由遠程主機 192.168.1.101 啟動一個大于 1024 的埠口向本地端主機 192.168.1.100 的 port 22 進行的一條聯機, 你必須要想起來的是:『Client 端是隨機取一個大于 1024 以上的 port 進行聯機』,此外『只有 root 可以啟動小于 1024 以下的 port 』,那就看的懂上頭那條聯機啰!如果這條聯機你想要砍掉他的話, 看到最右邊的 4716 了沒? kill 會用吧! ^_^
至于傳統的 Unix socket 的數據,記得使用 man netstat 查閱一下吧! 這個 Unix socket 通常是用在一些僅在本機上運作的程序所開啟的插槽接口文件, 例如 X Window 不都是在本機上運作而已嗎?那何必啟動網絡的 port 呢?當然可以使用 Unix socket 啰,另外,例如 Postfix 這一類的網絡服務器,由于很多動作都是在本機上頭來完成的, 所以以會占用很多的 Unix socket 喔!
例題:請說明服務名稱與 port number 的對應在 Linux 當中,是用那個檔案來設定對應的?答:/etc/services
* * *
### 5.2.4 偵測主機名與 IP 對應: host, nslookup
關于主機名與 IP 的對應中,我們主要介紹的是 DNS 客戶端功能的 dig 這個指令。不過除了這個指令之外, 其實還有兩個更簡單的指令,那就是 host 與 nslookup 啦!底下讓我們來聊聊這兩個指令吧!
* host
這個指令可以用來查出某個主機名的 IP 喔!舉例來說,我們想要知道 tw.yahoo.com 的 IP 時,可以這樣做:
```
[root@www ~]# host [-a] hostname [server]
選項與參數:
-a :列出該主機詳細的各項主機名設定數據
[server] :可以使用非為 /etc/resolv.conf 的 DNS 服務器 IP 來查詢。
# 范例一:列出 tw.yahoo.com 的 IP
[root@www ~]# host tw.yahoo.com
tw.yahoo.com is an alias for tw-cidr.fyap.b.yahoo.com.
tw-cidr.fyap.b.yahoo.com is an alias for tw-tpe-fo.fyap.b.yahoo.com.
tw-tpe-fo.fyap.b.yahoo.com has address 119.160.246.241
```
瞧!IP 是 119.160.246.241 啊!很簡單就可以查詢到 IP 了!那么這個 IP 是向誰查詢的呢?其實就是寫在 [/etc/resolv.conf](http://linux.vbird.org/linux_server/0130internet_connect.php#resolv) 那個檔案內的 DNS 服務器 IP 啦!如果不想要使用該檔案內的主機來查詢,也可以這樣做:
```
[root@www ~]# host tw.yahoo.com 168.95.1.1
Using domain server:
Name: 168.95.1.1
Address: 168.95.1.1#53
Aliases:
tw.yahoo.com is an alias for tw-cidr.fyap.b.yahoo.com.
tw-cidr.fyap.b.yahoo.com is an alias for tw-tpe-fo.fyap.b.yahoo.com.
tw-tpe-fo.fyap.b.yahoo.com has address 119.160.246.241
```
會告訴我們所使用來查詢的主機是哪一部吶!這樣就夠清楚了吧!不過,再怎么清楚也比不過 dig 這個指令的,所以這個指令僅是參考參考啦!
* nslookup
這玩意兒的用途與 host 基本上是一樣的,就是用來作為 IP 與主機名對應的檢查, 同樣是使用 [/etc/resolv.conf](http://linux.vbird.org/linux_server/0130internet_connect.php#resolv) 這個檔案來作為 DNS 服務器的來源選擇。
```
[root@www ~]# nslookup [-query=[type]] [hostname|IP]
選項與參數:
-query=type:查詢的類型,除了傳統的 IP 與主機名對應外,DNS 還有很多信息,
所以我們可以查詢很多不同的信息,包括 mx, cname 等等,
例如: -query=mx 的查詢方法!
# 范例一:找出 www.google.com 的 IP
[root@www ~]# nslookup www.google.com
Server: 168.95.1.1
Address: 168.95.1.1#53
Non-authoritative answer:
www.google.com canonical name = www.l.google.com.
Name: www.l.google.com
Address: 74.125.71.106
....(底下省略)....
# 范例二:找出 168.95.1.1 的主機名
[root@www ~]# nslookup 168.95.1.1
Server: 168.95.1.1
Address: 168.95.1.1#53
1.1.95.168.in-addr.arpa name = dns.hinet.net.
```
如何,看起來與 host 差不多吧!不過,這個 nslookup 還可以由 IP 找出主機名喔! 例如那個范例二,他的主機名是: dns.hinet.net 哩!目前大家都建議使用 dig 這個指令來取代 nslookup ,我們會在[第十九章 DNS 服務器](http://linux.vbird.org/linux_server/0350dns.php)那時再來好好談一談吧!
* * *
- 鳥哥的Linux私房菜:服務器架設篇 第三版
- 第一部份:架站前的進修專區
- 作者序
- 第一章、架設服務器前的準備工作
- 1.1 前言: Linux 有啥功能
- 1.2 基本架設服務器流程
- 1.3 自我評估是否已經具有架站的能力
- 1.4 本章習題
- 第二章、基礎網絡概念
- 2.1 網絡是個什么玩意兒
- 2.2 TCP/IP 的鏈結層相關協議
- 2.3 TCP/IP 的網絡層相關封包與數據
- 2.4 TCP/IP 的傳輸層相關封包與數據
- 2.5 連上 Internet 前的準備事項
- 2.6 重點回顧:
- 2.7 本章習題
- 2.8 參考數據與延伸閱讀
- 第三章、局域網絡架構簡介
- 3.1 局域網絡的聯機
- 3.2 本書使用的內部聯機網絡參數與通訊協議
- 第四章、連上 Internet
- 4.1 Linux 連上 Internet 前的注意事項
- 4.2 連上 Internet 的設定方法
- 4.3 無線網絡--以筆記本電腦為例
- 4.4 常見問題說明
- 4.5 重點回顧
- 4.6 本章習題
- 4.7 參考數據與延伸閱讀
- 第五章、 Linux 常用網絡指令
- 5.1 網絡參數設定使用的指令
- 5.2 網絡偵錯與觀察指令
- 5.3 遠程聯機指令與實時通訊軟件
- 5.4 文字接口網頁瀏覽
- 5.5 封包擷取功能
- 5.6 重點回顧
- 5.7 本章習題
- 5.8 參考數據與延伸閱讀
- 第六章、 Linux 網絡偵錯
- 6.1 無法聯機原因分析
- 6.2 處理流程
- 6.3 本章習題
- 6.4 參考數據與延伸閱讀
- 第二部分:主機的簡易資安防護措施
- 第七章、網絡安全與主機基本防護:限制端口, 網絡升級與 SELinux
- 7.1 網絡封包聯機進入主機的流程
- 7.2 網絡自動升級軟件
- 7.3 限制聯機埠口 (port)
- 7.4 SELinux 管理原則
- 7.5 被攻擊后的主機修復工作
- 7.6 重點回顧
- 7.7 課后練習
- 7.8 參考數據與延伸閱讀
- 第八章、路由觀念與路由器設定
- 8.1 路由
- 8.2 路由器架設
- 8.3 動態路由器架設:quagga (zebra + ripd)
- 8.4 特殊狀況:路由器兩邊界面是同一個 IP 網段: ARP Proxy
- 8.5 重點回顧
- 8.6 本章習題
- 8.7 參考數據與延伸閱讀
- 第九章、防火墻與 NAT 服務器
- 9.1 認識防火墻
- 9.2 TCP Wrappers
- 9.3 Linux 的封包過濾軟件:iptables
- 9.4 單機防火墻的一個實例
- 9.5 NAT 服務器的設定
- 9.6 重點回顧
- 9.7 本章習題
- 9.8 參考數據與延伸閱讀
- 第十章、申請合法的主機名
- 10.1 為何需要主機名
- 10.2 注冊一個合法的主機名
- 10.3 重點回顧
- 10.4 本章習題
- 10.5 參考數據與延伸閱讀
- 第三部分:局域網絡內常見的服務器架設
- 第十一章、遠程聯機服務器SSH / XDMCP / VNC / RDP
- 11.1 遠程聯機服務器
- 11.2 文字接口聯機服務器: SSH 服務器
- 11.3 最原始圖形接口: Xdmcp 服務的啟用
- 11.4 華麗的圖形接口: VNC 服務器
- 11.5 仿真的遠程桌面系統: XRDP 服務器
- 11.6 SSH 服務器的進階應用
- 11.7 重點回顧
- 11.8 本章習題
- 11.9 參考數據與延伸閱讀
- 第十二章、網絡參數控管者: DHCP 服務器
- 12.1 DHCP 運作的原理
- 12.2 DHCP 服務器端的設定
- 12.3 DHCP 客戶端的設定
- 12.4 DHCP 服務器端進階觀察與使用
- 12.5 重點回顧
- 12.6 本章習題
- 12.7 參考數據與延伸閱讀
- 第十三章、文件服務器之一:NFS 服務器
- 13.1 NFS 的由來與其功能
- 13.2 NFS Server 端的設定
- 13.3 NFS 客戶端的設定
- 13.4 案例演練
- 13.5 重點回顧
- 13.6 本章習題
- 13.7 參考數據與延伸閱讀
- 第十四章、賬號控管: NIS 服務器
- 14.1 NIS 的由來與功能
- 14.2 NIS Server 端的設定
- 14.3 NIS Client 端的設定
- 14.4 NIS 搭配 NFS 的設定在叢集計算機上的應用
- 14.5 重點回顧
- 14.6 本章習題
- 14.7 參考數據與延伸閱讀
- 第十五章、時間服務器: NTP 服務器
- 15.1 關于時區與網絡校時的通訊協議
- 15.2 NTP 服務器的安裝與設定
- 15.3 客戶端的時間更新方式
- 15.4 重點回顧
- 15.5 本章習題
- 15.6 參考數據與延伸閱讀
- 第十六章、文件服務器之二: SAMBA 服務器
- 16.1 什么是 SAMBA
- 16.2 SAMBA 服務器的基礎設定
- 16.3 Samba 客戶端軟件功能
- 16.4 以 PDC 服務器提供賬號管理
- 16.5 服務器簡單維護與管理
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考數據與延伸閱讀
- 第十七章、區網控制者: Proxy 服務器
- 17.1 什么是代理服務器 (Proxy)
- 17.2 Proxy 服務器的基礎設定
- 17.3 客戶端的使用與測試
- 17.4 服務器的其他應用設定
- 17.5 重點回顧
- 17.6 本章習題
- 17.7 參考數據與延伸閱讀
- 第十八章、網絡驅動器裝置: iSCSI 服務器
- 18.1 網絡文件系統還是網絡驅動器
- 18.2 iSCSI target 的設定
- 18.3 iSCSI initiator 的設定
- 18.4 重點回顧
- 18.5 本章習題
- 18.6 參考數據與延伸閱讀
- 第四部分:常見因特網服務器架設
- 第十九章、主機名控制者: DNS 服務器
- 19.1 什么是 DNS
- 19.2 Client 端的設定
- 19.3 DNS 服務器的軟件、種類與 cache only DNS 服務器設定
- 19.4 DNS 服務器的詳細設定
- 19.5 協同工作的 DNS: Slave DNS 及子域授權設定
- 19.6 DNS 服務器的進階設定
- 19.7 重點回顧
- 19.8 本章習題
- 19.9 參考數據與延伸閱讀
- 第二十章、WWW 伺服器
- 20.1 WWW 的簡史、資源以及伺服器軟體
- 20.2 WWW (LAMP) 伺服器基本設定
- 20.3 Apache 伺服器的進階設定
- 20.4 登錄檔分析以及 PHP 強化模組
- 20.5 建立連線加密網站 (https) 及防砍站腳本
- 20.6 重點回顧
- 20.7 本章習題
- 20.8 參考資料與延伸閱讀
- 第二十一章、文件服務器之三: FTP 服務器
- 21.1 FTP 的數據鏈路原理
- 21.2 vsftpd 服務器基礎設定
- 21.3 客戶端的圖形接口 FTP 聯機軟件
- 21.4 讓 vsftpd 增加 SSL 的加密功能
- 21.5 重點回顧
- 21.6 本章習題
- 21.7 參考數據與延伸閱讀
- 第二十二章、郵件服務器: Postfix
- 22.1 郵件服務器的功能與運作原理
- 22.2 MTA 服務器: Postfix 基礎設定
- 22.3 MRA 服務器: dovecot 設定
- 22.4 MUA 軟件:客戶端的收發信軟件
- 22.5 郵件服務器的進階設定
- 22.6 重點回顧
- 22.7 本章習題
- 22.8 參考數據與延伸閱讀