前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >100个 Linux 命令(10)-管理网络

100个 Linux 命令(10)-管理网络

原创
作者头像
懒人的小脑
修改2019-01-18 15:29:29
2.8K0
修改2019-01-18 15:29:29
举报

这是100个 Linux 命令的第10篇文章,主要介绍如何在 Linux 主机中管理网络,包括网络接口配置、主机名配置等。

命令篇

77.ifconfig

`ifconfig`是一个接口配置命令,man 文档中被说明已废弃,目前更多用来显示已被激活的网络接口信息。

一般用法:ifconfig [ [ interface ] [ options ] ]

选项

说明

interface

指定被操作的网络接口

up

激活指定的网络接口,如果在命令行中为网络接口分配了IP地址,则默认up

down

将指定接口设置为 down 状态

[-] arp

启用或禁用该接口上使用 ARP 协议

mtu N

设置指定接口的最大传输单元

netmask

设置指定接口的 IP netmask,默认会采用A/B/C类地址的掩码位数

address

设置指定接口的 IP 地址

示例:

代码语言:javascript
复制
ifconfig eth0:1 192.168.100.20 netmask 255.255.255.0 up  # 添加IP地址
ifconfig eth0:1 192.168.100.20/24 up                     # 也可使用CIDR格式掩码
ifconfig eth1 up       # 激活该网络接口
ifconfig eth1 down     # 临时down掉eth1接口
ifconfig eth1 -arp     # 抑制eth1上的arp
ifconfig eth1 arp      # 启用eth1上的arp

需要注意的是,ifconfig所有的配置都是应用于内核的,所以只会临时生效,重启网络服务后会立即失效。

对于slave地址,即别名地址,若要永久生效,应该建立对应的别名接口配置文件,如/ets/sysconfig/network-scripts/ifcfg-eth0:0,然后在该文件中的DEVICE关键字上给定eth0:0名称,该DEVICE项必须配置正确。

78.ifcfg

