本文目錄: 13.1 Linux數據包轉發功能 13.2 和網路相關的幾個文件說明 13.2.1 網卡配置文件ifcfg-* 13.2.2 DNS配置文件/etc/resolve.conf 13.2.3 /etc/udev/rules.d/70-persistent-net.rules 13.2.4 ...
本文目錄:
13.2.2 DNS配置文件/etc/resolve.conf
13.2.3 /etc/udev/rules.d/70-persistent-net.rules
在解釋Linux網路管理相關的內容時,我覺得有必要先解釋數據包轉發功能以及因此涉及到的路由決策。然後再介紹網路配置命令和相關文件。
13.1 Linux數據包轉發功能
如果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
另外,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出去,除非路由明確設置了不走eth1。
下圖是Linux主機通信機制。假設該主機有兩塊網卡eth0和eth1,並且它們屬於不同網段。
根據上圖,假如網段1的主機ping ip_addr1或ping ip_addr2,數據包從eth0進入,內核分析該數據包,發現數據包的最終目標是本機上的ip地址,內核將進行路由決策,一般來說,這類數據包的路由條目都會指定從直連介面即eth0流出。即上圖的黑色路線。
儘管網段1主機能ping通ip_addr2,但數據包並沒有交給eth1。
假如網段1主機ping網段2主機,在ping的請求數據包從eth0流入Linux主機時,內核將分析該數據包,發現數據包目標是網段2地址,根據路由表,這類數據包一般都會從直連介面eth1出去,所以eth0的數據包將要轉給eth1,但是未開啟轉發功能,數據包到不了eth1,所以被丟棄。假如開啟了數據包轉發功能,上面的藍色虛線和紅色虛線將是連通的,數據包轉發到達eth1介面,然後出去到網段2的主機上。
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/resolve.conf, # 若開啟了DHCP,則預設為yes,所以dhcp的dns也會覆蓋/etc/resolve.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/resolve.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/resolve.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的規則集,能匹配上的則做對應的操作。對於網卡來說,它的的規則集文件預設為/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的規則集文件已經少見了,但卻更方便了,克隆CentOS 7主機時,根本就不會出現MAC地址衝突的可能,因為一切規則集都由內核生成在記憶體中。不過,顯式書寫的規則集文件仍然是生效的。
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上:
[root@xuexi ~]# echo "ma.longshuai.com" >/etc/hostname
13.4 網關/路由
Linux上分為3種路由:
- 主機路由:直接指明到某台具體的主機怎麼走,主機路由也就是所謂的靜態路由
- 網路路由:指明某類網路怎麼走
- 預設路由:不走主機路由的和網路路由的就走預設路由。操作系統上設置的預設路由一般也稱為網關。
若Linux上到某主機有多條路由可以選擇,這時候會挑選優先順序高的路由。在Linux中,路由條目的優先順序確定方式是先匹配掩碼位長度,再比較管理距離。也就是說,掩碼位長的路由條目優先順序一定比掩碼位短的優先順序高,所以主機路由的優先順序最高,然後是直連網路(即同網段)的路由(也算是網路路由)次之,再是網路路由,最後才是預設路由。若路由條目的掩碼長度相同,則比較節點之間的管理距離,管理距離短的生效。
例如下麵的路由表中,若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)添加和刪除主機路由
shell> route add -host 172.16.10.55 gw 192.168.10.20 shell> route del -host 172.16.100.55
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
route-ethX文件的還有另外一種永久路由的配置寫法,但上面的方法更簡單快捷,所以此處就不多說了。
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命令。如:
[root@xuexi ~]# ip neigh flush all # 清空所有
[root@xuexi ~]# ip neigh flush dev eth0 # 刪除eth0上緩存的arp條目
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.