Linux——網絡與配置

網絡與配置

網絡基礎

數據包

數據被分成一塊塊的在網絡上傳輸,每一塊叫作一個數據包(packet)。包中分爲兩部分:頭和淨荷。頭含有一些識別信息,如發送方、接收方以及基本的協議。淨荷則含有實際需要傳送的數據,如HTML或圖片數據。

分包使主機能夠交替地做出發送、接收、處理數據的動作,所以主機之間看似能同時通信。而且這樣也令錯誤檢測和重傳數據更方便。

網絡層次

一個功能完整的網絡,包含一整套被稱爲網絡棧的網絡層次

  • 應用層:包含應用間、服務器件的交流語言,通常是一種高級的協議。一般有超文本傳輸協議(Hypertext Transfer Protocol,以下簡稱HTTP,用於Web)、安全套接層(Secure Socket Layer,以下簡稱SSL)、文件傳輸協議(File Transfer Protocol,以下簡稱FTP)。協議能夠組合使用。例如SSL就常跟HTTP一起用。

  • 傳輸層:用於規定應用層的數據傳輸形式。該層包括數據完整性的檢查、端口功能以及將數據分包(如果應用層未分包)。傳輸控制協議(Transmission Control Protocol,以下簡稱TCP)和用戶數據報協議(User Datagram Protocol,以下簡稱UDP)是傳輸層最常見的協議。這層有時也被稱爲協議層。

  • 網絡層或網際層:規定如何識別源主機和目的主機。IP(網際協議)規定了互聯網所使用的包傳輸規則。因爲本書只討論互聯網,所以我們只談及IP。

  • 物理層:規定如何通過物理中介(如以太網、調製調解器)發送原始數據。這層有時也被稱爲鏈路層或網絡接口層。

網際層

互聯網的拓撲結構是無中心的。它由更小的網絡——子網構成。意思是,各子網以某些方式相連。

一個主機可以置於不止一個子網中。負責將數據從一個子網送到另一子網的那種主機叫作路由器(也叫網關)。

查看自己計算機的IP地址

一個主機可以有多個IP地址,以下命令用於查看主機使用中的地址:

$ ipconfig

它會輸出很多結果,其中應該包括以下內容:

eth0 
Link encap:Ethernet HWaddr 10:78:d2:eb:76:97
inet addr:10.23.2.4 Bcast:10.23.2.255 Mask:255.255.255.0
inet6 addr: fe80::1278:d2ff:feeb:7697/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:85076006 errors:0 dropped:0 overruns:0 frame:0
TX packets:68347795 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:86427623613 (86.4 GB) TX bytes:23437688605 (23.4 GB)
Interrupt:20 Memory:fe500000-fe520000

ifconfig能展現網際層和物理層的許多細節。

子網

子網就是一組相互連接的、帶有按序排列的IP地址的主機。通常這組主機會在同一個物理網絡中。

劃分子網需要考慮兩點:一個是網絡前綴,一個是子網掩碼

假若你要建立一個包含10.23.2.1到10.23.2.254的子網,那麼它們通用的網絡前綴就是10.23.2.0

子網掩碼就是255.255.255.0。下面解釋爲什麼是這樣。

前綴和掩碼是怎樣表示子網中的可用IP的?將點分四組序列轉換成位,會比較易懂。掩碼標記了子網內主機能共用的IP位。現將10.23.2.0和255.255.255.0轉換成位

10.23.2.0:         00001010 00010111 00000010 00000000
255.255.255.0: 11111111  11111111  11111111  00000000

再將前綴中與掩碼的那些1對應的位加粗:

10.23.2.0: 00001010 00010111 00000010 00000000

可將剩下未加粗部分的任何位設爲1,以獲得可用的IP地址(除了全0和全1)。

把它們合在一起,你就知道一個IP爲10.23.2.1、子網掩碼爲255.255.255.0的主機是如何跟其他以10.23.2打頭的主機共處一個子網的了。這整個子網可記爲10.23.2.0/255.255.255.0。

