万字详解 Linux 网络管理
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
万字详解 Linux 网络管理
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.confCentOS6环境
为了更好的展示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