第13章 Linux的網路管理

来源:http://www.cnblogs.com/f-ck-need-u/archive/2017/06/24/7074594.html
-Advertisement-
Play Games

本文目錄: 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.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 /etc/services

13.3 網路介面配置和主機名

13.3.1 ifconfig

13.3.2 ifcfg

13.3.3 hostname命令

13.4 網關/路由

13.4.1 route命令

13.4.2 配置永久路由

13.5 arp和arping命令

13.5.1 arp命令

13.5.2 arping命令

13.6 ip命令

13.6.1 獲取ip命令的幫助

13.6.2 ip addr

13.6.3 ip route

13.6.4 ip link


 

在解釋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.
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文轉自:[AVAudioSession(4):響應音頻中斷事件 | www.samirchen.com][2] 本文內容主要來源於 [Responding to Interruptions][3]。 當一個音頻中斷到來時,會關閉你的 Audio Session,這通常就意味著停止或暫停你的音頻播放 ...
  • 本文轉自:[AVAudioSession(3):定製 Audio Session 的 Category | www.samirchen.com][2] 本文內容主要來源於 [Working with Categories][3]。 對於 Audio Session 來說,與之對應的 Category ...
  • 平時開發系統時偶爾會遇到數據超長導致往資料庫中保存時出錯。 使用下邊的腳本可以方便的找出超長的欄位。 1.通過正式表創建臨時表,修改臨時表中varchar、nvarchar的長度為max 2.數據手動寫入臨時表後,查找超長欄位 3.新建測試表 表截圖如下: 修改表名,運行 1.通過正式表創建臨時表, ...
  • 最近開發中遇到的一個MySQL主從延遲的坑,記錄並總結,避免再次犯同樣的錯誤。 ...
  • 大多數用戶在對於磁碟進行分區的時候都是習慣性的不給系統盤預留很大空間,其實這並不是一個好習慣。因為系統分區並不像我們想象的那樣會僅僅安裝一個操作系統,系統分區多數還是會承載操作系統主要應用軟體安裝任務。那麼當磁碟空間爆滿後,MySQL會發生什麼事呢?又應該怎麼應對? 會發生什麼事 當磁碟空間寫滿了之 ...
  • 連接資料庫的八大步驟 Step1:鏈接資料庫 mysqli_connect() 參數: ①主機地址 ②mysql用戶名 ③mysql密碼 ④選擇連接的資料庫 ⑤埠號 返回:如果連接成功,返回資源類型的標誌符號;如果連接失敗,返回false。 如果我們與mysql建立的連接不只一條,那麼以後操作數據 ...
  • redis對象 redis中有五種常用對象 我們所說的對象的類型大多是值的類型,鍵的類型大多是字元串對象,值得類型大概有以下幾種,但是無論哪種都是基於redisObject實現的 redisObject的結構如下 type的可選值有五種.分別是 REDIS_STRING, REDIS_LIST, R ...
  • 情景linux shell如何實現多線程? 情景 shell腳本的執行效率雖高,但當任務量巨大時仍然需要較長的時間,尤其是需要執行一大批的命令時。因為預設情況下,shell腳本中的命令是串列執行的。如果這些命令相互之間是獨立的,則可以使用“併發”的方式執行這些命令,這樣可以更好地 利用系統資源,提升 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...