共用子網掩碼與無類域內路由選擇

你可能會遇到難以判斷子網可用IP範圍的那種,例如255.255.255.192。你還可能會看到另一種子網的表示方式——無類域內路由選擇(Classless Inter-Domain Routing,以下簡稱CIDR),它會將10.23.2.0/255.255.255.0寫成10.23.2.0/24。

像255.255.255.0就是24個1後接8個0。掩碼在CIDR中只記錄其開頭的1的個數,因此,10.23.2.0/24已完整地表達了前綴與掩碼。

一些子網掩碼及其CIDR形式

長形式 CIDR形式
255.0.0.0 8
255.255.0.0 16
255.240.0.0 12
255.255.255.0 24
255.255.255.192 26

路由和內核路由表

將各子網連通的過程,就是識別路由器的過程。

IP地址爲10.23.2.4的主機A能夠直接訪問本地網絡10.23.2.0/24上的其他主機。當要訪問互聯網上的其他主機時,它需要通過IP爲10.23.2.1的路由器。

Linux內核是如何區分兩個不同類型的目標地址的呢?其實,它是通過一種叫路由表的配置文件來決定自身的路由行爲的。

route -n命令可以顯示出路由表

$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.23.2.1 0.0.0.0 UG 0 0 0 eth0
10.23.2.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0

最後兩行顯示路由信息。 Destination列是網絡前綴,Genmask列是對應的掩碼。這裏有兩個網絡:0.0.0.0/0(所有IP都可在這裏找到對應)和 10.23.2.0/24。每個網絡的Flags列都有個U,意味着該路由是活動的。

最後兩行顯示路由信息。 Destination列是網絡前綴,Genmask列是對應的掩碼。這裏有兩個網絡:0.0.0.0/0(所有IP都可在這裏找到對應)和 10.23.2.0/24。每個網絡的Flags列都有個U,意味着該路由是活動的。

這些Destination的差異在於Gateway與Flags的組合。0.0.0.0/0的Flags有G,表示需要通過Gateway(10.23.2.1)才能訪問它。而10.23.2.0/24的Flags無G,表示它能被直接訪問。該行的Gateway列記爲0.0.0.0,其他列暫時不管。

默認網關

0.0.0.0/0能匹配互聯網中的所有IP,它是默認路由,其Gateway列(route -n所示的)的地址是默認網關。如果目標地址沒有匹配到其他網絡,那就將信息從默認網關送出,到默認路由裏找。你可以給主機取消默認網關的配置,那它將只能訪問路由表中所剩的網域。

基本ICMP和DNS工具

用於查找路由和連接問題的網際控制報文協議(Internet Control Message Protocol,以下簡稱ICMP),以及使用名稱代替IP地址以便人們記憶的域名系統(Domain Name Service,以下簡稱DNS)。

ping

ping是最常見的網絡調試工具之一。它發送一個ICMP請求報文給一臺主機,這會使該接收者回送報文

$ ping 10.23.2.1
PING 10.23.2.1 (10.23.2.1) 56(84) bytes of data.
64 bytes from 10.23.2.1: icmp_req=1 ttl=64 time=1.76 ms
64 bytes from 10.23.2.1: icmp_req=2 ttl=64 time=2.35 ms
64 bytes from 10.23.2.1: icmp_req=4 ttl=64 time=1.69 ms
64 bytes from 10.23.2.1: icmp_req=5 ttl=64 time=1.61 ms

這裏第一行說的是你發了56(包括頭部的話,是84)字節的數據包給10.23.2.1(默認一秒一包),接下來的行是10.23.2.1的應答信息。其中最重要的是序列號(icmp_req)和來回時間(time)。返回信息的容量是發送信息的容量加8(數據包的內容不用管)。

