万字详解 Linux 网络管理
- 1.Linux处理数据包过程
- 2.和网络相关的几个文件说明
- 网卡配置文件ifcfg-*
- DNS配置文件/etc/resolv.conf(CentOS6环境)
- /etc/services
- 3.网络接口配置和主机名
- ifconfig
- ifcfg
- hostname命令
- 4.网关/路由
- 5.网关/路由相关命令
- route命令
- 配置永久路由
- 6.arping命令
- 7.ip命令
- ip addr
- ip route
- ip link
1.Linux处理数据包过程
当向外界主机发送数据时,在它从网卡流入后需要对它做路由决策,根据其目标决定是流入本机数据还是转发给其他主机
如果是流入本机的数据,则数据会从内核空间进入用户空间(被应用程序接收、处理)。当用户空间响应(应用程序生成新的数据包)时,响应数据包是本机产生的新数据,在响应包流出之前,需要做路由决策,根据目标决定从哪个网卡流出
如果不是流入本机的,而是要转发给其他主机的,则必然涉及到另一个流出网卡,此时数据包必须从流入网卡完整地转发给流出网卡,这要求Linux主机能够完成这样的转发。但Linux主机默认未开启ip_forward
功能,这使得数据包无法转发而被丢弃。Linux主机和路由器不同,路由器本身就是为了转发数据包,所以路由器内部默认就能在不同网卡间转发数据包,而Linux主机默认则不能转发
如果Linux主机有多块网卡,如果不开启数据包转发功能,则这些网卡之间是无法互通的。例如eth0是
172.16.10.0/24
网段,而eth1是192.168.100.0/24
网段,到达该Linux主机的数据包无法从eth0交给eth1或者从eth1交给eth0,除非Linux主机开启了数据包转发功能。🧄
在Linux上开启转发功能有多种方法:
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -w net.ipv4.ip_forward=1
可以使用以下几种方式查看是否开启了转发功能:
sysctl net.ipv4.ip_forward
cat /proc/sys/net/ipv4/ip_forward
sysctl -a | grep ip_forward
值为1代表处于开启状态:
以上两种方法是临时生效的,若要永久生效,则应该写入配置文件:
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ip_forward.conf
2.和网络相关的几个文件说明
网卡配置文件ifcfg-*
在/etc/sysconfig/network-scripts/
目录下有不少文件,绝大部分都是脚本类的文件,但有一类ifcfg开头的文件为网卡配置文件,所有ifcfg
开头的文件在启动网络服务的时候都会被加载读取
现在来看一个实例吧:
[root@192 network-scripts]# cat ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=7bd71446-6924-4a75-9a06-d27020da1ed8
DEVICE=ens33 # 显示的名称,必须/sys/class/net/目录下的某个网卡名相同
ONBOOT=yes
DNS1=114.114.114.114
DNS配置文件/etc/resolv.conf(CentOS6环境)
为了更好的展示DNS配置文件的效果,此处采用CentOS6环境实验!
该文件用于设置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
设置为下所示:
domain klza.com
当解析不带点".
“的主机名时,如"www
”,认为不是全限定域名,将自动加上".klza.com
"变成解析"www.klza.com
":
[root@xuexi ~]# host -a www
Trying "www.klza.com"
;; connection timed out; trying next origin
Trying "www"
;; connection timed out; no servers could be reached
当解析的名称末尾不带点但中间带了点的,如"www.host
",认为是全限定域名,将直接解析"www.host
",解析完这个后再解析加上"klza.com
"的名称,即再解析"www.host.klza.com
":
[root@xuexi ~]# host -a www.host
Trying "www.host"
;; connection timed out; trying next origin
Trying "www.host.klza.com"
;; connection timed out; no servers could be reached
当解析末尾带点的名称时,如"www.host.
“认为是完整的全限定域名,将直接解析"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 aaa.com bbb.com ccc.com
此时若解析"www.host
",将依次解析"www.host
",“www.host.aaa.com
”,“www.host.bbb.com
”,“www.host.ccc.com
”:
[root@xuexi ~]# host -a www.host
Trying "www.host"
;; connection timed out; trying next origin
Trying "www.host.aaa.com"
;; connection timed out; trying next origin
Trying "www.host.bbb.com"
;; connection timed out; trying next origin
Trying "www.host.ccc.com"
;; connection timed out; no servers could be reached
/etc/services
该文件中记录的是端口和服务的对应关系:
3.网络接口配置和主机名
ifconfig
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 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
所有的配置都是应用于内核的,所以只会临时生效,重启网络服务后会立即失效🧅
ifcfg
ifcfg eth1:0 add 192.168.100.20/24 # 添加一个地址
ifcfg eth1:0 del 192.168.100.20 # 删除一个地址
ifcfg eth1 stop # 临时禁用eth1
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地址,包括别名地址:
hostname修改的主机名为临时生效,它修改的其实是/proc/sys/kernel/hostname
文件:
要想永久生效修改主机名,需要修改配置文件/etc/hostname
:
echo "klza.com" >/etc/hostname
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
5.网关/路由相关命令
route命令
route命令用于显示和管理路由表。当使用了add或del选项时,route命令将设置路由条目,否则route命令将显示路由表
语法说明:
route [add/del] [-host/-net/default] [address[/mask]] [netmask] [gw] [dev]
选项说明:
add/del:增加或删除路由条目
-net:增加或删除的是一条网络路由
-host:增加或删除的是一条主机路由
default:增加或删除的是一条默认路由
netmask:明确使用netmask关键字指定掩码,要可以不使用该选项直接在地址上使用cidr格式的掩码,即IP/MASK。
gw:指定下一跳的地址。要求下一跳地址必须是能到达的,且一般是和本网段直连的接口。
dev:强制将路由条目关联到指定的接口上。一般内核会自动判断路由条目应该关联到哪个网络接口。
要显示路由表信息,只需简单的route -n
即可,其中-n
选项表示不解析主机名:
对于CentOS 6以上的系统,请忽略
Metric
和Ref
两列,它们已经不被内核使用,只是有些路由软件可能会用上🥕
若要管理路由表,则使用add或del选项:
添加和删除默认路由:
route add default gw 192.168.100.10
route del default
添加和删除网络路由:
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 172.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 netmask 255.255.255.0 gw 192.168.100.70
route del -net 172.16.10.0/24 dev eth0
添加和删除主机路由:
route add -host 172.16.10.55 gw 192.168.10.20
route del -host 172.16.100.55
配置永久路由
根据接口创建路由配置文件/etc/syconfig/network-scripts/route-ethX
,要从那个接口出去X就是几
路由配置文件的配置格式非常简单,每一行一个路由条目,先是要到达的目标,然后是via关键字,最后是下一跳地址。要求下一跳必须能到达,且一般都和ethX同网段
例如eth0网卡的IP地址是192.168.10.123
,要通过网卡eth0出去到达10.0.0.10
,那么下一跳的地址要和eth0的地址在同网段,如192.168.10.222
:
10.0.0.10 via 192.168.10.222
添加主机路由、默认路由、网段路由示例如下:
# 默认路由
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
配置在哪个eth文件中就会从哪个接口出去🌰
配置完后,重启network服务即可立即生效
配置永久路由时,需要注意几点:
route-ethX
的对应网卡配置文件ifcfg-ethX
必须存在,否则路由无效- 如果在文件中配置永久默认路由,则必须保证所有使用了DHCP服务的网卡配置文件
ifcfg-ethX
中的DEFROUTE
指令设置为"no
",表示DHCP不设置默认路由 - 如果在
route-ethX
文件中配置永久路由,且该网卡使用了DHCP服务分配地址,则必须保证该网卡的ifcfg-ethX
文件中的PEERROUTES
指令设置为"no
",表示DHCP设置的路由允许被覆盖
6.arping命令
arping用于发送arp请求报文,解析并获取目标地址的MAC。默认将先发送广播报文,收到回复后再发送单播报文,局域网内所有主机都能收到广播报文,但只有目标主机才会回复自己的MAC地址
发送arp请求报文实际上是另类的ping,所以可以探测目标是否存活🥜
语法说明:
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地址:
arping -f 192.168.100.70
这将会发送广播报文,直到收到192.168.100.70的回复才退出
实例2:
指定发送一个请求报文给192.168.100.70就退出,发送报文的接口为eth1,并指定请求报文中的源地址为本机eth0接口上的地址192.168.100.54:
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)
7.ip命令
这是一个极其强大的命令,前面所有的网络信息显示和管理的命令,都可以由ip命令来替代完成。它是一个严格模式化的命令。
ip addr
ip addr
用于管理网络设备上的ip地址,也可以查看ip地址的属性信息
ip addr add/del:
新增网卡的IP地址:
ip addr add 192.168.100.45 dev eth0
ip addr add 192.168.100.35/24 dev eth1
此方式添加的地址不会在ifconfg
命令中显示,ifconfg
能捕捉到的是别名,所以可以为地址加上label,以让secondary被ifconfig查看到。例如:
ip addr add 192.168.100.45 dev eth0 label eth0:0
要删除ip,则简单的多:
ip addr del 192.168.100.45 dev eth0
ip addr del 192.168.100.35/24 dev eth1
ip addr show:
因为ip命令可以缩写,所以可以写为下面这几种形式(都是正确的写法):
ip addr show
ip a show
ip a s
ip a
ip addr flush:
用于批量删除地址,该命令其实非常危险,一个不小心就会误伤无辜
例如删除eth1上所有地址:
ip a flush dev eth1
删除eth1上所有的secondary地址:
ip a f secondary dev eth1
ip route
该命令维护和查看内核中的路由表
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",则表示默认路由。
例如添加/修改/替换普通路由:
ip route add/change/replace 172.16.10.0/24 via 192.168.10.20
添加/修改/替换默认路由:
ip route add/change/replace default via 192.168.10.20
ip route add/change/replace 0/0 via 192.168.100.2
删除某路由:
ip route del 172.16.10.0/24
ip route del default # 删除默认路由
ip route show:
列出路由表。
ip r # 查看本机路由表
ip route flush:
批量删除路由表条目
例如删除由eth1出去的路由条目:
ip route flush eth1
删除下一跳为192.168.100.70的路由条目:
ip r flush via 192.168.100.70
删除目标为192.168.0.0/16网段的路由:
ip route flush 192.168/16
ip route save/restore:
用于保存当前的路由表以及恢复路由表。保存路由表时,路由表将以二进制裸数据的格式输出,也就是看不懂的二进制文件。恢复路由表时,要求设备的设置和保存路由表时是一样的,恢复时已存在于路由表中的路由条目将被忽略
保存当前路由表当当前目录的route.txt文件:
ip route save > route.txt
恢复路由表:
ip route restore < route.txt
ip link
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网卡:
ip link set eth1 down
其实等价于:
ifconfig eth1 down
修改网卡eth1的MAC地址:
ip link set eth1 address 00:0c:29:f3:33:77
ip link show:
语法说明:
ip [ -s | -h ] link show [dev DEV]
选项说明:
-s:将显示各网络接口上的流量统计信息
-h:以人类可读的方式显式,即单位转换。注:"-h"在CentOS 7上才支持。
实例:
[root@192 ~]# ip -s -h link show dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:0c:29:f1:a6:2b brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
23.7M 19.3k 0 0 0 0
TX: bytes packets errors dropped carrier collsns
2.45M 7.94k 0 0 0 0
本教程基于博客园:骏马金龙