代码语言:javascript
复制
ifcfg DEV [[add|del [ADDR[/LEN]] | stop]
       add - add new address
       del - delete address
       stop - completely disable IP
       
ifcfg eth1:0 add 192.168.100.20/24   # 添加一个地址
ifcfg eth1:0 del 192.168.100.20      # 删除一个地址
ifcfg eth1 stop      # 临时禁用eth1

79.hostname

用于设置主机名

一般用法:hostname [-I] [-f] [-d] [-s] [hostname]

选项

说明

-I(大写 i)

获取该主机上所有非环回 IP 地址,该选项不依赖于主机名解析

-f,--fqdn

获取 fqdn

-d,--domain

获取 fqdn 的域名部分,等价于命令 dnsdomainname

-s,--short

获取 fqdn 的主机名部分,严格地说是获取第一个"."前的部分,例如"www.baidu.com"将获取为"www"

使用-I选项可以直接获取该主机上的所有IP地址,包括别名地址,这在某些时候太方便了。

hostname修改的主机名为临时生效,它修改的其实是/proc/sys/kernel/hostname文件。

永久生效:需要修改配置文件

  • /etc/hostname (CentOS 7)
  • /etc/sysconfig/network (CentOS 6)

例如在CentOS 7上:

代码语言:javascript
复制
echo "www1.mansonx.com" > /etc/hostname

80.route

用于显示和管理路由表,当使用了 add 或 del 选项时,route 命令将设置路由条目,否则route 命令将显示路由表

对于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/dell

添加或删除路由条目

-net

增加或删除的是一条网络路由

-host

增加或删除的是一条主机路由

-default

增加或删除的是一条默认路由

netmask

明确使用 netmask 关键字指定掩码,也可以不使用该选项而是直接在地址上使用cidr格式的掩码,即IP/MASK。

gw

指定下一跳的地址,要求下一跳地址必须可达,且一般是和本网段直连的接口

dev

强制将路由条目关联到指定接口上。一般内核会自动判断路由条目该关联到哪个网络接口

示例:

1.添加和删除默认路由

代码语言:javascript
复制
route add default gw 192.168.1.253
route del default
若有多条默认路由,使用 gw 指定即可唯一删除指定条目
route del default gw 192.168.1.253

2.添加和删除网络路由

代码语言:javascript
复制
route add -net 172.16.10.0/24 gw 192.168.100.70
route add -net 172.16.10.0 netmask 255.255.255.0 gw 192.168.100.70

如果不知道下一跳给谁,那么指定本机接口也可以
route add -net 17.16.10.0/24 dev eth0

删除路由可以直接在增加路由的语句上将add改为del关键字
route del -net 172.16.10.0/24 gw 192.168.100.70
大多数时候,只要能唯一确定删除的是哪条路由即可
route del -net 172.16.10.0/24

3.添加和删除主机路由

代码语言:javascript
复制
route add -host 172.16.10.55 gw 192.168.10.20
route del -host 172.16.100.55

81.arp

维护或查看系统arp缓存,该命令已废弃,使用`ip neigh`代替。

arp为地址解析协议,将给定的ipv4地址在网络中查找其对应的MAC地址。

一般会使用arp协议获取局域网内的主机MAC,所以局域网主机之间也互称为网络邻居。

查看 arp 缓存:`arp -n -v -i`

删除 apr 缓存条目:`arp -i -d hostname`

hostname 表示操作该主机的 arp 条目

选项

说明

-n

不解析 ip 地址为名称

-v

详细信息

-i

指定操作的接口

-d

删除一个 arp 条目

使用 arp -n 查看的 arp 表实际上是查看的/proc/net/arp 文件中的内容。

arp 命令一次只能删除一条 arp 条目,要批量删除或清空整个 arp 条目,使用 ip neigh flush 命令

代码语言:javascript
复制
arp -d 192.168.100.70 -i eth0 
ip neigh flush all            # 清空所有
ip neigh flush dev eth0       # 删除eth0上缓存的arp条目

82.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 地址

代码语言:javascript
复制
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

代码语言:javascript
复制
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个探测报文,有回复就说明对方存活

代码语言:javascript
复制
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个回复。

83.ip

ip 命令是新一代也是目前应该使用的管理网络的命令,它是一个严格模式化的命令。

获取帮助

常用的主要有:addr、route、neigh、link

使用 ip object help 获取指定 object 的帮助

代码语言:javascript
复制
ip addr help

在ip命令行下,任何object都可以写其全名,也可以写其缩写名,例如address这个object,可以简写为addr,也可以简写为一个字母a

尽管还有一个a开头的object为addrlabel。这时因为ip会从上述语法给出的object顺序从前向后匹配,例如"ip m"将匹配到"ip maddr",如果想匹配别的,如addrlabel,则写长一点即可"ip addrl"。

对于CentOS 6,man ip时会输出整个ip的帮助文档,包括每个object的命令和说明。在CentOS 7中,则要对每个object独立进行man,例如addr这个object。

代码语言:javascript
复制
man ip-address

以下是所有Object的man列表。

代码语言:javascript
复制
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

ip addr

ip addr用于管理网络设备上的ip地址,也可以查看ip地址的属性信息。在老版本的Linux中,一块网卡上设置多个IP,这些IP称为别名IP,但是从CentOS 6开始,这些IP称为secondary IP或slave IP,因为这些IP自身也可以附带属性。

一般用法:ip address { add | del } IFADDR dev STRING IFADDR := PREFIX [ broadcast ADDR ] [ anycast ADDR ] [ label STRING ]

以 add 为例:

  • dev NAME:指定要设置IP 地址的网卡
  • local ADDRESS:接口的IP地址。IP地址的格式依赖于是ipv4还是ipv6。对于ipv4而言,给定地址,可能还需要给定cidr的掩码位长度
  • broadcast ADDRESS:接口的广播地址
  • label NAME:为该接口的IP地址设置label名,label名称必须以网络接口名开头后接冒号,如eth0:X

del和add的参数相同,且dev是必须要给定的,其余的参数可选,因为del的时候是通配del,如果删除时有多个满足条件的条目,则删除第一个条目。

代码语言:javascript
复制
ip addr add 192.168.100.45 dev eth0
ip addr add 192.168.100.35/24 dev eth1

此方式添加的地址不会在ifconfg命令中显示,ifconfg能捕捉到的是别名,所以可以为地址加上label,以让secondary被ifconfig查看到。例如:

代码语言:javascript
复制
ip addr add 192.168.100.45 dev eth0 label eth0:0

要删除ip,则简单的多,但必须指定dev,且最好也指定cidr的掩码长度。

代码语言:javascript
复制
ip addr del 192.168.100.45 dev eth0
ip addr del 192.168.100.35/24 dev eth1

ip addr show,可以缩写为 ip a s

代码语言:javascript
复制
ip a show
ip a s
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

ip addr flush用于批量删除地址,该命令其实非常危险,一个不小心就会误伤无辜,所幸的是flush的时候不给定任何参数或者没有任何条目可以匹配上的时候将不执行flush动作,总之该命令要小心使用。同样也必须给定dev参数。

例如删除eth1上所有地址。

代码语言:javascript
复制
ip a flush dev eth1

删除eth1上所有的secondary地址。

代码语言:javascript
复制
ip a f secondary dev eth1

ip route

添加修改删除路由:ip route { add | del | change | append | replace } dest[/cidr_mask] [ via ADDRESS ] [ dev STRING ]

其中dest为目标地址,可以是主机地址、网段地址,一般在地址后都会带上cidr格式的掩码长度,不带时默认为32位长度。如果dest为"0/0"或者写为"default",则表示默认路由。

例如添加/修改/替换普通路由:

代码语言:javascript
复制
ip route add/change/replace 172.16.10.0/24 via 192.168.10.20

添加/修改/替换默认路由:

代码语言:javascript
复制
ip route add/change/replace default via 192.168.10.20
ip route add/change/replace 0/0 via 192.168.100.2

删除某路由:

代码语言:javascript
复制
ip route del 172.16.10.0/24
ip route del default   # 删除默认路由

ip route show列出路由表

ip route flush批量删除路由表条目。参数和ip route show的参数一样。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"。

例如删除由eth1出去的路由条目。

代码语言:javascript
复制
ip route flush eth1

删除下一跳为192.168.100.70的路由条目。

代码语言:javascript
复制
ip r flush via 192.168.100.70

删除目标为192.168.0.0/16网段的路由

代码语言:javascript
复制
ip route flush 192.168/16

ip route save/restore用于保存当前的路由表以及恢复路由表。保存路由表时,路由表将以二进制裸数据的格式输出,也就是看不懂的二进制文件。恢复路由表时,要求设备的设置和保存路由表时是一样的,恢复时已存在于路由表中的路由条目将被忽略。

保存当前路由表

代码语言:javascript
复制
ip route save > /tmp/route.txt

删除几条路由表

代码语言:javascript
复制
ip route flush dev eth0

ip r
192.168.100.0/24 dev eth1  proto kernel  scope link  src 192.168.100.74  metric 101

恢复路由表

代码语言:javascript
复制
ip route restore < /tmp/route.txt

ip link

link表示link layer的意思,即链路层。该命令用于管理和查看网络接口,甚至可以添加虚拟网络接口,将网络接口分组进行管理。

(1).ip link set

代码语言:javascript
复制
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网卡。

代码语言:javascript
复制
ip link set eth1 down

其实等价于:

代码语言:javascript
复制
ifconfig eth1 down

修改网卡eth1的MAC地址。

代码语言:javascript
复制
ip link set eth1 address 00:0c:29:f3:33:77

(2).ip link show

语法格式:

代码语言:javascript
复制
ip [ -s | -h ] link show [dev DEV]  

选项说明:
-s:将显示各网络接口上的流量统计信息
-h:以人类可读的方式显式,即单位转换。注:"-h"在CentOS 7上才支持。

例如:

代码语言:javascript
复制
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 

原理篇

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 上开启转发功能的方法:

临时开启:

代码语言:txt
复制
echo 1 > /proc/sys/net/ipv4/ip_forward #方法1
sysctl > sysctl -w net.ipv4.ip_forward=1 #方法2

永久生效:

CentOS6:修改/etc/sysctl.conf 文件中的“net.ipv4.ip_forward”的值为1

CentOS7:echo "net.ipv4.ip\_forward=1" > /etc/sysctl.d/ip\_forward.conf

在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提供自定义内核修改项的目录

验证当前主机是否开启数据转发 :

代码语言:txt
复制
# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0

# cat /proc/sys/net/ipv4/ip_forward
0

# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_use_pmtu = 0

内核中数据包的具体处理过程可以参考:Linux网络 - 数据包的接收过程

与网络相关的文件

网卡配置文件

网卡的配置文件在 /etc/sysconfig/network-scripts/中以 ifcfg 开头的文件。所有 ifcfg 开头的网卡配置文件在启动网络服务时会被加载读取。具体的文件名ifcfg-XX的XX可以随意命名,不过为了方便管理,你不应该随意命名。

以下是 CentOS7中 enp0s3的网卡配置文件

代码语言:javascript
复制
cat /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE=Ethernet 
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME=enp0s3
UUID=f6b3581f-b6a9-4f4e-b675-65e46f6ad00b
DEVICE=enp0s3 # 显示的名称,必须与/sys/class/net/目录下的某个网卡名相同
ONBOOT=yes
IPADDR=192.168.1.110
PREFIX=24
GATEWAY=192.168.1.1
DNS1=192.168.1.1
DNS2=114.114.114.114
PEERDNS="yes" # 设置为 yes 时,此文件的 DNS 将覆盖/etc/resolv.conf。
              # 若开启了的 DHCP,则默认为 yes,所以 dhcp 的 dns 也会覆盖/etc/resolv.conf

DNS 配置文件/etc/resolv.conf

DNS 配置文件在/etc/resolv.conf,用于设置 DNS 服务器地址,和解析顺序。

代码语言:javascript
复制
domain domain_name #声明本地域名,即解析时自动隐式补齐域名
search domain_name_list #指定域名搜索顺序,最多6个,和 domain 不能共存,若共存,后面的行生效
nameserver IP1 #设置 DNS 服务器,最多3个
nameserver IP2
nameserver IP3
options timeout:n attempts:n #指定解析超时时间,默认5s 和解析次数,默认2次

示例

将/etc/resolv.conf设置如下,为了测试,暂不设置 nameserver

代码语言:javascript
复制
domain mansonx.com

当解析不带点"."的主机名时,如"www",认为不是fqdn,将自动加上".mansonx.com"变成解析"www.mansonx.com"。

代码语言:javascript
复制
host -a www
Trying "www.mansonx.com"
;; connection timed out; no servers could be reached

当解析的名称末尾不带点但中间带了点的,如"www.host",认为是fqdn,将直接解析"www.host",解析完这个后再解析加上"malong.com"的名称,即再解析"www.host.mansonx.com"。

当解析末尾带点的名称时,如"www.host."认为是完整的fqdn,将直接解析"www.host",解析完后直接结束解析,不会再补齐本地域名再解析。

search关键字的作用和domain是一样的,只不过search同时还暗含域名搜索的顺序。例如设置search为如下内容:

代码语言:javascript
复制
search masonx.com mansony.com mansonz.com

此时若解析"www.host",将依次解析"www.host","www.host.mansonx.com","www.host.mansony.com","www.host.mansonz.com"。

domain部分和search部分不能共存,如果共存了,则后出现的行有效。

/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目录中生成对应的设备子目录。

代码语言:javascript
复制
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/目录下的规则集文件仍然是生效的。

/etc/services

该文件中记录的是端口和服务的对应关系

代码语言:javascript
复制
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

网关和路由

Linux 中路由分为3种:

  1. 主机路由:直接指明到某台具体的主机该怎么走,主机路由也就是静态路由
  2. 网络路由:指明某类网络怎么走
  3. 默认路由:不走主机路由和网络路由的,就走默认路由。操作系统上设置的默认路由一般称为网关

若Linux上到某主机有多条路由可以选择,这时候会挑选优先级高的路由。在Linux中,路由条目的优先级确定方式是先匹配掩码位长度,再比较管理距离(比如metric)。也就是说,掩码位长的路由条目优先级一定比掩码位短的优先级高,所以主机路由的优先级最高,然后是直连网络(即同网段)的路由(也算是网络路由)次之,再是网络路由,最后才是默认路由。若路由条目的掩码长度相同,则比较节点之间的管理距离,管理距离短的生效。

配置永久路由

根据接口创建路由配置文件/etc/syconfig/network-scripts/route-ethX,要从那个接口出去X就是几。

路由配置文件的配置格式非常简单,每一行一个路由条目,先是要到达的目标,然后是via关键字,最后是下一跳地址。要求下一跳必须能到达,且一般都和ethX同网段。

DEST    via     nexthop

代码语言:javascript
复制
#默认路由
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服务即可立即生效。

配置永久路由需要注意以下几点:

(1).route-ethX的对应网卡配置文件ifcfg-ethX必须存在,否则路由无效。(对于虚拟机,通常新添加的网卡都没有对应的ifcfg-ethX文件,但ifconfig却能找到该网卡)

(2).如果在文件中配置永久默认路由,则必须保证所有使用了DHCP服务的网卡配置文件ifcfg-ethX中的DEFROUTE指令设置为"no",表示DHCP不设置默认路由。

(3).如果在route-ethX文件中配置永久路由,且该网卡使用了DHCP服务分配地址,则必须保证该网卡的ifcfg-ethX文件中的PEERROUTES指令设置为"no",表示DHCP设置的路由允许被覆盖。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 命令篇
    • 77.ifconfig
      • 78.ifcfg
        • 79.hostname
          • 80.route
            • 81.arp
              • 82.arping
                • 83.ip
                  • 获取帮助
                  • ip addr
                  • ip route
                  • ip link
              • 原理篇
                • Linux 处理数据包的过程
                  • 与网络相关的文件
                    • 网卡配置文件
                    • DNS 配置文件/etc/resolv.conf
                    • /etc/udev/rules.d/70-persistent-net.rules
                    • /etc/services
                  • 网关和路由
                    • 配置永久路由
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档