1 網路相關的幾個文件說明 1.1 網卡配置文件ifcfg 在/etc/sysconfig/network scripts/目錄下有不少文件,絕大部分都是腳本類的文件,但有一類 ifcfg開頭 的文件為網卡配置文件(interface config),所有ifcfg開頭的文件在啟動網路服務的時候都會 ...
1 網路相關的幾個文件說明
1.1 網卡配置文件ifcfg-*
在/etc/sysconfig/network-scripts/目錄下有不少文件,絕大部分都是腳本類的文件,但有一類ifcfg開頭的文件為網卡配置文件(interface config),所有ifcfg開頭的文件在啟動網路服務的時候都會被載入讀取,但具體的文件名ifcfg-XX的XX可以隨意命名。
以下是一個(CentOS 7上)ifcfg-XX文件的內容示例。
[root@duiyi ~]# 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
1.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@duiyi ~]# 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@duiyi ~]# 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@duiyi ~]# 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@duiyi ~]# 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@duiyi ~]# 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部分不能共存,如果共存了,則後出現的行有效。
1.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@duiyi ~]# 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/目錄下的規則集文件仍然是生效的。
1.4 /etc/services
該文件中記錄的是埠和服務的對應關係。
[root@duiyi ~]# 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
2 網路介面配置和主機名
2.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@duiyi ~]# ifconfig eth0:1 192.168.100.20 netmask 255.255.255.0 up # 添加IP地址
[root@duiyi ~]# ifconfig eth0:1 192.168.100.20/24 up # 也可使用CIDR格式掩碼
[root@duiyi ~]# ifconfig eth1 up # 激活該網路介面
[root@duiyi ~]# ifconfig eth1 down # 臨時down掉eth1介面
[root@duiyi ~]# ifconfig eth1 -arp # 抑制eth1上的arp
[root@duiyi ~]# ifconfig eth1 arp # 啟用eth1上的arp
需要註意的是,ifconfig所有的配置都是應用於內核的,所以只會臨時生效,重啟網路服務後會立即失效。
對於slave地址,即別名地址,若要永久生效,應該建立對應的別名介面配置文件,如/ets/sysconfig/network-scripts/ifcfg-eth0:0,然後在該文件中的DEVICE關鍵字上給定eth0:0名稱,該DEVICE項必須配置正確。
2.2 ifcfg
用法很簡單。
ifcfg DEV [[add|del [ADDR[/LEN]] | stop]
add - add new address
del - delete address
stop - completely disable IP
例如:
[root@duiyi ~]# ifcfg eth1:0 add 192.168.100.20/24 # 添加一個地址
[root@duiyi ~]# ifcfg eth1:0 del 192.168.100.20 # 刪除一個地址
[root@duiyi ~]# ifcfg eth1 stop # 臨時禁用eth1
2.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@duiyi ~]# hostname -I
192.168.100.54 172.16.10.10
hostname修改的主機名為臨時生效,它修改的其實是/proc/sys/kernel/hostname文件。
[root@duiyi ~]# cat /proc/sys/kernel/hostname
duiyi.longshuai.com
雖然在man文檔中說有個永久有效的選項(-b),但測試時卻毫無效果。要想永久生效,需要修改配置文件/etc/hostname(CentOS 7)或/etc/sysconfig/network(CentOS 6)。例如在CentOS 7上:
[root@duiyi ~]# echo "ma.longshuai.com" >/etc/hostname
3 網關/路由
Linux上分為3種路由:
- 主機路由:直接指明到某台具體的主機怎麼走,主機路由也就是所謂的靜態路由
- 網路路由:指明某類網路怎麼走
- 預設路由:不走主機路由的和網路路由的就走預設路由。操作系統上設置的預設路由一般也稱為網關。
若Linux上到某主機有多條路由可以選擇,這時候會挑選優先順序高的路由。在Linux中,路由條目的優先順序確定方式是先匹配掩碼位長度,再比較管理距離(比如metric)。也就是說,掩碼位長的路由條目優先順序一定比掩碼位短的優先順序高,所以主機路由的優先順序最高,然後是直連網路(即同網段)的路由(也算是網路路由)次之,再是網路路由,最後才是預設路由。若路由條目的掩碼長度相同,則比較節點之間的管理距離,管理距離短的生效。
例如下麵的路由表中,若ping 192.168.5.20,則先比對192.168.100.78發現無法匹配,然後比對192.168.100.0,發現也無法匹配,接著再匹配192.168.0.0這條網路路由條目,發現能匹配,所以選擇該路由條目。
[root@duiyi ~]# 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@duiyi ~]# 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
3.1 route命令
route命令用於顯示和管理路由表。當使用了add或del選項時,route命令將設置路由條目,否則route命令將顯示路由表。
要顯示路由表信息,只需簡單的route -n即可,其中-n選項表示不解析主機名。
例如:
[root@duiyi ~]# 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
3.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設置的路由允許被覆蓋。
4 arp和arping命令
維護或查看系統arp緩存,該命令已廢棄,使用ip neigh代替。
arp為地址解析協議,將給定的ipv4地址在網路中查找其對應的MAC地址。
一般會使用arp協議獲取區域網內的主機MAC,所以區域網主機之間也互稱為網路鄰居。
4.1 arp命令
arp命令語法:
arp -n -v -i # 查看arp緩存
arp -i -d hostname # 刪除arp緩存條目
選項說明:
-n:不解析ip地址為名稱
-v:詳細信息
-i:指定操作的介面
-d:刪除一個arp條目
hostname:操作該主機的arp條目,除了刪除還有其他動作,如手動添加主機的arp條目,此處就不解釋該用法了
例如:
[root@duiyi ~]# 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@duiyi ~]# 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@duiyi ~]# arp -d 192.168.100.70 -i eth0 # 刪除arp緩存條目
arp命令一次只能刪除一條arp條目,要批量刪除或清空整個arp條目,使用ip neigh flush命令。如:
[root@duiyi ~]# ip neigh flush all # 清空所有
[root@duiyi ~]# ip neigh flush dev eth0 # 刪除eth0上緩存的arp條目
4.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@duiyi ~]# 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@duiyi ~]# 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@duiyi ~]# 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個回覆。
5 ip命令
這是一個極其強大的命令,前面所有的網路信息顯示和管理的命令,都可以由ip命令來替代完成。它是一個嚴格模式化的命令。
5.1 獲取ip命令的幫助
先簡單說明下ip命令的基礎和獲取幫助的方法。
[root@duiyi ~]# 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@duiyi ~]# ip addr help
在ip命令行下,任何object都可以寫其全名,也可以寫其縮寫名,例如address這個object,可以簡寫為addr,也可以簡寫為一個字母a。
[root@duiyi ~]# 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@duiyi ~]# man ip-address
以下是所有Object的man列表。
[root@duiyi ~]# 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
5.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@duiyi ~]``# ip addr add 192.168.100.45 dev eth0``[root@duiyi ~]``# ip addr add 192.168.100.35/24 dev eth1`
此方式添加的地址不會在ifconfg命令中顯示,ifconfg能捕捉到的是別名,所以可以為地址加上label,以讓secondary被ifconfig查看到。例如:
[root@duiyi ~]# ip addr add 192.168.100.45 dev eth0 label eth0:0
要刪除ip,則簡單的多,但必須指定dev,且最好也指定cidr的掩碼長度。
[root@duiyi ~]# ip addr del 192.168.100.45 dev eth0
[root@duiyi ~]# ip addr del 192.168.100.35/24 dev eth1
(2).ip addr show
雖然也有幾個選項,但是感覺沒什麼用,直接ip addr show就夠了。因為ip命令可以縮寫,所以可以寫為
[root@duiyi ~]# ip a show
[root@duiyi ~]# ip a s
[root@duiyi ~]# 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@duiyi ~]# ip a flush dev eth1
刪除eth1上所有的secondary地址。
[root@xuexi ~]# ip a f secondary dev eth1
5.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
恢復路由表。
[root@xuexi ~]# ip route restore < /tmp/route.txt
5.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