來回時間是指數據包從發出到收回所經歷的時間。如果包無法到到目的地,那麼最後一站的路由器會返回host unreachable(無法到達主機)的信息。

traceroute

執行traceroute host能顯示數據包到達目標主機所走過的路。(traceroute -n 主機名不查找主機名。)

它的優點之一,就是能告訴你每個路由之間的回程用時,如以下片段:

4 206.220.243.106 1.163 ms 0.997 ms 1.182 ms
5 4.24.203.65 1.312 ms 1.12 ms 1.463 ms
6 64.159.1.225 1.421 ms 1.37 ms 1.347 ms
7 64.159.1.38 55.642 ms 55.625 ms 55.663 ms
8 209.247.10.230 55.89 ms 55.617 ms 55.964 ms
9 209.244.14.226 55.851 ms 55.726 ms 55.832 ms
10 209.246.29.174 56.419 ms 56.44 ms 56.423 ms

因爲6和7之間的有個很大的延時,所以那部分可能是一個長途的連接

traceroute的輸出信息可能會不連續,在某步出現超時,而後面的步又能正常顯示。那很可能是那一步的路由拒絕返回traceroute想要的調試信息,而往後的路由卻願意返回結果

DNS與host

系統上的DNS庫通常會幫你搞定這種轉換,但有時你可能會想自己手動轉換。host命令用於找出域名的IP地址:

$ host www.example.com
www.example.com has address 93.184.216.119
www.example.com has IPv6 address 2606:2800:220:6d:26bf:1447:1097:aa7

注意,這個例子同時顯示了IPv4地址93.184.216.119和一個更長的IPv6地址,說明該主機已擁有一個下一代互聯網地址。

你也可以用host來反查IP地址的域名,即輸入IP地址而不是域名。不過這個不太可靠。因爲不同的主機名可以指向同一個IP地址,所以DNS無法得知哪個主機名纔是你要的。

物理層與以太網

在IEEE 802標準的家族中,以太網有很多種,從有線到無線,但它們總有一些共性

  • 所有以太網上的設備都有各自的介質訪問控制(Media Access Control,以下簡稱MAC)地址,有時這也叫硬件地址。它與主機的IP地址無關,而且它在主機所處的以太網中是唯一的(但在互聯網這種大型的軟件網絡中不一定唯一)。MAC地址形如10:78:d2:eb:76:97。
  • 以太網上的設備以幀的形式發送信息,幀裏除了實際的數據,還有發送者和接收者的MAC地址。

假設你有一臺主機連接了兩個不同類型的以太網(兩個不同的網絡接口設備),你是無法直接使幀通過該主機從一個以太網傳送到另一個以太網的,除非該主機建立了一種特殊的橋樑。這就是網際層(如互聯網層)的工作了

理解內核網絡接口

網際層與物理層的連接方式必須使得網際層擁有不依賴於硬件環境的靈活性。Linux內核自有一套用於溝通這兩層的方法,叫作**(內核)網絡接口** 。所謂配置網絡接口,就是把網際層的IP地址跟物理層的硬件標識對應起來。網絡接口的名字通常概括了它的硬件類型,例如eth0(計算機的第一塊以太網卡)和wlan0(無線接口)。

配置網絡接口

  1. 接上網絡硬件,並保證內核有它的驅動。如果有,可以使用ifconfig -a來顯示該硬件對應的網絡接口。
  2. 進行任意物理層設置,如可以配置網絡名稱和密碼。
  3. 給網絡接口綁定一個IP地址和掩碼,使得驅動(物理層)能識別子網(網際層)。
  4. 添加必要的路由,包括默認網關

手動設置IP地址和掩碼,需要執行以下命令:

ifconfig interface address netmask mask

這裏interface是網絡接口的名字,例如eth0。當網絡接口能用了的時候,就可以添加路由了(其實就是設置默認網關):

route add default gw gw-address

參數gw-address是你默認網關的IP地址,它必須處於你其中一個網絡接口的地址和掩碼所定義的子網之中。

