运维人员也需要具备一定的网络基础知识,才能更好的对服务器网络管理层面进行配置、排查和维护。经由几个星期的对网络基础知识的补充,大概了解了以下些许关于网络的基本认知:
网络的结构:硬件+软件;这一点倒是跟计算机系统的组成相像;
网络的功能:资源共享+数据通信;前者是后者的目的所在,后者是前者的实现手段;
网络通信模型:ISO/OSI七层参考模型 和 TCP/IP四层参考模型
IP地址部分:逻辑地址,子网掩码,端口的作用,网关作业等等
具备以上内容的知识后,就能对linux系统进行详细的网络配置了;
首先就是进行网卡属性的设置,包括:
自动获取:在主机所在网络中,至少有一台DHCP服务器
手动配置:
a.用命令:有以下几个‘命令家族’:
net-tools家族(ifcfg家族)
1.ifconfig(Windows:ipconfig):
查看网络接口的配置信息
配置网络属性
管理接口状态
2.route:
查看路由信息
配置路由信息(网关,静态路由,静态默认路由)
3.netstat:
状态及统计数据的查看
iproute家族:
ip OBJECT(类似子命令)
OBJECT可以是:
addr:IP地址和掩码
link:物理接口的管理
route:路由的管理
ss:
状态及统计数据查看;
相较于netstat来说,ss几乎和它的使用方法一样;但是性能却要高很多;
nm家族(Network Manager)
nmcli:命令行工具
nmtui:text-window的工具
nm家族只在CentOS7中使用
在CentOS6里,用的是setup的子命令:
system-config-network
system-config-network-cmd
system-config-network-tui
b.配置文件:同样,使用命令的方法可以使配置信息立即生效,但是系统重启或者注销后会失效。因此,就需要对配置文件进行修改,使得配置的网卡的网络属性永久生效;
在解除具体CentOS系列中网络配置步骤之前,我们还需要了解其中的网络接口;
接口命名的方式有:
a.传统的命名方式:
根据网络的类型和特点;
以太网接口:eth#,#是从0开始的整数。
PPP网络 :ppp#,#也是从0开始的整数;
环回接口:lo(loopback interface)
A类网络127就是为环回接口预留的 。根据惯例,大多数系统把IP地址127.0.0.1分配给这 个接口,并命名为localhost。一个传给环回接口的IP数据报不能在任何网络上出现。实际 上,访问127.x.x.x的所有IP都是访问环回接口(lo)。
b.可预测的命名方案:(Centos7开始):
这种方案可以支持很多种命名机制
1.根据Firmware固件进行命名:
即每一台计算机的网卡在其计算机的硬件固件中都有唯一的标识符,比如:MAC地址,厂商标识,电器编号等;
2.根据物理拓扑结构:
每一台计算机的主板上都有固定数量的插槽或接口,如主板上第二个插槽连接的网卡的第一个物理接口等;
根据不同的命名机制可以有如下的命名标准
1) 如果Firmware或BIOS是主板上集成的设备提供的索引信息并且该信息可用,则根据此索引信息进行设备命名,如:enoX, eno1,eno167777736,...
2) 如果Firmware或BIOS是主板上扩展插槽所提供的索引信息并且该信息可用,则根据此索引信息进行设备命名,如:ensX, ens0,ens2,...
3) 如果硬件接口的物理拓扑的位置信息存在并可用,则可以根据此信息进行设备命名,如:enp1s0
4) 如果用户显式的定义,可以根据诸如MAC地址进行命名;如:enx000c290045b3
5) 如果上述可预测命名皆不可用,则延用传统命名方式对网络设备进行命名;
好,了解了网络接口的命名,接着就是命令的详细具体使用了;
-------------------------------------------------------------------------------------------
net-tools家族(ifcfg家族)
1.ifconfig命令:
描述:ifconfig - configure a network interface
ifconfig [interface]:用于查看网络接口的配置信息
如果不带任何参数,则显示所有处于激活状态的网络接口信息;
如果执行带有参数,则无论接口是否激活,都显示出来
ifconfig interfere address 配置网络信息
ifconfig interface IP/PREFIX_LEN [up/down]
ifconfig interface IP netmask SUBNET_MASK [up/down]
常用选项:
-a:显示所有的网络接口,无论是否处于激活状态
2.route
显示路由表的路由条目 可能包括以下几种类型
a.主机路由:目标地址是特定的单个ip地址
b.网络路由:子网路由;主网路由,超网路由(CIDR);分别例如:
10.10.10.0/24
192.168.1.0/24
192.168.0.0/16
c.默认路由:目标地址是0.0.0.0/0的条目
选项:-n
设置路由信息:
route add [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]
route del [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]
设置默认网关:
route add default gw 192.168.100.1
default == -net 0.0.0.0 netmask 0.0.0.0
删除默认网关:
route del default
3.netstat:
a.Print network connections
[--tcp|-t] 只显示与TCP协议相关的网络连接
[--udp|-u] 只显示与UDP协议相关的网络连接
[--udplite|-U] 只显示udolite协议相关的网络连接
[--sctp|-S] 只显示与sctp协议相关的连接
[--raw|-w] 显示与裸套接字相关的网络连接()
[--listening|-l] 显示处于监听状态的TCP连接;
[--all|-a] 查看所有状态的任意连接
[--numeric|-n] 数字化显示结果中的主机名,端口号,用户id等等信息
[--numeric-hosts]
[--numeric-ports]
[--numeric-users]
[--extend|-e[--extend|-e]] 扩展格式显示结果
[--program|-p] 显示
常用选项的组合有 -tan -uan -tnl -unl -tnlp -unlp -tunlp
iproute家族
ip 命令 :
描述 -- show / manipulate routing, devices, policy routing and tunnels(查看 配置路由 设备 策略路由 和 通道)
用法:ip [ OPTIONS ] OBJECT { COMMAND | help }
OBJECT 可以是:{ link | addr | route | netns }
OPTION 有 { -V[ersion] | -s[tatistics] | -r[esolve] | -f[amily] { inet | inet6 | ipx | dnet | link } | -o[neline] }
1.ip link COMMAND (COMMAND--add delete set show help)
ip link set DEVICE { up | down } 修改网络设备的配置参数
ip link set [dev] IFACE_NAME { up | down }:激活或者禁用网络接口
2.ip netns COMMAND -- 设置内核中的网络名称空间
list
add NS_NAME
exec NS_NAME cmd
delete NS_NAME
3.ip addr COMMAND --
add IFADDR dev IFACE_NAME 为指定的网络接口添加IP地址
del
flush 清空IP地址
{ show | list }
为网络接口增加多个IP地址,并且能够使用ifconfig查看
ip addr add IPADDR dev IFACE_NAME label LABEL_NAME
ip route COMMAND -- 查看和设置路由表信息
ip route { add | del } TARGET/PREFIX via NETX_HOP [dev IFACE_NAME]
ip route list
ss:
another uniity to investigate sockets
1.ss [opt] [ FILTER ]
-t:TCP相关
-u:udp相关
-w raw socket相关
-l 处于监听状态的连接
-a 所有状态的套接字连接
-n 数字化显示结果
-p 显示相关的应用程序和PID
-e 扩展的信息
以上与netstat命令的选项基本类似,不一样的有:
-m 内存使用量
-o:计时器信息
[FILTER] = [ state TCP-STATE ] [ EXPRESSION ]
TCP-STATE:TCP协议有限状态机中所有可用状态
EXPRESSION
dport= :port
sport= :port
示例:
'( dport = :22 or sport = :22 )'
除了命令配置使得网络属性立即生效,还需要配置文件:
CentOS6中与ip mask gateway DNS相关的配置文件
/etc/sysconfig/network-scripts/ifcfg-IFACE_NAME
文件内容格式:
DEVICE 网络接口的名称
TYPE 网络接口的类型 常见的:Ethernet、Bridge、Token Ring ...
HWADDR 物理地址
ONBOOT 在系统引导的过程中,是否激活此设备
NETBOOT 是否可以使用此设备进行网络引导
BOOTPROTO 激活此接口时使用何种协议来配置此接口的属性
动态配置:dhcp、bootp
静态配置:static、none
IPV6INIT 是否在此接口上初始化IPV6协议;
USERCTL 是否允许普通用户管理此接口
IPADDR 指定此接口的固定IP地址,前提是BOOTPROTO为static或者none
NETMASK 设置ip地址的子网掩码
PREFIX 设置ip地址的网络前缀的位数
GATEWAY 设置默认网关
DNS1 首选dns服务器的地址指向
DNS2 备选DNS服务器的地址指向
DNS3 第三DNS服务器的地址指向
PEERDNS 是否允许从dhcp服务器获取dns服务器的地址指向替代此文件里的dns服务器指向,默认值为允许,即没有此行信息 默认开启
注意:NM_CONTROLLED 是否允许NetworkManager服务管理网络接口;此服务在CentOS6中非常不完善,所以建议不使用此服务进行网络接口的管理;而且最好永久关闭此服务。
主机名的配置文件 /etc/sysconfig/network
HOSTNAME 当前linux系统使用的主机名称
命令 hostname 查看当前系统的FQDN (Fully Qualified Domain Name)完全合格域名/全称域名
hostname NEW_HOSTNAME
CentOS7中:
与ip mask gateway DNS相关的配置文件
/etc/sysconfig/network-scripts/ifcfg-IFACE_NAME
多数参数与CentOS6相同
UUID 全局唯一标识符,唯一标识此网络接口
DEFROUTE
NAME
主机名称的配置文件:/etc/sysconfig/network
# hostnamectl set-hostname NEW_NAME
本地解析配置文件:/etc/hosts
格式: IP地址 主机名(多个主机名空白字符格隔开)
解析器文件:/etc/resolv.conf
静态路由的配置文件 /etc/sysconfig/network-scripts/route-IFACE_NAME
两种风格的写法
1.每条路由信息占一行
TARGET via NETX_HOP [dev IFACE_NAME]
10.0.0.0/8 via 192.168.100.254
2.每条路由信息占多行
ADDRESS#=TARGET
NETMASK#=MASK
GATEWAY#=NEXT_HOP
#表示编号数字
Bonding -- 绑定
就是将多块网卡(网络接口设备)绑定到同一ip地址,对外提供网络服务;这些网卡之间可以实现负载均衡或高可用技术;
通过Bonding,虚拟一个网卡对外提供服务及网络连接,所有的物理网卡都被修改为相同的MAC地址
Bonding的工作模式:
Mode 0 -- 负载均衡解决方案,其负载均衡的算法为balance-rr(round robin,轮询)
轮询策略意味着从头到尾顺序的在没一个slave接口上发送数据包;该模式可以提供负载均衡以及容错的能力;
Mode 1 -- 主备解决方案,(active-backup master-backup).
在此模式中,只有一个slave接口被激活 用于正常数据传输;而其他的接口都监视此接口的工作状态;当且仅当活动的slave接口失败的时候,才会
从其他备份的接口中选择一个用于激活;该模式只能实现容错,无法进行负载均衡
Mode 3 -- 全广播解决方案。在所有的slave接口上传送全部报文,
miimon 用来链路监测。如果miimon=100,则系统每100ms监测一次链路连接的状态。
使用Bonding的时候,需要配置:
1.创建虚拟接口
2.选择miimon的监测时间和Bonding的工作模式
3.选择用于此次Bonding的物理接口
在/etc/sysconfig/network-scripts/ifcfg-bond0文件里指定Bonding的特性即可:
DEVICE=bond0
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
BONDING_OPTS="miimon=100 mode=0"
IPADDR=172.16.111.11
PREFIX=16
物理网卡配置:
/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
USERCTL=no
...
注意不要配置ip地址
Bonding最好在CentOS6里去实现。在7里使用网络组的方式
CentOS7里的nmcli:
nmcli [ OPTIONS ] OBJECT { COMMAND | help }
OBJECT:connection | device
device - show and manage network interfaces
COMMAND := { status | show | connect | disconnect | delete | wifi | wimax }
connection - start, stop, and manage network connections
COMMAND := { show | up | down | add | edit | modify | delete | reload | load
}
show:显示所有网络连接的属性信息;
up|down:启用或禁用指定的网络连接;
add:添加新的网络连接的;
autoconnect yes|no:是否自动启动此连接,在配置文件中添加ONBOOT=yes|no;
ifname IF_NAME:指定要创建连接的目标网络接口设备名称;
con-name CON_NAME:为指定的网络接口设备创建一个连接名称;
type TYPE:指定网络设备的接口类型
示例:
# nmcli connection add autoconnect yes ifname eno67109432 con-name eno666 type ethernet
delete:删除指定的网络连接
# nmcli connection delete CON_NAME
示例:
# nmcli connection delete eno666
reload:不重启网络接口,但重新加载其配置文件中的配置信息;
modify:
modify [ id | uuid | path ]
802-3-ethernet.mtu
connection.autoconnect
ipv4.addresses
ipv4.dns
ipv4.gateway
ipv4.method
示例:
# nmcli connection modify "系统\ eno50332208" ipv4.addresses 1.2.3.4/8 ipv4.dns 202.202.222.222 ipv4.gateway 1.1.1.1
nmtui: Text User Interface for controlling NetManager
CentOS6 : system-config-network[-tui]或者 setup 中选择网络配置
这两种虽然可以使用简单的图形界面,但都是修改了配置文件,并不能立即生效,所以要重启网络接口;
.
网络组(Network Teaming)
是将多个网络接口设备聚合在一起的方法,目的是实现冗余容错以及提高可用性和吞吐量;
与Bonding技术相比具有更好的性能以及更好的扩展性;
在CentOS 7中,网络组是由内核当中的一个内核驱动和一个名为teamd的守护进程来实现的;
网络组可以实现多个工作模式,被称为运行器(runner);
包括 broadcast、roundrobin、activebackup、loadbanlance、lacp--IEEE 802.3ad 的标准,全称link aggregation control protocol,链路聚合控制协议
网络组接口特点:
1.启动网络组接口并不会自动启动网络组中其他port接口
2.启动网络组终端port接口,也不会自动启动网络组接口;
3.禁用网络组接口,则会立即随之禁用网络组中的port接口
4.对于没有port接口的网络组接口而言,只能配置静态IP地址,不能设置从DHCP获取;如果设置了DHCP,网络组接口就会一直等待port接口的加入;
创建网络组接口的方法:
# nmcli connection add type team con-name TEAM_CONF_NAME [ifname IF_NAME] config JSON
JSON是用来指定runner的方式,格式为:
'{"runner": {"name": "METHOD"}}'
示例:
创建port接口:
nmcli connection add type team-slave [con-name TEAM_CONF_NAME]
注意:如果不指定con-name,则默认的con-name为team-slave-IF_NAME
# nmcli connection add type team-slave con-name