在解釋Linux網絡管理相關的內容時,我覺得有必要先解釋數據包轉發功能以及因此涉及到的路由決策,這對厘清路由和未來的防火牆有重要幫助。然后再介紹網絡配置命令和相關文件。
13.1 Linux處理數據包過程
當向外界主機發送數據時,在它從網卡流入后需要對它做路由決策,根據其目標決定是流入本機數據還是轉發給其他主機,如果是流入本機的數據,則數據會從內核空間進入用戶空間(被應用程序接收、處理)。當用戶空間響應(應用程序生成新的數據包)時,響應數據包是本機產生的新數據,在響應包流出之前,需要做路由決策,根據目標決定從哪個網卡流出。如果不是流入本機的,而是要轉發給其他主機的,則必然涉及到另一個流出網卡,此時數據包必須從流入網卡完整地轉發給流出網卡,這要求Linux主機能夠完成這樣的轉發。但Linux主機默認未開啟ip_forward功能,這使得數據包無法轉發而被丟棄。Linux主機和路由器不同,路由器本身就是為了轉發數據包,所以路由器內部默認就能在不同網卡間轉發數據包,而Linux主機默認則不能轉發。如下圖:
另外,IP地址是屬於內核的(不僅如此,整個tcp/ip協議棧都屬於內核,包括端口號),只要能和其中一個地址通信,就能和另一個地址通信(這么說是不准確的,即使地址屬於內核,但還存在一個檢查數據包是否丟棄的問題,不過這不是本文內容),而不管是否開啟了數據包轉發功能。例如某Linux主機有兩網卡eth0:172.16.10.5和eth1:192.168.100.20,某192.168.100.22主機網關指向192.168.100.20,若它ping 172.16.10.5,結果將是通的,因為地址屬於內核,從eth1進來的數據包被內核分析時,發現目標地址為本機地址,直接就回應192.168.100.22,回應數據包繼續從eth1出去。
如果Linux主機有多塊網卡,如果不開啟數據包轉發功能,則這些網卡之間是無法互通的。例如eth0是172.16.10.0/24網段,而eth1是192.168.100.0/24網段,到達該Linux主機的數據包無法從eth0交給eth1或者從eth1交給eth0,除非Linux主機開啟了數據包轉發功能。
在Linux上開啟轉發功能有多種方法:
shell> echo 1 > /proc/sys/net/ipv4/ip_forward shell> sysctl -w net.ipv4.ip_forward=1
以上兩種方法是臨時生效的,若要永久生效,則應該寫入配置文件。在CentOS 6中,將/etc/sysctl.conf文件中的"net.ipv4.ip_forward"值改為1即可,但在CentOS 7中,systemd管理了太多的功能,sysctl的配置文件也分化為多個,包括/etc/sysctl.conf、/etc/sysctl.d/*.conf和/usr/lib/sysctl.d/*.conf,並且這些文件中默認都沒有net.ipv4.ip_forward項。當然,直接將此項寫入到這些配置文件中也都是可以的,建議寫在/etc/sysctl.d/*.conf中,這是systemd提供自定義內核修改項的目錄。例如:
shell> echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ip_forward.conf
可以使用以下幾種方式查看是否開啟了轉發功能。
[root@xuexi ~]# sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 0 [root@xuexi ~]# cat /proc/sys/net/ipv4/ip_forward 0 [root@xuexi ~]# sysctl -a | grep ip_forward net.ipv4.ip_forward = 0 net.ipv4.ip_forward_use_pmtu = 0
13.2 和網絡相關的幾個文件說明
13.2.1 網卡配置文件ifcfg-*
在/etc/sysconfig/network-scripts/目錄下有不少文件,絕大部分都是腳本類的文件,但有一類ifcfg開頭的文件為網卡配置文件(interface config),所有ifcfg開頭的文件在啟動網絡服務的時候都會被加載讀取,但具體的文件名ifcfg-XX的XX可以隨意命名。
以下是一個(CentOS 7上)ifcfg-XX文件的內容示例。
[root@xuexi ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE="eth0" # 顯示的名稱,必須/sys/class/net/目錄下的某個網卡名相同 IPV6INIT="no" BOOTPROTO="dhcp" ONBOOT=yes TYPE="Ethernet" DEFROUTE="yes" PEERDNS="yes" # 設置為yes時,此文件設置的DNS將覆蓋/etc/resolv.conf, # 若開啟了DHCP,則默認為yes,所以dhcp的dns也會覆蓋/etc/resolv.conf PEERROUTES="yes" IPV4_FAILURE_FATAL="no" NAME="System eth0" DNS1=114.114.114.114 DNS2=8.8.8.8 DNS3=114.114.115.115
13.2.2 DNS配置文件/etc/resolv.conf
該文件用於設置DNS指向,以及解析順序。該文件格式如下:
domain domain_name # 聲明本地域名,即解析時自動隱式補齊的域名
search domain_name_list # 指定域名搜索順序(最多6個),和domain不能共存,若共存了,則后面的行生效
nameserver IP1 # 設置DNS指向,最多3個
nameserver IP2
nameserver IP3
options timeout:n attempts:n # 指定解析超時時間(默認5秒)和解析次數(默認2次)
例如將/etc/resolv.conf設置為下所示,為了測試,暫且不設置nameserver。
domain malong.com
當解析不帶點"."的主機名時,如"www",認為不是fqdn,將自動加上".malong.com"變成解析"www.malong.com"。
[root@xuexi ~]# host -a www Trying "www.malong.com" ;; connection timed out; trying next origin Trying "www" ;; connection timed out; no servers could be reached
當解析的名稱末尾不帶點但中間帶了點的,如"www.host",認為是fqdn,將直接解析"www.host",解析完這個后再解析加上"malong.com"的名稱,即再解析"www.host.malong.com"。
[root@xuexi ~]# host -a www.host Trying "www.host" ;; connection timed out; trying next origin Trying "www.host.malong.com" ;; connection timed out; no servers could be reached
當解析末尾帶點的名稱時,如"www.host."認為是完整的fqdn,將直接解析"www.host",解析完后直接結束解析,不會再補齊本地域名再解析。
[root@xuexi ~]# host -a www.host. Trying "www.host" ;; connection timed out; trying next origin Trying "www.host" # 默認解析兩次 ;; connection timed out; no servers could be reached
search關鍵字的作用和domain是一樣的,只不過search同時還暗含域名搜索的順序。例如設置search為如下內容:
search malongshuai.com longshuai.com mashuai.com
此時若解析"www.host",將依次解析"www.host","www.host.malongshuai.com","www.host.longshuai.com","www.host.mashuai.com"。
[root@xuexi ~]# host -a www.host Trying "www.host" ;; connection timed out; trying next origin Trying "www.host.malongshuai.com" ;; connection timed out; trying next origin Trying "www.host.longshuai.com" ;; connection timed out; trying next origin Trying "www.host.mashuai.com" ;; connection timed out; no servers could be reached
[root@xuexi ~]# host -a www Trying "www.malongshuai.com" ;; connection timed out; trying next origin Trying "www.longshuai.com" ;; connection timed out; trying next origin Trying "www.mashuai.com" ;; connection timed out; trying next origin Trying "www" ;; connection timed out; no servers could be reached
domain部分和search部分不能共存,如果共存了,則后出現的行有效。
13.2.3 /etc/udev/rules.d/70-persistent-net.rules
當插入新的網絡設備時,內核首先識別到,隨后在sysfs文件系統(一般掛載在/sys下)中生成該設備對應的信息文件。然后內核通知udev的后台守護進程udevd(若不知道它是什么東西,請認為它是Windows系統中的設備管理器,管理和監視硬件設備),udevd將讀取sysfs中對應設備的相關信息,並比對或生成udev的規則集,能匹配上的則做對應的操作。對於網卡來說,CentOS 6上它的的規則集文件默認為/etc/udev/rules.d/70-persistent-net.rules,匹配該規則集成功后,最后還在/sys/class/net目錄中生成對應的設備子目錄。
以下為兩個網卡的規則集的內容:
[root@xuexi ~]# cat /etc/udev/rules.d/70-persistent-net.rules # PCI device 0x8086:0x100f (e1000) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:7f:cf:a4", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" # PCI device 0x8086:0x100f (e1000) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:7f:cf:ae", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
具體的udev規則集語法並非本文內容,所以此處僅簡單解釋下上面的兩個規則集。規則集文件的寫法都是key/value格式,但分為匹配key/vaule和行為key/value。上述例子中,從SUBSYSTEM直到KERNEL都是使用"=="號,表示匹配key/value,最后一個NAME使用單"="號,表示賦值key/value。所以上述文件的意思是:當/sys中的某設備各信息都能匹配上述某條規則,則賦值該設備名稱為eth0或eth1,/sys/class/net目錄下也由此名稱命名設備信息的目錄,ifcfg-*配置文件中的DEVICE的值必須和它們相同。
注意,網絡規則集文件會由內核檢測到設備時自動生成或寫入,因此清空它不會有任何影響。
克隆虛擬機時,總是會出現MAC地址沖突,這是因為規則集文件和ifcfg配置文件都被克隆了,而新克隆出來的機器中MAC地址又是新的,所以會生成新的規則集,但克隆過來的ifcfg配置文件中的DEVICE值和該規則對應不上,導致克隆主機的網絡將啟動不了。解決辦法是清空該文件,然后重啟克隆主機,這樣內核將新生成對應新MAC地址的規則集文件。當然,在克隆前清空模板主機的規則集文件,然后再克隆也是可以的。
值得一提的是,在CentOS 7中,systemd已經將udevd的功能整合在了一起,udev的規則集文件幾乎都放到了/usr/lib/udev/rules.d/目錄下,但卻更方便了,克隆CentOS 7主機時,根本就不會出現MAC地址沖突的可能。不過,顯式書寫在/etc/udev/rules.d/目錄下的規則集文件仍然是生效的。
13.2.4 /etc/services
該文件中記錄的是端口和服務的對應關系。
[root@xuexi ~]# grep '^ftp\|^ssh' /etc/services ftp-data 20/tcp ftp-data 20/udp ftp 21/tcp ftp 21/udp fsp fspd ssh 22/tcp # The Secure Shell (SSH) Protocol ssh 22/udp # The Secure Shell (SSH) Protocol ftp-data 20/sctp # FTP ftp 21/sctp # FTP ssh 22/sctp # SSH ftp-agent 574/tcp # FTP Software Agent System ftp-agent 574/udp # FTP Software Agent System sshell 614/tcp # SSLshell sshell 614/udp # SSLshell ftps-data 989/tcp # ftp protocol, data, over TLS/SSL ftps-data 989/udp # ftp protocol, data, over TLS/SSL ftps 990/tcp # ftp protocol, control, over TLS/SSL ftps 990/udp # ftp protocol, control, over TLS/SSL ssh-mgmt 17235/tcp # SSH Tectia Manager ssh-mgmt 17235/udp # SSH Tectia Manager
13.3 網絡接口配置和主機名
13.3.1 ifconfig
該命令雖然在man文檔中被說明已廢棄,但大眾顯然無法忘記它。ifconfig命令是一個接口配置命令,但更多的被用來顯示已激活的網絡接口信息。
ifconfig [ interface | -a ] ifconfig interface options 選項說明: interface:指定被操作的網絡接口名,如eth0 up :激活指定的網絡接口,如果在命令行中為網絡接口分配了IP地址,則默認會up down :將指定的接口設置為down狀態 [-]arp :啟用或禁用該接口上使用ARP協議,如"ifconfig eth0 -arp" mtu N :設置指定接口的最大傳輸單元(MTU) netmask :設置該接口的IP netmask,默認會采用A/B/C類地址的掩碼位數 address :要分配給該接口的IP地址
ifconfig示例:
[root@xuexi ~]# ifconfig eth0:1 192.168.100.20 netmask 255.255.255.0 up # 添加IP地址 [root@xuexi ~]# ifconfig eth0:1 192.168.100.20/24 up # 也可使用CIDR格式掩碼 [root@xuexi ~]# ifconfig eth1 up # 激活該網絡接口 [root@xuexi ~]# ifconfig eth1 down # 臨時down掉eth1接口 [root@xuexi ~]# ifconfig eth1 -arp # 抑制eth1上的arp [root@xuexi ~]# ifconfig eth1 arp # 啟用eth1上的arp
需要注意的是,ifconfig所有的配置都是應用於內核的,所以只會臨時生效,重啟網絡服務后會立即失效。
對於slave地址,即別名地址,若要永久生效,應該建立對應的別名接口配置文件,如/ets/sysconfig/network-scripts/ifcfg-eth0:0,然后在該文件中的DEVICE關鍵字上給定eth0:0名稱,該DEVICE項必須配置正確。
13.3.2 ifcfg
用法很簡單。
ifcfg DEV [[add|del [ADDR[/LEN]] | stop] add - add new address del - delete address stop - completely disable IP
例如:
[root@xuexi ~]# ifcfg eth1:0 add 192.168.100.20/24 # 添加一個地址 [root@xuexi ~]# ifcfg eth1:0 del 192.168.100.20 # 刪除一個地址 [root@xuexi ~]# ifcfg eth1 stop # 臨時禁用eth1
13.3.3 hostname命令
用於設置主機名,但也有幾個其它好用的功能。
hostname [-I] [-f] [-d] [-s] [hostname] 選項說明: -I :獲取該主機上所有非環回IP地址,該選項不依賴於主機名解析 -f,--fqdn :獲取fqdn -d,--domain:獲取fqdn的域名部分,等價於命令dnsdomainname -s,--short :獲取fqdn的主機名部分,嚴格地說是獲取第一個"."前的部分,例如"www.baidu.com"將獲取為"www"
使用-I選項可以直接獲取該主機上的所有IP地址,包括別名地址,這在某些時候太方便了。
[root@xuexi ~]# hostname -I 192.168.100.54 172.16.10.10
hostname修改的主機名為臨時生效,它修改的其實是/proc/sys/kernel/hostname文件。
[root@xuexi ~]# cat /proc/sys/kernel/hostname xuexi.longshuai.com
雖然在man文檔中說有個永久有效的選項(-b),但測試時卻毫無效果。要想永久生效,需要修改配置文件/etc/hostname(CentOS 7)或/etc/sysconfig/network(CentOS 6)。例如在CentOS 7上:
13.4 網關/路由
Linux上分為3種路由:
- 主機路由:直接指明到某台具體的主機怎么走,主機路由也就是所謂的靜態路由
- 網絡路由:指明某類網絡怎么走
- 默認路由:不走主機路由的和網絡路由的就走默認路由。操作系統上設置的默認路由一般也稱為網關。
若Linux上到某主機有多條路由可以選擇,這時候會挑選優先級高的路由。在Linux中,路由條目的優先級確定方式是先匹配掩碼位長度,再比較管理距離(比如metric)。也就是說,掩碼位長的路由條目優先級一定比掩碼位短的優先級高,所以主機路由的優先級最高,然后是直連網絡(即同網段)的路由(也算是網絡路由)次之,再是網絡路由,最后才是默認路由。若路由條目的掩碼長度相同,則比較節點之間的管理距離,管理距離短的生效。
例如下面的路由表中,若ping 192.168.5.20,則先比對192.168.100.78發現無法匹配,然后比對192.168.100.0,發現也無法匹配,接着再匹配192.168.0.0這條網絡路由條目,發現能匹配,所以選擇該路由條目。
[root@xuexi ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.100.2 0.0.0.0 UG 100 0 0 eth0 172.16.10.0 0.0.0.0 255.255.255.0 U 100 0 0 eth1 192.168.0.0 192.168.100.70 255.255.0.0 UG 0 0 0 eth0 192.168.100.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0 192.168.100.78 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
再比如下面的路由表。由於兩塊網卡eth0和eth1都是192.168.100.0/24網段地址,所以它們的路由條目在掩碼長度的匹配上是相同的,但是和eth0直連的網段主機通信時,肯定會選擇eth0這條路由條目,因為eth1和該網段主機隔了一個eth0,距離增加了1。
[root@xuexi ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.100.2 0.0.0.0 UG 100 0 0 eth0 192.168.100.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0 192.168.100.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1
13.4.1 route命令
route命令用於顯示和管理路由表。當使用了add或del選項時,route命令將設置路由條目,否則route命令將顯示路由表。
要顯示路由表信息,只需簡單的route -n即可,其中-n選項表示不解析主機名。
例如:
[root@xuexi ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.100.2 0.0.0.0 UG 100 0 0 eth0 172.16.10.0 0.0.0.0 255.255.255.0 U 100 0 0 eth1 192.168.0.0 192.168.100.70 255.255.0.0 UG 0 0 0 eth0 192.168.100.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0 192.168.100.78 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
對於CentOS 6以上的系統,請忽略Metric和Ref兩列,它們已經不被內核使用,只是有些路由軟件可能會用上。
對於Flags列,如果沒有安裝路由軟件,則只可能出現下面的3種值:
U (route is up)
H (target is a host)
G (use gateway,也即是設置了下一跳的路由條目)
若要管理路由表,則使用add或del選項。
route [add/del] [-host/-net/default] [address[/mask]] [netmask] [gw] [dev] 選項說明: add/del:增加或刪除路由條目 -net:增加或刪除的是一條網絡路由 -host:增加或刪除的是一條主機路由 default:增加或刪除的是一條默認路由 netmask:明確使用netmask關鍵字指定掩碼,要可以不使用該選項直接在地址上使用cidr格式的掩碼,即IP/MASK。 gw:指定下一跳的地址。要求下一跳地址必須是能到達的,且一般是和本網段直連的接口。 dev:強制將路由條目關聯到指定的接口上。一般內核會自動判斷路由條目應該關聯到哪個網絡接口。
例如:
(1).添加和刪除默認路由
shell> route add default gw 192.168.100.10 shell> route del default shell> route del default gw 192.168.100.10 # 若有多條默認路由,則再加上gw即可唯一刪除指定條目
因為默認路由的目的地是0.0.0.0,所以操作默認路由也可以使用0.0.0.0替代default關鍵字,但這樣就麻煩的多了。
(2).添加和刪除網絡路由
shell> route add -net 172.16.10.0/24 gw 192.168.100.70 shell> route add -net 172.16.10.0 netmask 255.255.255.0 gw 192.168.100.70
若實在不知道下一跳給誰,那么指定本機接口也是可以的。
shell> route add -net 172.16.10.0/24 dev eth0
刪除路由可以直接在增加路由的語句上將add改為del關鍵字。如
shell> route del -net 172.16.10.0/24 gw 192.168.100.70 shell> route del -net 172.16.10.0 netmask 255.255.255.0 gw 192.168.100.70 shell> route del -net 172.16.10.0/24 dev eth0
但大多數時候,可以偷懶,只要能唯一確定刪除的是哪條路由即可。如:
shell> route del -net 172.16.10.0/24
(3)添加和刪除主機路由
13.4.2 配置永久路由
根據接口創建路由配置文件/etc/syconfig/network-scripts/route-ethX,要從那個接口出去X就是幾。
路由配置文件的配置格式非常簡單,每一行一個路由條目,先是要到達的目標,然后是via關鍵字,最后是下一跳地址。要求下一跳必須能到達,且一般都和ethX同網段。
DEST via nexthop
例如eth0網卡的IP地址是192.168.10.123,要通過網卡eth0出去到達10.0.0.10,那么下一跳的地址要和eth0的地址在同網段,如192.168.10.222。
10.0.0.0 via 192.168.10.222
添加主機路由、默認路由、網段路由示例如下,其中dev是可以省略的,因為沒有任何用處,配置在哪個eth文件中就會從哪個接口出去。
#默認路由 default via 192.168.100.1 0.0.0.0/0 via 192.168.100.1 #網段路由 192.168.10.0/24 via 192.168.100.1 #主機路由 192.168.100.52/32 via 192.168.100.33 dev eth1
配置完后,重啟network服務即可立即生效。
route-ethX文件的還有另外一種永久路由的配置寫法,但上面的方法更簡單快捷,所以此處就不多說了。
配置永久路由時,需要注意幾點:
(1).route-ethX的對應網卡配置文件ifcfg-ethX必須存在,否則路由無效。(對於虛擬機,通常新添加的網卡都沒有對應的ifcfg-ethX文件,但ifconfig卻能找到該網卡)
(2).如果在文件中配置永久默認路由,則必須保證所有使用了DHCP服務的網卡配置文件ifcfg-ethX中的DEFROUTE指令設置為"no",表示DHCP不設置默認路由。
(3).如果在route-ethX文件中配置永久路由,且該網卡使用了DHCP服務分配地址,則必須保證該網卡的ifcfg-ethX文件中的PEERROUTES指令設置為"no",表示DHCP設置的路由允許被覆蓋。
13.5 arp和arping命令
維護或查看系統arp緩存,該命令已廢棄,使用ip neigh代替。
arp為地址解析協議,將給定的ipv4地址在網絡中查找其對應的MAC地址。
一般會使用arp協議獲取局域網內的主機MAC,所以局域網主機之間也互稱為網絡鄰居。
13.5.1 arp命令
arp命令語法:
arp -n -v -i # 查看arp緩存 arp -i -d hostname # 刪除arp緩存條目 選項說明: -n:不解析ip地址為名稱 -v:詳細信息 -i:指定操作的接口 -d:刪除一個arp條目
hostname:操作該主機的arp條目,除了刪除還有其他動作,如手動添加主機的arp條目,此處就不解釋該用法了
例如:
[root@xuexi ~]# arp -n Address HWtype HWaddress Flags Mask Iface 192.168.100.1 ether 00:50:56:c0:00:08 C eth1 192.168.100.254 ether 00:50:56:e7:e1:d4 C eth0 192.168.100.70 ether 00:0c:29:71:81:64 C eth0 192.168.100.1 ether 00:50:56:c0:00:08 C eth0 192.168.100.2 ether 00:50:56:e2:16:04 C eth1 192.168.100.254 ether 00:50:56:e7:e1:d4 C eth1 192.168.100.2 ether 00:50:56:e2:16:04 C eth0
其實查看的信息是/proc/net/arp文件中的內容。
[root@xuexi ~]# cat /proc/net/arp IP address HW type Flags HW address Mask Device 192.168.100.1 0x1 0x2 00:50:56:c0:00:08 * eth1 192.168.100.254 0x1 0x2 00:50:56:e7:e1:d4 * eth0 192.168.100.70 0x1 0x2 00:0c:29:71:81:64 * eth0 192.168.100.1 0x1 0x2 00:50:56:c0:00:08 * eth0 192.168.100.2 0x1 0x2 00:50:56:e2:16:04 * eth1 192.168.100.254 0x1 0x2 00:50:56:e7:e1:d4 * eth1 192.168.100.2 0x1 0x2 00:50:56:e2:16:04 * eth0
[root@xuexi ~]# arp -d 192.168.100.70 -i eth0 # 刪除arp緩存條目
arp命令一次只能刪除一條arp條目,要批量刪除或清空整個arp條目,使用ip neigh flush命令。如:
13.5.2 arping命令
arping用於發送arp請求報文,解析並獲取目標地址的MAC。默認將先發送廣播報文,收到回復后再發送單播報文,局域網內所有主機都能收到廣播報文,但只有目標主機才會回復自己的MAC地址。
注意:發送arp請求報文實際上是另類的ping,所以可以探測目標是否存活,也需要和目標通信,通信時目標主機上也會緩存本主機(即源地址)的arp條目。
語法:
arping [-fqbDU] [-c count] [-w timeout] [-I device] [-s source] destination -f : 收到第一個reply就立即退出 -q : 安靜模式,什么都不輸出 -b : 只發送廣播,不發送單播 -D : 地址沖突檢測 -U : 主動更新鄰居的arp緩存(Unsolicited ARP mode) -c count : 發送多少個arp請求包后退出 -w timeout : 等待reply的超時時間 -I device : 使用哪個接口發送請求包。發送arp請求包接口的MAC地址將緩存在目標主機上 -s source : 指定arp請求報文中源地址,若發送的接口和源地址不同,則目標主機將緩存該地址和接口的MAC地址,而非該源地址所在接口的MAC地址 destination : 向誰發送arp請求報文,即要獲取該IP或主機名的MAC地址
例如:
(1).請求解析192.168.100.70主機的MAC地址
[root@xuexi ~]# arping -f 192.168.100.70
這將會發送廣播報文,直到收到192.168.100.70的回復才退出。
同時,192.168.100.70也會緩存本機的IP和MAC對應條目,由於此處沒有指定請求報文的發送接口和源地址,所以發送報文時是根據路由表來選擇接口和對應該接口地址的。
(2).指定發送一個請求報文給192.168.100.70就退出,發送報文的接口為eth1,並指定請求報文中的源地址為本機eth0接口上的地址192.168.100.54
[root@xuexi ~]# arping -c 1 -I eth1 -s 192.168.100.54 192.168.100.70
發送這樣的arp請求包,將會使得目標主機192.168.100.70緩存本機的arp條目為"192.168.100.54 MAC_eth1",但實際上,192.168.100.54所在接口的MAC地址為MAC_eth0。
arping命令僅能實現這種簡單的arp欺騙,更多的arp欺騙方法可以使用專門的工具。
(3).探測對方主機是否存活
例如發送4個探測報文,有回復就說明對方存活
[root@xuexi ~]# arping -c 4 -I eth0 192.168.100.2 ARPING 192.168.100.2 from 192.168.100.54 eth0 Unicast reply from 192.168.100.2 [00:50:56:E2:16:04] 0.593ms Unicast reply from 192.168.100.2 [00:50:56:E2:16:04] 0.930ms Unicast reply from 192.168.100.2 [00:50:56:E2:16:04] 0.868ms Unicast reply from 192.168.100.2 [00:50:56:E2:16:04] 0.844ms Sent 4 probes (1 broadcast(s)) Received 4 response(s)
可見發送了4個探測報文,其中第一個報文是廣播報文,並且收到了4個回復。
13.6 ip命令
這是一個極其強大的命令,前面所有的網絡信息顯示和管理的命令,都可以由ip命令來替代完成。它是一個嚴格模式化的命令。
13.6.1 獲取ip命令的幫助
先簡單說明下ip命令的基礎和獲取幫助的方法。
[root@xuexi ~]# ip -h Usage: ip [ OPTIONS ] OBJECT { COMMAND | help } ip [ -force ] -batch filename where OBJECT := { link | addr | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | maddr | mroute | mrule | monitor | xfrm | netns | l2tp | tcp_metrics | token } OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] | -h[uman-readable] | -iec | -f[amily] { inet | inet6 | ipx | dnet | bridge | link } | -4 | -6 | -I | -D | -B | -0 | -l[oops] { maximum-addr-flush-attempts } | -o[neline] | -t[imestamp] | -b[atch] [filename] | -rc[vbuf] [size] | -n[etns] name | -a[ll] }
可見命令非常復雜,有很多options,還有很多object,每個Object又對應不同的命令。但其實能用到的就幾個object:addr/route/neigh/link。
使用ip object help可以獲取到該object的語法幫助。例如:
[root@xuexi ~]# ip addr help
在ip命令行下,任何object都可以寫其全名,也可以寫其縮寫名,例如address這個object,可以簡寫為addr,也可以簡寫為一個字母a。
[root@xuexi ~]# ip a help # 等價於ip address help和ip addr help
盡管還有一個a開頭的object為addrlabel。這時因為ip會從上述語法給出的object順序從前向后匹配,例如"ip m"將匹配到"ip maddr",如果想匹配別的,如addrlabel,則寫長一點即可"ip addrl"。
對於CentOS 6,man ip時會輸出整個ip的幫助文檔,包括每個object的命令和說明。在CentOS 7中,則要對每個object獨立進行man,例如addr這個object。
[root@xuexi ~]# man ip-address
以下是所有Object的man列表。
[root@xuexi ~]# rpm -ql iproute | grep "man8/ip-" /usr/share/man/man8/ip-address.8.gz /usr/share/man/man8/ip-addrlabel.8.gz /usr/share/man/man8/ip-l2tp.8.gz /usr/share/man/man8/ip-link.8.gz /usr/share/man/man8/ip-maddress.8.gz /usr/share/man/man8/ip-monitor.8.gz /usr/share/man/man8/ip-mroute.8.gz /usr/share/man/man8/ip-neighbour.8.gz /usr/share/man/man8/ip-netconf.8.gz /usr/share/man/man8/ip-netns.8.gz /usr/share/man/man8/ip-ntable.8.gz /usr/share/man/man8/ip-route.8.gz /usr/share/man/man8/ip-rule.8.gz /usr/share/man/man8/ip-tcp_metrics.8.gz /usr/share/man/man8/ip-token.8.gz /usr/share/man/man8/ip-tunnel.8.gz /usr/share/man/man8/ip-xfrm.8.gz
13.6.2 ip addr
ip addr用於管理網絡設備上的ip地址,也可以查看ip地址的屬性信息。在老版本的Linux中,一塊網卡上設置多個IP,這些IP稱為別名IP,但是從CentOS 6開始,這些IP稱為secondary IP或slave IP,因為這些IP自身也可以附帶屬性。
(1).ip addr add/del
ip address { add | del } IFADDR dev STRING IFADDR := PREFIX [ broadcast ADDR ] [ anycast ADDR ] [ label STRING ] 以add為例: dev NAME:指定要設置IP地址的網卡 local ADDRESS (default):接口的IP地址。IP地址的格式依賴於是ipv4還是ipv6。對於ipv4而言,給定地址,可能還需要給定cidr的掩碼位長度 broadcast ADDRESS:接口的廣播地址 label NAME:為該接口的IP地址設置label名,label名稱必須以網絡接口名開頭后接冒號,如eth0:X del和add的參數相同,且dev是必須要給定的,其余的參數可選,因為del的時候是通配del,如果刪除時有多個滿足條件的條目,則刪除第一個條目。
例如:
[root@xuexi ~]# ip addr add 192.168.100.45 dev eth0 [root@xuexi ~]# ip addr add 192.168.100.35/24 dev eth1
此方式添加的地址不會在ifconfg命令中顯示,ifconfg能捕捉到的是別名,所以可以為地址加上label,以讓secondary被ifconfig查看到。例如:
[root@xuexi ~]# ip addr add 192.168.100.45 dev eth0 label eth0:0
要刪除ip,則簡單的多,但必須指定dev,且最好也指定cidr的掩碼長度。
[root@xuexi ~]# ip addr del 192.168.100.45 dev eth0 [root@xuexi ~]# ip addr del 192.168.100.35/24 dev eth1
(2).ip addr show
雖然也有幾個選項,但是感覺沒什么用,直接ip addr show就夠了。因為ip命令可以縮寫,所以可以寫為
[root@xuexi ~]# ip a show [root@xuexi ~]# ip a s [root@xuexi ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:71:81:64 brd ff:ff:ff:ff:ff:ff inet 192.168.100.70/24 brd 192.168.100.255 scope global eth0 inet6 fe80::20c:29ff:fe71:8164/64 scope link valid_lft forever preferred_lft forever
(3).ip addr flush
用於批量刪除地址,該命令其實非常危險,一個不小心就會誤傷無辜,所幸的是flush的時候不給定任何參數或者沒有任何條目可以匹配上的時候將不執行flush動作,總之該命令要小心使用。同樣也必須給定dev參數。
例如刪除eth1上所有地址。
[root@xuexi ~]# ip a flush dev eth1
刪除eth1上所有的secondary地址。
13.6.3 ip route
該命令維護和查看內核中的路由表。
(1).ip route add/del/change/append/replace
語法格式為:
ip route { add | del | change | append | replace } dest[/cidr_mask] [ via ADDRESS ] [ dev STRING ]
其中dest為目標地址,可以是主機地址、網段地址,一般在地址后都會帶上cidr格式的掩碼長度,不帶時默認為32位長度。如果dest為"0/0"或者寫為"default",則表示默認路由。
例如添加/修改/替換普通路由:
[root@xuexi ~]# ip route add/change/replace 172.16.10.0/24 via 192.168.10.20
添加/修改/替換默認路由:
[root@xuexi ~]# ip route add/change/replace default via 192.168.10.20 [root@xuexi ~]# ip route add/change/replace 0/0 via 192.168.100.2
刪除某路由:
[root@xuexi ~]# ip route del 172.16.10.0/24 [root@xuexi ~]# ip route del default # 刪除默認路由
(2).ip route show
列出路由表。
語法格式為:
ip route show [to [ root | match | exact ] ADDR_pattern ] [ via ADDR ]
其中to關鍵字是默認關鍵字,用來匹配路由的目標地址。其后可以跟上修飾符root/match/exact,exact為默認修飾符,表示精確匹配掩碼位長度,root修飾符表示匹配的掩碼位長度大於或等於ADDR_pattern給定的掩碼位長度,match修飾符匹配短於或等於ADDR_pattern掩碼位長度。例如"to match 16.0/16"將能匹配到"16.0/16"、"16/8"和"0/0",但卻無法匹配"16.1/16"和"16.0/24"以及"16.0.1/24",而"to root 16.0/16"將能匹配"16.0/24"和"16.0.1/24"。
via是根據下一跳的方式來列出路由條目。
例如:
[root@xuexi ~]# ip route show to match 192.168/24 | column -t default via 192.168.100.2 dev eth0 proto static metric 100
其實無需那么花哨,簡簡單單的"ip r"多方便。
(3).ip route flush
批量刪除路由表條目。參數和ip route show的參數一樣。
例如刪除由eth1出去的路由條目。
[root@xuexi ~]# ip route flush eth1
刪除下一跳為192.168.100.70的路由條目。
[root@xuexi ~]# ip r flush via 192.168.100.70
刪除目標為192.168.0.0/16網段的路由
[root@xuexi ~]# ip route flush 192.168/16
(4).ip route save/restore
用於保存當前的路由表以及恢復路由表。保存路由表時,路由表將以二進制裸數據的格式輸出,也就是看不懂的二進制文件。恢復路由表時,要求設備的設置和保存路由表時是一樣的,恢復時已存在於路由表中的路由條目將被忽略。
例如當前路由表信息如下:
[root@xuexi ~]# ip r default via 192.168.100.2 dev eth0 proto static metric 100 192.168.10.0/24 dev eth0 proto kernel scope link src 192.168.10.20 192.168.10.0/24 dev eth0 proto kernel scope link src 192.168.10.20 metric 100 192.168.100.0/24 dev eth0 proto kernel scope link src 192.168.100.54 metric 100 192.168.100.0/24 dev eth1 proto kernel scope link src 192.168.100.74 metric 101
保存當前路由表。
[root@xuexi ~]# ip route save > /tmp/route.txt
刪除幾條路由表。
[root@xuexi ~]# ip route flush dev eth0 [root@xuexi ~]# ip r 192.168.100.0/24 dev eth1 proto kernel scope link src 192.168.100.74 metric 101
恢復路由表。
13.6.4 ip link
link表示link layer的意思,即鏈路層。該命令用於管理和查看網絡接口,甚至可以添加虛擬網絡接口,將網絡接口分組進行管理。
(1).ip link set
ip link set DEVICE { up | down | arp { on | off } | name NEWNAME | address LLADDR }
選項說明:
dev DEVICE:指定要操作的設備名
up and down:啟動或停用該設備
arp on or arp off:啟用或禁用該設備的arp協議
name NAME:修改指定設備的名稱,建議不要在該接口處於運行狀態或已分配IP地址時重命名
address LLADDRESS:設置指定接口的MAC地址
例如,禁用eth1網卡。
[root@xuexi ~]# ip link set eth1 down
其實等價於:
[root@xuexi ~]# ifconfig eth1 down
修改網卡eth1的MAC地址。
[root@xuexi ~]# ip link set eth1 address 00:0c:29:f3:33:77
(2).ip link show
語法格式:
ip [ -s | -h ] link show [dev DEV] 選項說明: -s:將顯示各網絡接口上的流量統計信息 -h:以人類可讀的方式顯式,即單位轉換。注:"-h"在CentOS 7上才支持。
例如:
[root@xuexi ~]# ip -s -h link show dev eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000 link/ether 00:0c:29:f7:43:77 brd ff:ff:ff:ff:ff:ff RX: bytes packets errors dropped overrun mcast 13.7M 20.0k 0 0 0 0 TX: bytes packets errors dropped carrier collsns 1.59M 9.97k 0 0 0 0