手動添加和刪除路由

以下命令用來刪除默認網關:

route del -net default

你可以在默認網關的位置填上其他路由。假如你機器在子網10.23.2.0/24,其中的路由器在10.23.2.44,你想訪問192.168.45.0/24,那麼以下命令讓我們可以通過10.23.2.44訪問 192.168.45.0:

# route add -net 192.168.45.0/24 gw 10.23.2.44

刪除對某子網的路由時,則無需填寫“路由”參數:

route del -net 192.168.45.0/24

一些網絡配置管理器

基於Linux的系統都有一些自動配置網絡的方法。桌面端或筆記本端常用NetworkManager。其他網絡配置管理程序則針對更小型的嵌入式系統,例如OpenWRT的netifd、Android的ConnectivityManager服務、ConnMan和icd等

NetworkManager的操作

NetworkManager是一個開機時系統就啓動的守護進程。跟其他守護進程一樣,它不依賴桌面組件。它的任務是監聽系統和用戶的事件,並根據一堆規則來改變網絡配置。

NetworkManager運行的時候,維護着兩個層次的配置。

  • 第一層是它從內核收集而來,並通過監控桌面總線(D-Bus)的udev來維護的一堆可用的硬件設備的信息。

  • 第二層是更具體的一些連接配置:硬件設備和額外的物理層、網際層的配置參數。

NetworkManager激活一個連接的做法,是將任務交給其他特定的網絡工具或守護進程(例如dhclient,它會從接上的本地網絡那裏獲得網際層配置)。因爲網絡配置工具和方案因不同發行版而異,所以NetworkManager需要插件來適配它們,而非強推自己的標準。例如Debian/Ubuntu和Red Hat都有對應的插件。

與NetworkManager交互

可以在shell中使用其他工具來查詢和操控NetworkManager。使用不帶參數的nm-tool,可以快速地列出你當前的連接狀態,裏面有網絡接口及它們的參數。這有些類似ifconfig,但沒有ifconfig詳細,尤其是關於無線網絡方面。

nmcli命令可以操控NetworkManager

NetworkManager的配置

一般NetworkManager的配置文件是放在/etc/NetworkManager目錄中,裏面有各種不同的配置文件。

通常我們是看NetworkManager.conf這個文件。它的格式類似XGD風格的.desktop文件和微軟的.ini文件,將一些鍵值對參數寫在不同的小節中。幾乎所有的配置文件都有[main]小節,用以定義插件。以下就是在Ubuntu和Debian 中激活ifupdown插件的例子:

[main]
plugins=ifupdown,keyfile

不受管理的接口

你可以用插件來讓NetworkManager忽略某個網絡接口。如果你在用ifupdown(在Ubuntu和Debian上),那麼,將接口的配置加到/etc/network/interfaces文件中,然後在NetworkManager.conf文件的ifupdown小節,把managed設爲false:

[ifupdown]
managed=false

你還是可以通過keyfile插件,直接在Network Manager.conf文件裏指定要忽略的硬件地址,如下:

[keyfile]
unmanaged-devices=mac:10:78:d2:eb:76:97;mac:1c:65:9d:cc:ff:b9

調度

當網絡接口的狀態改變時,NetworkManager會運行/etc/NetworkManager/dispatcher.d裏的所有東西,並給予一個up或者down的參數。這種是比較簡單的,但很多系統都有自己的一套網絡控制腳本,而不會將調度程序腳本放在那個目錄裏。

解析主機名

DNS與之前的網絡話題的不同之處在於它在應用層,完全是用戶空間的事

