Linux_Network_Configuration
12/24/2015 8:35:42 AM
Part I
网络基础概述
1、以太网令牌环网
在这种ethernet中,通过MAC地址向网络中的主机发送消息,并通过CSMA/CD方式检测冲突。网络中的每台主机都有权利发送数据包,不过首先需要侦听线路是否空闲,如果空闲就发送数据包,在发送的过程中,还要检测是否存在冲突,如果存在冲突就终止发送。
其中MAC(media control access)是全球唯一的,烧录在网卡中,一共有48bits,前24bits分配给厂商,后24bit由厂商自己指定。
在这种token-ring网络中,各个主机也是通过MAC向目标发送数据包,但是在这种网络中,每台主机能否发送数据包的关键在于线路中的token位于哪台主机,这个token会一直在线路上轮训,主机有发送的要求就发送,没有token就转移到下一台主机。
在以上两种网络中,隔离冲突的方式分别是CSMA/CD和token
2、交换机网络
当[1]中的主机数量变大,就不得不考虑划分不同的网络了,在这种网络中,主机与主机之间的网络通信仍然可以通过MAC来标识,其位置也是通过广播来获得的。交换机中存在一种表,在这张表中,几个交换机的接口对应一个网络中的几台主机的MAC地址,比如PC{1,2,3}是Switch的iface1,PC{4,5,6}是Switch的iface2,那么1,2,3之间的通信就在网内,1–{4,5,6}之间的通信由于交换机中存在一张表,它知道应该把报文发向什么位置,这样两个不同的网络也可以通过MAC实现通信了。
4、路由器网络
当网络中主机数量变大,交换机组成的网络也不能满足通信时,就需要使用路由器了。在这种情况下,如果仅仅是通过MAC地址,那么网络中就会存在大量的广播,这样整个网络的效率就会下降。所以,就要划分不同的网络用以表示哪台主机位于哪个网络,而这种新的表示方法就是IP。IP由网络号和主机号组成,其中ipv4一共32bits,ipv6一共128bits。IP的使用使得主机可以跨网络通信。考虑PC1要和PC7通信:
数据经过协议被添加上各种协议头,这个数据报包括源地址IP,目标地址IP和源地址MAC,在发送数据的时候,会首先用源地址IP、目标地址IP和源地址IP网络中的子网掩码作与运算,通过与运算,取出两个IP中的网络号,就可以知道源主机和目标主机是否位于同一个网络中!
如果源IP与目标IP在同一个网络中,那么路由器就不会路由转发,而这个消息就会以广播的形式发送给本网络中的所有主机,网络中所有主机接收到消息后检查目的IP是否和自己的相同,如果不相同,主机就会忽略这条数据;反之,主机就会给源IP的主机发送一个反馈,这个反馈消息中同时也携带了自己的MAC地址,这样,源主机就得到了目标IP主机的MAC地址。通过MAC地址,双方主机就可以建立通信了。
如果源IP与目标IP不在同一个网络中,那么路由器就要路由转发。路由器是如何知道目标IP位于哪个网络中的呢?原来在路由器中存在一个路由转发表,这张表中记录着不同的网络信息。这样,目标IP就可以通过路由器路由到指定主机,主机再把自己的MAC地址反馈给源主机,双方就这样建立了通信。
另外每台主机是知道自己的IP的呢?其实,在每个网络中有一台特殊的服务器,它负责分配这个网络中的IP地址,这个服务器就是DHCP服务器,有时DHCP也可以给主机指定DNS服务器的位置。当网络中新增主机时,主机会自动和DHCP服务器通信,告知服务器自己没有IP地址,这样网络中的主机都会有自己的IP了。
以上只是一个简单的概览,并没有详细的分析各种协议,以后我将慢慢的补起来。
网络术语
1、IP地址分类
A类:前8bits为网络号,后24bits为主机号
网络号:0 000 0000 ---- 0 111 1111 即0--127
网络数量:一共128个,其中全0、全1有特殊用途,即有126个
主机数量:2^24-2,其中全0、全1不用,(全0表示网络地址,全1表示广播地址)
默认子网掩码:255.0.0.0(全格式)、/8(省略格式)
私网地址:100.0.0.0/255.0.0.0,但是它不能在网络上进行通信
B类:前16bits为网络号,后16bits为主机号
网络号:10 00 0000 xxxxxxxx ---- 10 11 1111 xxxxxxxx 即128.x--191.x
网络数:2^14
主机数量:2^16-2
默认子网掩码:255.255.0.0、/16
私网地址:172.16.0.0----172.31.0.0
C类:前24bits为网络号,后8bits为主机号
网络号:110 0 0000 xxxxxxxx xxxxxxxx ---- 110 1 1111 xxxxxxxx xxxxxxxx 即192.x.x--223.x.x
网络数:2^24
主机数量:2^8-2
默认子网掩码:225.225.225.0、/24
D类:
1110 多播组号
E类:
11110 留待后用
2、套接字
网络中的主机的通信实际上也是通过各个主机上的进程来实现的,而各个进程之间是通过端口(port)来标识的。
端口用16bits表示,即0--65535,0不用所以为1--65535,其中
1--1023:固定分配,只有管理员有权限启用
1024--4w:半固定
4w+:随机,每个进程都可以使用
IP:PORT表示一个套接字
3、OSI_TCP/IP
资源子网位于用户空间
通信子网位于内核空间,内核中的通信模块提供各种网络服务
4、路由类型
此处指路由条目中的下一个IP(nexthop)
主机路由
目的地址是一个完整的主机地址
网络路由
目的地址是一个网络地址,主机号部分为0
默认路由
能够匹配所有的包,前提是前两种路由都没有匹配,可以到达整个网络(0.0.0.0/0.0.0.0)
优先级:主机路由>网络路由>默认路由
5、DNS
Domain Name System 域名系统,网络中域名和IP地址相互映射的一个分布式数据库
本地数据库:/etc/hosts
网络数据库:DNS服务器
本地数据库中定义了ip地址及其对应主机名,这里既可以是本机映射也可以是其他主机的映射,一般/etc/hosts目录中内容的格式为:ip localhost localhost.localdomain
DNS服务器在/etc/resolv.conf文件中配置,一般格式为nameserver x.x.x.x
主机名和域名的区别?
主机名在局域网内使用,通过hosts文件,主机名可以被解析到对应的ip
域名在internet使用
TCP状态
LISTEN:监听
ESTABLISHED:建立的链接
FIN_WAIT_1:
FIN_WAIT_2:
SYN_SENT:
SYN_RECV:
CLOSED:
EXPRESSION:
dport=
sport=
示例:( dport=:22 or sprot=:22 );括号两边必须要有空格,否则为错误
Part II
将Linux主机加入到网络中需要哪些配置?
1、IP/Netmask
用于本地通信
2、路由/网关
用于跨网络通信
3、DNS服务器
用于基于主机名(域名)通信
上面三种配置用到三种命令簇:ifcfg、iproute、nm(CentOS 7特有)
关于配置IP
1、静态配置,用于服务器
2、动态配置,DHCP服务器分配
当向网络中添加新的主机时,主机会主动广播,报告给DHCP服务器自己没有IP地址,DHCP服务器通过地址池分配IP给主机,如果网络中没有DHCP服务器,那么住吉会默认使用169.254.x.x/16作为自己的IP地址
hostname
查看主机名:hostname
配置:hostname HOSTNAME
配置hostname立即生效,但是不会永久有效
CentOS 7
hostnamectl status:显示当前的主机名设定
hostnamectl set-hostname HOSTNAME:设定当前的主机名,而且设定完之后永久有效
配置文件:
/etc/sysconfig/network文件
HOSTNAME=<HOSTNAME>
配置文件修改主机名不会立即有效
\# CentOS 6
[root@husa ~]# hostname husa.hust
[root@husa ~]# hostname
husa.hust
[root@husa ~]# vim /etc/sysc
sysconfig/ sysctl.conf
[root@husa ~]# vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=localhost.localdomain
可以发现虽然就改了hostname但是/etc/sysconfig/network文件中的主机名仍然没有改变 ,所以这个配置文件可以永久有效,但是不会立即生效
CentOS 7关于主机名配置
DNS
配置DNS服务器指向:
配置文件:/etc/resolv.conf
nameserver x.x.x.x
这个文件中,可以配置三个DNS服务器,即主DNS服务器、备用DNS服务器和第三DNS服务器
ifcfg suite
ifup | ifdown
ifup IFACE [boot]
bring a network interface up
ifdown IFACE
take a network interface down
注意:上面两个命令是通过配置文件/etc/sysconfig/network-scripts/ifcfg-IFACE来识别接口并完成网卡激活/关闭的
ifconfig
ifconfig -a
显示所有接口,包括inactive状态的接口
ifconfig interface [aftype] options | address...
ifconfig IFACE IP/MASK [up|down]
ifconfig IFACE IP netmask NETMASK
options:
[-]promisc
ifconfig各个字段解析:
Link encap: 网卡OSI物理层的类型。HWaddr:MAC地址
inet addr:IP地址 Bcast:接口广播地址 Mask:子网掩码。
inet6:IPv6地址
MTU:最大传输单元 Metric:默认的路由成本。
RX :收到数据报 errors:其中错误的 dropped:其中丢弃的
TX:传送数据包 collisions:冲突次数
txqueuelen:传送队列长度
RX bytes:收到的数据大小。 TX bytes:传送的数据大小
ifconfig ethx 0:表示直接删除接口上的地址
给接口的多个ip配置路由信息
除了ip address命令之外,ifconfig或者配置文件也可以配置
1、ifconfig IFACE_LABEL IPADDR/NETMASK
IFACE_LABEL:eth0:0,eth0:1
[root@husa iproute2]# ifconfig eno33554984
eno33554984: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.249.79 netmask 255.255.0.0 broadcast 172.16.255.255
inet6 fe80::20c:29ff:fe4d:a05a prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:4d:a0:5a txqueuelen 1000 (Ethernet)
RX packets 1311857 bytes 80237319 (76.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2631 bytes 628562 (613.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@husa iproute2]# ifconfig eno33554984:0 172.16.111.111/16
[root@husa iproute2]# ifconfig eno33554984:0
eno33554984:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.111.111 netmask 255.255.0.0 broadcast 172.16.255.255
ether 00:0c:29:4d:a0:5a txqueuelen 1000 (Ethernet)
2、添加配置文件即/etc/sysconfig/network-scripts/route-IFACE#:[0|1|2..]然后重启网络服务
DEVICE=IFACE_LABEL
BOOTPROTO:接口上的别名不支持动态获取地址;只能使用static和none
route
路由条目类型:
主机路由:目标地址为单个IP
网络路由:目标地址为IP网络
默认路由:目标为任意主机
查看
route :反解
route -n:只显示ip地址
[root@husa ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
172.16.0.0 0.0.0.0 255.255.0.0 U 1 0 0 eth0
0.0.0.0 172.16.0.1 0.0.0.0 UG 0 0 0 eth0
字段解析
Destination:目标网络或目标主机
Gateway:网关地址,如果没有就显示为*号
Genmask:掩码
Flags:
U(up):该路由是启动的
H(host):目标是一部主机 (IP) 而非网段
G(use gateway):需要透过外部的主机 (gateway) 来转递封包;
R(reinstate route for dynamic routing):使用动态路由时,恢复路由资讯的旗标;
D(dynamically installed by daemon or redirect):已经由服务或转 port 功能设定为动态路由
M(modified from routing daemon or redirect):路由已经被修改了;
!(reject route):这个路由将不会被接受(用来抵挡不安全的网域!)
Metric:距离、跳数
Ref:忽略
Use:该路由被使用的次数
Iface:使用哪个接口
第一条:
如果目标主机时172.16.0.0那么直接通过eth0发送出去
第二条:
如果目标主机是网络中的任何主机,那么通过eth0经过172.16.0.1网关发送出去,0.0.0.0/0.0.0.0表示这是一条默认路由
添加
route add [-net|-host] target [netmask Nm] [gw GW] [[dev] If]
-net表示目标是一个网络号
-host表示目标是一个主机号,对于主机号就不要指定子网掩码了。
其中UGH表示这条路由启动并且需要通过外部网关传递而且目标是一个主机
删除
route del [-net|-host] target [gw GW] [netmask Nm] [[dev] If]
删除默认网关:route del default
添加默认网关:[root@husa ~]# route add -net 0.0.0.0/32 gw 172.16.0.1 dev eth0
删除时可以写出完整的路由,也可以只写目标网络(主机)
netstat
显示路由:
netstat -rn
-r:显示内核路由表
-n:数字格式
显示网络连接:
netstat [--tcp|-t] [--udp|-u][--udplite|-U][--sctp|-S][--listening|-l][--all|-a][--numeric|-n][--extend][-program|-P]
-t:TCP协议的相关联系,连接均有状态;即FSM的状态
-u:UDP相关的连接
-w:raw socket相关的链接
-l:处于监听状态的链接
-a:所有状态
-n:以数字格式显示IP,不要解析
-p:显示进程及进程号
常用组合:
-un:已经建立的udp连接
-unl:处于监听状态的udp连接
-tunl:处于监听状态的tcp、udp连接
-tan:显示所有的tcp,即各种状态的tcp
-t:仅仅显示已经连接的tcp
-e:显示额外的信息,有用户和inode,即每一个链接代表了一个socket文件
显示接口的统计数据
netstat {--interfaces|-i|-I} [iface]
显示所有接口:
netstat -i
显示指定接口:
netstat -I<IFace> <IFace不可省而且不能有空格>
iproute suite
ip
show/manipulate routing,devices,policy
ip [OPTIONS] OBJECT {COMMAND|help}
OBJECT:={link | addr | route}
OBJECT可以简写,各个OBJECT的子命令也可以简写
ip link:network device configuration
ip link set:change device attributes
ip link set [dev] NAME opreation:
其中operation包括但不限于:
up and down(启用或禁用网络设备)、
multicast on and multicast down(启用或禁用多播和组播)
name NAME(修改网络设备名称)
mtu NUMBER:设置MTU大小,默认为1500
netns PID:ns为namespace,用于将接口移动到指定的网络名称空间
ip link show|list:display device attributes:显示二层设备
ip link help:显示简要帮助
ip netns:ip-manage network namespaces
ip netns list:列出所有的netns
ip netns add NAME:创建指定的netns
ip netns del NAME:删除指定的netns
ip netns exec NAME COMMAND:在指定的netns中运行命令
ip address - protocol address management
ip address add:add new protocol address
ip addr add IFADDR/simple_form_netmask dev IFace
只有同一个网段才有secondary,不同网段相互独立
【label NAME】:为接口添加别名,这个别名上的地址ifconfig命令才能够显示
[broadcast ADDRESS]:广播地址,会根据IP和NETMASK自动计算,不指定也可以
[scope SCOPE_VALUE]:添加域属性
global:全局可用
link:接口可用
host:仅本机可用
[root@localhost ~]# ip address add 192.168.200.130/24 dev eth1 label eth1:0
注意:以上虽然给网卡添加了一个别名,但是系统重启这个配置仍会失效,所以最根本的方法就是在/etc/sysconfig/network-scripts/目录下添加一个和别名一样的文件,然后重启网络服务。
ip address show|list:look at protocol address
[IFace]:仅显示指定接口地址
[root@localhost ~]# ip address show dev eth1
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:68:9a:c2 brd ff:ff:ff:ff:ff:ff
inet 192.168.200.129/24 brd 192.168.200.255 scope global eth1
inet6 fe80::20c:29ff:fe68:9ac2/64 scope link
valid_lft forever preferred_lft forever
ip address delete:delete protocol address
删除指定接口上的指定地址
ip address delete IFADDR/simple_form_netmask dev IFace
[root@localhost ~]# ip address delete 192.168.200.130/24 dev eth1:0
其中的address要写全格式,要不然会提示警告
ip address flush:flush protocol address
清空指定接口上的所有地址
ip address flush dev IFace
[root@localhost ~]# ip address flush dev eth1
清空网卡接口上的IP配置,别名的会直接删去
ip route - routing table management管理路由表
ip route Action TYPE PREFIX via GW [dev IFace] [src SOURCE_IP]
ip route add - add new route
[root@localhost ~]# ip route add 104.224.156.105 via 172.16.0.1 dev eth0 src 172.16.249.147 scope link
[root@localhost ~]# ip route add 104.224.156.105 via 192.168.1.1 dev eth0:0 src 192.168.1.67
以上表示主机要发送消息到104.224.156.105主机时,通过eth0接口上的172.16.249.147地址发送到网关172.16.0.1来转发数据包
ip route change - change route
ip route replace - change or add new route
ip route delete - delete route
[root@localhost ~]# ip route show
172.16.0.0/16 dev eth0 proto kernel scope link src 172.16.249.147 metric 1
192.168.0.0/16 dev eth0 proto kernel scope link src 192.168.1.67
default via 172.16.0.1 dev eth0 proto static
#删除指定接口上的一条路由条目
[root@localhost ~]# ip route delete 192.168.0.0/16 dev eth0
[root@localhost ~]# ip route show
172.16.0.0/16 dev eth0 proto kernel scope link src 172.16.249.147 metric 1
default via 172.16.0.1 dev eth0 proto static
ip route show - show route
ip route flush - flush route
ip route flush dev IFACE:直接删除指定接口上的所有路由条目
ip route get - get a single route
ip route get TYPE PREFIX
[root@localhost ~]# ip route get 172.16/16
broadcast 172.16.0.0 dev eth0 src 172.16.249.147
cache <local,brd> mtu 1500 advmss 1460 hoplimit 64
ip route default via 172.16.0.1 dev eth0
默认路由通过172.16.0.1网关发送
ss
another utility to investigate sockets
ss [options] [FILTER]
optoins:
-t:TCP协议相关的链接
-u:UDP协议相关的链接
-w:raw socket相关的链接
-l:监听状态的链接
-n:数字格式
-p:相关的程序及PID
-e:扩展格式信息
-m:内存用量
-o:计时器信息
FILTER:
以后介绍
[root@localhost ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:52001 *:*
LISTEN 0 128 :::111 :::*
LISTEN 0 128 *:111 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 127.0.0.1:631 *:*
LISTEN 0 128 ::1:631 :::*
LISTEN 0 128 :::53111 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 100 127.0.0.1:25 *:*
bridge
bridge - show / manipulate bridge addresses and devices
等我以后学到了再写
nm suite(CentOS 7)
nmtui
Text User Interface for controlling NetworkManager
可以添加删除编辑激活链接等设置
nmcli
nmcli [OPTIONS] OBJECT {COMMAND | help}
OBJECT:={general | networking | radio | connection | device}
示例:
nmcli修改ip地址
nmcli connection modify IFACE [+|-]setting.property value
其中的setting.property属性有
ipv4.address
ipv4.netmask
...
#查看接口IP
[root@husa ~]# ifconfig eno16777736
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.249.206 netmask 255.255.0.0 broadcast 172.16.255.255
inet6 fe80::20c:29ff:fe4d:a050 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:4d:a0:50 txqueuelen 1000 (Ethernet)
RX packets 11272 bytes 1020909 (996.9 KiB)
RX errors 0 dropped 27 overruns 0 frame 0
TX packets 1391 bytes 345041 (336.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
#通过nucli修改接口IP等
[root@husa ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno16777736
# Generated by dracut initrd
NAME="eno16777736"
DEVICE="eno16777736"
ONBOOT=yes
NETBOOT=yes
UUID="80c992d9-d7b7-4b7d-a337-bb7876d463cf"
IPV6INIT=yes
BOOTPROTO=none
TYPE=Ethernet
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPADDR=172.16.222.222
PREFIX=32
GATEWAY=172.16.0.1
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
#以上可以知道nmcli connection是修改现有连接的IP而且不会立即生效。
配置文件
IP/NETMASK/GW/DNS/DHCP等属性的配置文件:/etc/sysconfig/network-scripts/ifcfg-IFACE
配置文件/etc/sysconfig/network-scripts/ifcfg-IFACE通过大量参数来定义接口的属性,其可以通过vim等编辑器直接修改,也可以使用专用的命令,CentOS 6使用setup或system-config-network命令(不会立即生效,要重启网络服务),CentOS 7使用nmtui命令。
这个文件内核并不会自动读取,而是开机的时候,会自动启动网络管理服务,这个服务会读取配置文件的各种参数通过各种命令以脚本的形式向系统内核发送各种信息,CentOS 5、6使用network服务,CentOS 6、7使用NetworkManager服务,所以修改了这个配置文件要重启网络服务才会生效。
对于CentOS5、6,启动网络服务命令为:service network status|start|restart|stop
对于CentOS7,启动网络服务命令为:systemctl restart|status|start|stop network.service,其中.service可以缺省
配置文件详细参数:
DEVICE:此配置文件对应的设备的名称,应该和IFACE名称一致
ONBOOT:系统引导过程中是否激活此接口
UUID:网络设备的唯一标识
IPV6INIT:是否初始化IPV6协议栈
BOOTPROTO:激活此接口时是用什么协议来配置接口属性,常有有四种协议:
dhcp、bootp、static、none:前两个表示动态,后两个表示静态
TYPE:指明接口类型,常见的有ethernet、bridge、ppp
DNS1:指定第一个DNS服务器指向
DNS2:
DNS3:
DOMAIN:DNS搜索域
DEFROUTE:是否为默认路由所使用的接口
GATEWAY:默认网关
IPADDR:IP地址
NETMASK:子网掩码;CentOS7支持使用PREFIX,表示以长度方式指明子网掩码
IPV4_FAILURE_DOWN:表示IPV4错误是否直接关闭此接口
USERCTL:表示是否允许普通用户控制此设备
PEERDNS:如果BOOTPROTO的值为dhcp,是否允许dhcp server分配的dns服务器指向覆盖本地手动指定的dns执行,yes表示允许dhcp服务器覆盖
NM_CONTROLLED:是否使用Network Manager服务来控制接口配置。
路由的相关配置文件:/etc/sysconfig/network-scripts/route-IFACE
用到非默认网关路由:/etc/sysconfig/network-scripts/route-IFACE
支持两种配置方式,但是不可以混用
1、每行一个路由条目
Target via GW
2、每三行一个路由条目
ADDRESS#=TARGET
NETMASK#=MASK
GATEWAY#=NEXTHOP
参考资料:http://www.361way.com/linux-define-static-route/4053.html