差不多所有Linux網絡應用都會做DNS查找,步驟基本如下所示:

  1. 應用會調用一個函數,去查找主機名對應的IP。該函數在系統共享庫中,應用只管調用,而無需瞭解其中實現手段。
  2. 當該函數運行時,它會根據一系列規則(規則在/etc/nsswitch.conf中)來決定查找的計劃。例如,通常會有這樣的規則——先檢查/etc/hosts裏的重寫,再使用DNS。
  3. 使用DNS,先要找到DNS服務器(在一個額外的文件裏定義了這個DNS服務器的IP)。
  4. 該函數發送一個DNS查詢的請求給DNS服務器。
  5. DNS服務器將請求中主機名對應的IP返回給函數,再由函數返回給應用。

/etc/hosts

大多數系統都允許你通過/etc/hosts重寫主機名的查找,該文件看起來會是這樣:

127.0.0.1 localhost
10.23.2.3 atlantic.aem7.net atlantic
10.23.2.4 pacific.aem7.net pacific

resolv.conf文件

傳統的做法是在/etc/resolv.conf文件中指定DNS服務器

search mydomain.example.com example.com
nameserver 10.32.45.23
nameserver 10.3.2.3

search的那行定義了針對殘缺主機名(僅有主機名的第一部分,如myserver而非myserver.example.com)的查找方式。這裏指定了會到host.mydomain.example.com和host.example.com查找。但平常是沒這麼簡單的。DNS配置現在有了很多改善。

緩存和零配置DNS

傳統的DNS配置有兩個主要的問題

  1. 本機不緩存DNS服務器的迴應,這樣每次都請求解析會使網絡減慢,方案:很多機器(包括作爲DNS服務器的路由器)都會運行一個守護進程,儘可能地攔截DNS請求,並返回緩存中的DNS迴應,做不到的話才把請求發送到DNS服務器。最常見的這種守護進程是dnsmasq和nscd。你還可以建立BIND(標準的UnixDNS守護進程)來做緩存。
  2. 擴展性差:例如多播DNS(以下稱mDNS)和簡單服務發現協議(Simple Service Discovery Protocol,以下簡稱SSDP)若你想在本地網絡中按域名查找一個主機,那麼可以發起廣播,如果該主機存在,則它會告訴你它的IP。這些協議會在DNS解析之前工作,以告知有哪些服務可用。

Linux用得最多的mDNS實現是Avahi。你會經常看到/etc/nsswitch.conf把mdns作爲解析器

Localhost

ifconfig的輸出裏還有個lo:

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1

lo接口是一個虛擬的網絡接口,它叫作環回(loopback),因爲它指向的是自己。連接127.0.0.1,其實就是連接本機。當發送數據到內核網絡接口lo,內核只會將其重新包裝,並通過lo回覆。

傳輸層:TCP、UDP和Service

TCP端口與連接

TCP方式是指不同的網絡應用使用不同的網絡端口。端口只是一個數字。如果把IP比作大廈的地址,那麼端口就是大廈裏不同的郵箱號碼,是一種更細的劃分。

使用TCP時,應用會在本機的一個端口和遠程機器的一個端口之間建立連接。

一個連接可以用“IP加端口”代碼來標識。要想查看你機器上的連接,可用netstat。這裏展示了一些TCP連接:選項-n表示不用對主機名進行DNS解析,而-t則是隻輸出TCP連接。

$ netstat -nt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 10.23.2.4:47626 10.194.79.125:5222 ESTABLISHED
tcp 0 0 10.23.2.4:41475 172.19.52.144:6667 ESTABLISHED
tcp 0 0 10.23.2.4:57132 192.168.231.135:22 ESTABLISHED

Local Address和Foreign Address列位的內容是針對你的機器而言的

建立TCP連接

要建立傳輸層的連接,進程會發送一系列特別的數據包,先初始化一個從其本機端口到遠端端口的連接。爲了識別這個連接請求並進行答覆,遠端必須要有個進程監聽着那個被請求的端口。通常請求方被稱爲客戶端,監聽方被稱爲服務器。

$ netstat -ntl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN

local address有0.0.0.0:80的那行,說明本機正監聽着來自所有遠端對自己80端口的連接。

端口的數字和/etc/services

/etc/services是一個純文本文件,保存着一些常用端口及其服務的名字

ssh 22/tcp # SSH Remote Login Protocol
smtp 25/tcp
domain 53/udp

第一列是服務名稱,第二列是端口及其特定的傳輸協議(可以不是TCP)。

TCP的特點

作爲一種傳輸層協議,TCP之所以流行是因爲它對應用沒什麼要求。應用的進程只需要知道如何打開(或監聽)、讀取、寫入和關閉連接即可。對應用來說,這一過程就像收發數據流一樣,而進程的工作就跟處理文件一樣簡單。

幕後的工作:

  1. TCP實現需要知道怎樣將發出的數據流分裝成數據包。
  2. 使用TCP的主機還要做錯誤檢查:數據包在經由互聯網傳輸的過程中可能會丟失或受損,TCP必須進行糾正

UDP

UDP比TCP簡單得多。單條信息就可以構成一次傳輸,沒有數據流的說法。跟TCP不同的是,UDP不糾正數據包的丟失或亂序。

若把TCP看成是打電話,那麼UDP就像是寄信、發電報或發即時消息(當然即時消息稍微可靠些)。用UDP的應用,看重的是速度——儘快發出消息。它們不願承擔TCP的開銷,因爲它們已假設兩臺機之間的網絡是可靠的。它們不需要TCP的糾錯功能,因爲它們有自己一套糾錯系統,或他們根本不在乎出錯。

理解DHCP

所謂“自動獲取網絡配置”,就是讓主機使用動態主機配置協議(Dynamic Host Configuration Protocol,以下簡稱DHCP)來獲取IP、子網掩碼、默認網關和DNS服務器。

主機必須先能發信至其網絡中的DHCP服務器,才能通過DHCP獲取網絡配置。因此每個物理網絡必須有自己的DHCP服務器,而在普通的網絡中,我們通常以路由器充當DHCP服務器。

Linux的DHCP客戶端

儘管網絡管理系統有很多種,但它們幾乎全都使用互聯網軟件聯盟(Internet Software Consortium,以下簡稱ISC)的dhclient程序來工作。你可以在命令行手動測試dhclient

dhclient eth0

開始後,dhclient會將它的進程ID放在/var/run/dhclient.pid中,而將租用信息放在/var/state/dhclient.leases中。

Linux的DHCP服務器

你可以在Linux機器上運行DHCP服務器,以妥善地管理IP地址。除非你管理着一個擁有多個子網的大型網絡,否則你最好還是選擇內置DHCP服務器的路由器。

將Linux配置成路由器

你可以把路由器看成是一種不止一個網絡接口的計算機。

假設你有兩個LAN子網10.23.2.0/24和192.168.45.0/24,你可以用一個有三個網絡接口(兩個用於LAN、一個用於連接互聯網的上行線)的Linux路由器連通它們。

在這裏插入圖片描述
該路由器在兩個LAN子網的IP分別爲10.23.2.1和192.168.45.1。配置好IP後,它的路由表大概會如下所示:

Destination Gateway Genmask Flags Metric Ref Use Iface
10.23.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.45.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1

現在兩個子網上的主機都可將該路由器作爲默認網關了(10.23.2.0/24的是10.23.2.1,而192.168.45.0/24的是192.168.45.1)。如果10.23.2.4想發數據包給10.23.2.0/24以外的任何機器,它會將數據包傳給10.23.2.1。

默認情況下,Linux內核不會自動地在子網之間進行包傳遞。爲了使基本路由功能生效,你需要用以下命令激活路由器內核的IP轉發:

sysctl -w net.ipv4.ip_forward

一旦你輸入這個命令,而兩個子網的主機又懂得將數據包發往該機器的話,那麼該機器就能在兩個子網間實現路由功能。要使它即使重啓也能如舊

網絡地址轉換(IP僞裝)

NAT是把單個IP分享給整個私有網絡的常見方法,而且一般它在家庭和小型辦公網絡環境中都可用。Linux中,人們用得最多的NAT是IP僞裝。

NAT背後的基本思想是,路由器做的不只是將數據包從一個子網傳到另一個子網,而且還將數據包轉化了。互聯網上的主機只看到該路由器,而看不到其背後的私有網絡。私有網絡裏的主機無需什麼特別的配置,默認網關就使用該路由器。

  1. 私有網絡裏的一個主機想與外界通信,所以它會通過路由器發出連接請求的數據包。
  2. 路由器攔截了該請求,而不是傳出去
  3. 路由器根據該數據包中關於目標的信息,開啓其自身與該目標的連接。
  4. 連接成功後,路由器就僞造一個“連接已建立”的信息返回給內網主機。
  5. 現在路由器成了內網主機和遠程主機之間的中介。遠程主機並不知道該內網主機的存在,它只和路由器接頭。

一般IP路由知道的就只有源和目標的IP地址。

路由器與Linux

有個製造商,Linksys,被要求開放其某個軟件的源代碼,開放之後,便出現了一個Linux發行版,叫z做OpenWRT。(WRT是Linksys的某個產品型號。)

防火牆

路由器尤其應該包含某種防火牆,來爲你的網絡抵禦一些不速之客的請求。防火牆是一種軟件和(或)硬件的配置,處於互聯網和小型網絡之間的路由器之中,以保證小型網絡免於來自互聯網的攻擊。

爲每臺機器配備防火牆,這叫作IP過濾。系統可以在這些情況下過濾數據包:

  • 接收數據包時
  • 發送數據包時
  • 或將數據包轉發給其他主機或網關時。

這些檢查點會根據以下標準來丟棄、拒絕或者接受數據包:

  • 源或目標的IP或子網
  • 源或目標的端口(傳輸層的信息)
  • 防火牆的網絡接口

Linux防火牆基礎

Linux中,防火牆的規則是鏈型的。一個表就是一套鏈。數據包在Linux網絡子系統的各部分移動時,內核就會對包應用某套規則。

這些數據結構由內核來維護。整個系統叫作iptables,可以使用用戶空間的iptables命令來創建和修改規則。

因爲規則表有很多,表裏面的規則也很多,所以使得數據包的流動變得比較複雜。然而,你一般都只會接觸到一個叫作filter(過濾)的表,它控制基本的包流動。該表裏面有三個基本的鏈:對應包輸入的INPUT、對應包輸出的OUTPUT和對應包轉發的FORWARD。

設置防火牆規則

先用以下命令查看當前的設置:

# iptables -L

通常輸出的鏈設置是空的

Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

上例中的三個鏈的默認策略都是ACCEPT,即讓內核允許數據包通過。DROP策略是放棄數據包。命令iptables -P可以設置鏈的策略:

如果你對192.168.34.63這個用戶不勝其煩,想將其屏蔽,你可執行這句:

# iptables -A INPUT -s 192.168.34.63 -j DROP

在上例中,參數-A INPUT給INPUT鏈增加了一個規則。而-s 192.168.34.63指定規則所針對的源IP,-j DROP指的是,當數據包符合規則時,內核會將其丟棄。

192.168.34.63那傢伙還發動了他子網上的所有人向你請求SMTP連接。想擺脫他們,執行以下命令:

iptables -A INPUT -s 192.168.34.0/24 -p tcp --destination-port 25 -j DROP

現在問題解決了,但後來你會發現,你地址爲192.168.34.37的朋友不能給你發郵件了,因爲你連他也屏蔽了。爲了快速修復,你可能會執行以下命令:

但不管用。因爲內核是按從頂到底的順序來讀取鏈配置的,並執行第一條匹配的配置。

解決方法是將該規則移到頂部。

防火牆策略

防火牆的基本應用場景有兩種:一種是保護單臺機器(在每臺機器的INPUT鏈插入規則),另一種是保護整個網絡裏的機器(在路由器的FORWARD鏈插入規則)

如果你有一個SSH服務器在TCP端口22,那就不應該讓別人連到你22以外的端口

首先可將INPUT鏈策略設置爲DROP:

iptables -P INPUT DROP

但可通過以下命令,允許ICMP通信(給ping或其他工具使用):

iptables -A INPUT -p icmp -j ACCEPT

以太網、IP和ARP

網絡軟件包含了一套查找MAC地址的自動化系統,叫地址解析協議(Address Resolution Protocol,以下簡稱ARP)。使用以太網作爲物理層、IP作爲網絡層的主機,維護着一個叫ARP緩存的表,其中包含了IP地址與MAC地址的映射關係。在Linux中,ARP緩存在內核中。想要查看你的機器的ARP緩存,可使用命令arp

$ arp -n
Address Hwtype Hwaddr Flags Mask Iface
10.1.2.141 ether 00:11:32:0d:ca:82 C eth0
10.1.2.1 ether 00:24:a5:b5:a0:11 C eth0
10.1.2.50 ether 00:0c:41:f6:1c:99 C eth0

-n指定不進行DNS反向查詢

一臺機器剛開機時,是沒有ARP緩存的。那麼MAC是怎樣被緩存進來的呢?一切始於該機器想給另一臺主機發送數據包時。如果目標IP不在ARP緩存中,則下列步驟會執行。

  1. 源主機創建一個包含ARP請求包的以太網幀,以求獲知目標IP所對應的MAC。
  2. 源主機向目標子網的整個物理網絡廣播該幀。
  3. 如果子網中有個主機知道確切的MAC地址,它就會創建一個包含該地址的回覆包和幀發給源主機。通常,發出回覆的就是目標主機,它只是把自己的MAC地址回覆給源主機。
  4. 源主機將IP-MAC地址對加入到ARP緩存中,並繼續進行其他步驟。

無線以太網

無線以太網(即WiFi)與有線網絡沒有太大區別。跟任何有線設備一樣,它們都有MAC地址,也使用以太網幀來收發數據,因此Linux能像處理有線網絡接口那樣處理無線網絡接口。網際層及其以上的層次都是一樣的,主要不同就在於物理層中多加了一些組件,如頻段、網絡ID、安全組件等等。

無線網絡的配置是十分開放的,不像有線設備那樣擁有很強的自適應性

  • 傳輸細節:這些細節都是物理特性,例如頻率。
  • 網絡標識:因爲允許一套設備分出多個無線網絡,所以必須要有辦法區分它們。每個無線網絡的標識就是它的服務集標識(Service Set Identifier,又稱“網絡名”,以下簡稱SSID)。
  • 管理:雖然可以做到讓無線網中的主機直接交流,但大多數做法還是通過無線接入點來溝通。無線接入點通常橋接着有線網絡,使得它與有線網處於同一個網絡中。
  • 認證:你可能會想限制無線網的准入。想做到這點,你可以對接入點進行配置,以要求客戶輸入密碼或其他認證碼才能連上。
  • 加密:除了限制連接請求,一般我們還會對電波進行加密以保信息安全

iw

你可以通過一個叫iw的工具來查看和改變內核空間設備與網絡的配置。要使用它,你得先知道設備的網絡接口名,例如本例的wlan0。以下是掃描可用無線網絡的例子。

iw dev wlan0 scan

無線網絡安全

Linux主要依靠一個叫wpa_supplicant守護進程來管理無線網絡接口的認證和加密,以保證無線網絡安全。這個守護進程可以處理WPA(WiFi Protected Access,WiFi網絡安全接入)和WPA2的認證機制,以及幾乎所有的無線網絡加密技術

首次啓動時,它會讀取配置文件(默認是/etc/wpa_supplicant.conf),然後嘗試在所指定的網絡中向接入點提供自己的信息,並與其建立連接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章