0%

简介

VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。VLAN内的主机间可以直接通信,而VLAN间不能直接互通,从而将广播报文限制在一个VLAN内。

以太网是一种基于CSMA/CD(Carrier Sense Multiple Access/Collision Detection)的共享通讯介质的数据网络通讯技术。

当主机数目较多时会导致冲突严重、广播泛滥、性能显著下降甚至造成网络不可用等问题。

通过交换机实现LAN互连虽然可以解决冲突严重的问题,但仍然不能隔离广播报文和提升网络质量。

在这种情况下出现了VLAN技术,这种技术可以把一个LAN划分成多个逻辑的VLAN,每个VLAN是一个广播域,VLAN内的主机间通信就和在一个LAN内一样,而VLAN间则不能直接互通,这样,广播报文就被限制在一个VLAN内。

使用VLAN能给用户带来以下受益

  1. 列表项限制广播域:

广播域被限制在一个VLAN内,节省了带宽,提高了网络处理能力。

  1. 增强局域网的安全性:

不同VLAN内的报文在传输时是相互隔离的,即一个VLAN内的用户不能和其它VLAN内的用户直接通信。

  1. 提高了网络的健壮性:

故障被限制在一个VLAN内,本VLAN内的故障不会影响其他VLAN的正常工作。

  1. 灵活构建虚拟工作组:

用VLAN可以划分不同的用户到不同的工作组,同一工作组的用户也不必局限于某一固定的物理范围,网络构建和维护更方便灵活。

在物理vlan中,各主机可以直接通过网络体系结构中的第二层(数据链路层)进行通信,但划分vlan后,不同vlan中的主机不可用直接通过第二层进行通信,必须通过第三层(网络层)才能通信。

从物理来看待vlan:

即同一台交换机上不同的vlan间不通;处于同一IP网段不同vlan位于不同交换机有时是可以直接互通的;从逻辑来看待vlan:一个vlan可以跨越多台物理交换机,即vlan的中继(trunk)功能。

同一物理交换机不可能存在两个相同的vlan;不同交换机可以有相同的vlan,且不同物理交换机上的相同vlan间一般情况下是可以直接互访的(前提是他们都位于同一IP网段,且物理连接端口上允许这些vlan通过);位于不同交换机上不同vlan处于同一IP网段,且交换机之间连接的两个端口分别隶属于双方vlan的access或不带vlan标签的hybrid端口,则这两个vlan也可以直接通信。

Vlan中继

一台交换机上的vlan配置信息可以传播、复制到网络中相连的其他交换机上,采用GVRP自动注册来实现

中继端口

trunk(中继)端口指在一个交换机端口允许一个或多个vlan通信到达网络中相连的另一台交换机上相同的vlan中

vlanID取值范围0-4095,0和4095为协议保留。


VLAN基本概念

VLAN的帧格式

传统的以太网数据帧在目的MAC地址和源MAC地址之后封装的是上层协议的类型字段。

802.1Q Tag包含4个字段,各字段解释如下所示:

  1. TPID

长度2bytes,Tag Protocol Identifier(标签协议标识符),表示帧类型。取值为0x8100时表示802.1Q Tag帧。如果不支持802.1Q的设备收到这样的帧,会将其丢弃。

  1. PRI

长度3bits,Priority,表示帧的优先级。 取值范围为0~7,值越大优先级越高。用于当交换机阻塞时,优先发送优先级高的数据帧。

  1. CFI

长度1bit ,Canonical Format Indicator(标准格式指示位),表示MAC地址是否是经典格式。 CFI为0说明是经典格式,CFI为1表示为非经典格式。用于兼容以太网和令牌环网。在以太网中,CFI的值为0。

  1. VID

长度12bits,VLAN ID,表示该帧所属的VLAN。VLAN ID取值范围是0~4095。由于0和4095为协议保留取值,所以VLAN ID的有效取值范围是1~4094。

每台支持802.1Q协议的交换机发送的数据包都会包含VLAN ID,以指明交换机属于哪一个VLAN。因此,在一个VLAN交换网络中,以太网帧有以下两种形式:

有标记帧(tagged frame):

加入了4字节802.1Q Tag的帧

无标记帧(untagged frame):

原始的未加入4字节802.1Q Tag的帧

链路类型

  1. 接入链路(Access Link):

用于连接用户主机和交换机的链路。

通常情况下,主机并不需要知道自己属于哪个VLAN,主机硬件通常也不能识别带有VLAN标记的帧。因此,主机发送和接收的帧都是untagged帧。

  1. 干道链路(Trunk Link):

用于交换机间的互连或交换机与路由器之间的连接。

干道链路可以承载多个不同VLAN数据,数据帧在干道链路传输时,干道链路的两端设备需要能够识别数据帧属于哪个VLAN,所以在干道链路上传输的帧都是Tagged帧。

说明:

对于主机来说,它不需要知道VLAN的存在。主机发出的是untagged报文。

交换设备接收到报文后,根据配置规则(如接口信息)判断出报文所属的VLAN后,再进行处理。

如果报文需要通过另一台交换机转发,则该报文必须通过干道链路透传到对端交换设备上。为了保证其它交换设备能够正确处理报文中的VLAN信息,在干道链路上传输的报文必须都打上了VLAN标记。

当交换设备最终确定报文出接口后,将报文发送给主机前,需要将VLAN标记从帧中删除,这样主机接收到的报文都是不带VLAN标记的以太网帧。

所以,一般情况下,干道链路上传输的都是tagged帧,接入链路上传送到的都是untagged帧。这样处理的好处是:网络中配置的VLAN信息可以被所有交换设备正确处理,而主机不需要了解VLAN信息。


Shell 和其他编程语言一样,支持多种运算符,包括:

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awkexprexpr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

两点注意:

  • 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
  • 完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。

算术运算符

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
+ 加法 `expr $a + $b` 结果为 30。
- 减法 `expr $a - $b` 结果为 -10。
* 乘法 `expr $a \* $b` 结果为  200。
/ 除法 `expr $b / $a` 结果为 2。
% 取余 `expr $b % $a` 结果为 0。
= 赋值 a=$b 把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。

注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 **[ $a == $b ]**。

注意:

  • 乘号(*)前边必须加反斜杠(\)才能实现乘法运算;
  • if…then…fi 是条件语句,后续将会讲解。
  • 在 MAC 中 shell 的 expr 语法是:**$((表达式))*,此处表达式中的 ““ 不需要转义符号 “\“ 。

关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。

布尔运算符

下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。

逻辑运算符

以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
| 逻辑的 OR [[ $a -lt 100 | $b -gt 100 ]] 返回 true

字符串运算符

下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:

运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否不相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否不为 0,不为 0 返回 true。 [ -n “$a” ] 返回 true。
$ 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。

文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。

属性检测描述如下:

操作符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

其他检查符:

  • -S: 判断某文件是否 socket。
  • -L: 检测文件是否存在并且是一个符号链接。

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。

shell中函数的定义格式如下:

1
2
3
4
5
6
7
8
9
\[ function \] funname \[()\]

{

    action;

    \[return int;\]

}

说明:

  • 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
  • 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

函数参数

Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…

注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

另外,还有几个特殊字符用来处理参数:

参数处理 说明
$# 传递到脚本或函数的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。

重定向命令列表如下:

命令 说明
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。


输出重定向

重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示:

command1 > file1

上面这个命令执行command1然后将输出的内容存入file1

注意任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符。


输入重定向

和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:

command1 < file1

这样,本来需要从键盘获取输入的命令会转移到文件读取内容。

注意:输出重定向是大于号>,输入重定向是小于号<

重定向深入讲解

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

1
2
3
- 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
- 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
- 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

默认情况下,command > filestdout 重定向到 filecommand < filestdin 重定向到 file


电子邮件是 TCP/IP 最重要的应用之一。


您不会用到…

当您写邮件时,您不会用到 TCP/IP。

当您写邮件时,您用到的是电子邮件程序,例如莲花软件的 Notes,微软公司出品的 Outlook,或者 Netscape Communicator 等等。


邮件程序会用到…

您的电子邮件程序使用不同的 TCP/IP 协议:

  • 使用 SMTP 来发送邮件
  • 使用 POP 从邮件服务器下载邮件
  • 使用 IMAP 连接到邮件服务器

SMTP - 简单邮件传输协议

SMTP 协议用于传输电子邮件。SMTP 负责把邮件发送到另一台计算机。

通常情况下,邮件会被送到一台邮件服务器(SMTP 服务器),然后被送到另一台(或几台)服务器,然后最终被送到它的目的地。

SMTP 也可以传送纯文本,但是无法传输诸如图片、声音或者电影之类的二进制数据。

SMTP 使用 MIME 协议通过 TCP/IP 网络来发送二进制数据。MIME 协议会将二进制数据转换为纯文本。


POP - 邮局协议

POP 协议被邮件程序用来取回邮件服务器上面的邮件。

假如您的邮件程序使用 POP,那么一旦它连接上邮件服务器,您的所有的邮件都会被下载到邮件程序中(或者称之为邮件客户端)。


IMAP - 因特网消息访问协议

与 POP 类似,IMAP 协议同样被邮件程序使用。

IMAP 协议与 POP 协议之间的主要差异是:如果 IMAP 连上了邮件服务器,它不会自动地将邮件下载到邮件程序之中。

IMAP 使您有能力在下载邮件之前先通过邮件服务器端查看他们。通过 IMAP,您可以选择下载这些邮件或者仅仅是删除它们。比方说您需要从不同的位置访问邮件服务器,但是仅仅希望回到办公室的时候再下载邮件,IMAP 在这种情况下会很有用。


TCP/IP 是不同的通信协议的大集合。


协议族

TCP/IP 是基于 TCP 和 IP 这两个最初的协议之上的不同的通信协议的大集合。


TCP - 传输控制协议

TCP 用于从应用程序到网络的数据传输控制。

TCP 负责在数据传送之前将它们分割为 IP 包,然后在它们到达的时候将它们重组。


IP - 网际协议(Internet Protocol)

IP 负责计算机之间的通信。

IP 负责在因特网上发送和接收数据包。


HTTP - 超文本传输协议(Hyper Text Transfer Protocol)

HTTP 负责 web 服务器与 web 浏览器之间的通信。

HTTP 用于从 web 客户端(浏览器)向 web 服务器发送请求,并从 web 服务器向 web 客户端返回内容(网页)。


HTTPS - 安全的 HTTP(HTTP Secure)

HTTPS 负责在 web 服务器和 web 浏览器之间的安全通信。

作为有代表性的应用,HTTPS 会用于处理信用卡交易和其他的敏感数据。


SSL - 安全套接字层(Secure Sockets Layer)

SSL 协议用于为安全数据传输加密数据。


SMTP - 简易邮件传输协议(Simple Mail Transfer Protocol)

SMTP 用于电子邮件的传输。


MIME - 多用途因特网邮件扩展(Multi-purpose Internet Mail Extensions)

MIME 协议使 SMTP 有能力通过 TCP/IP 网络传输多媒体文件,包括声音、视频和二进制数据。


IMAP - 因特网消息访问协议(Internet Message Access Protocol)

IMAP 用于存储和取回电子邮件。


POP - 邮局协议(Post Office Protocol)

POP 用于从电子邮件服务器向个人电脑下载电子邮件。


FTP - 文件传输协议(File Transfer Protocol)

FTP 负责计算机之间的文件传输。


NTP - 网络时间协议(Network Time Protocol)

NTP 用于在计算机之间同步时间(钟)。


DHCP - 动态主机配置协议(Dynamic Host Configuration Protocol)

DHCP 用于向网络中的计算机分配动态 IP 地址。


SNMP - 简单网络管理协议(Simple Network Management Protocol)

SNMP 用于计算机网络的管理。


LDAP - 轻量级的目录访问协议(Lightweight Directory Access Protocol)

LDAP 用于从因特网搜集关于用户和电子邮件地址的信息。


ICMP - 因特网消息控制协议(Internet Control Message Protocol)

ICMP 负责网络中的错误处理。


ARP - 地址解析协议(Address Resolution Protocol)

ARP - 用于通过 IP 来查找基于 IP 地址的计算机网卡的硬件地址。


RARP - 反向地址转换协议(Reverse Address Resolution Protocol)

RARP 用于通过 IP 查找基于硬件地址的计算机网卡的 IP 地址。


BOOTP - 自举协议(Boot Protocol)

BOOTP 用于从网络启动计算机。


PPTP - 点对点隧道协议(Point to Point Tunneling Protocol)

PPTP 用于私人网络之间的连接(隧道)。


TCP/IP 使用 32 个比特或者 4 组 0 到 255 之间的数字来为计算机编址。


IP地址

每个计算机必须有一个 IP 地址才能够连入因特网。

每个 IP 包必须有一个地址才能够发送到另一台计算机。

在本教程下一节,您会学习到更多关于 IP 地址和 IP 名称的知识。


IP 地址包含 4 组数字:

TCP/IP 使用 4 组数字来为计算机编址。每个计算机必须有一个唯一的 4 组数字的地址。

每组数字必须在 0 到 255 之间,并由点号隔开,比如:192.168.1.60。


32 比特 = 4 字节

TCP/IP 使用 32 个比特来编址。一个计算机字节是 8 比特。所以 TCP/IP 使用了 4 个字节。

一个计算机字节可以包含 256 个不同的值:

00000000、00000001、00000010、00000011、00000100、00000101、00000110、00000111、00001000 ……. 直到 11111111。

现在,您应该知道了为什么 TCP/IP 地址是介于 0 到 255 之间的 4 组数字。


IP V6

IPv6 是 “Internet Protocol Version 6” 的缩写,也被称作下一代互联网协议,它是由 IETF 小组(Internet 工程任务组Internet Engineering Task Force)设计的用来替代现行的 IPv4(现行的)协议的一种新的 IP 协议。

我们知道,Internet 的主机都有一个唯一的 IP 地址,IP 地址用一个 32 位二进制的数表示一个主机号码,但 32 位地址资源有限,已经不能满足用户的需求了,因此 Internet 研究组织发布新的主机标识方法,即 IPv6。

在 RFC1884 中(RFC 是 Request for Comments document 的缩写。RFC 实际上就是 Internet 有关服务的一些标准),规定的标准语法建议把 IPv6 地址的 128 位(16 个字节)写成 8 个 16 位的无符号整数,每个整数用 4 个十六进制位表示,这些数之间用冒号(:)分开,例如:

686E:8C64:FFFF:FFFF:0:1180:96A:FFFF

冒号十六进制记法允许零压缩,即一串连续的0可以用一对冒号取代,例如:

FF05:0:0:0:0:0:0:B3可以定成:FF05::B3

为了保证零压缩有一个清晰的解释,建议中规定,在任一地址中,只能使用一次零压缩。该技术对已建议的分配策略特别有用,因为会有许多地址包含连续的零串。

冒号十六进制记法结合有点十进制记法的后缀。这种结合在IPv4向IPv6换阶段特别有用。例如,下面的串是一个合法的冒号十六进制记法:

0:0:0:0:0:0:128.10.1.1

这种记法中,虽然冒号所分隔的每一个值是一个16位的量,但每个分点十进制部分的值则指明一个字节的值。再使用零压缩即可得出:

::128.10.1.1


域名

12 个阿拉伯数字很难记忆。使用一个名称更容易。

用于 TCP/IP 地址的名字被称为域名。baidu.com 就是一个域名。

当你键入一个像 http://www.baidu.com 这样的域名,域名会被一种 DNS 程序翻译为数字。

在全世界,数量庞大的 DNS 服务器被连入因特网。DNS 服务器负责将域名翻译为 TCP/IP 地址,同时负责使用新的域名信息更新彼此的系统。

当一个新的域名连同其 TCP/IP 地址一起注册后,全世界的 DNS 服务器都会对此信息进行更新。


TCP/IP 是用于因特网 (Internet) 的通信协议。


计算机通信协议(Computer Communication Protocol)

计算机通信协议是对那些计算机必须遵守以便彼此通信的的规则的描述。


什么是 TCP/IP?

TCP/IP 是供已连接因特网的计算机进行通信的通信协议。

TCP/IP 指传输控制协议/网际协议(Transmission Control Protocol / Internet Protocol)。

TCP/IP 定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准。


在 TCP/IP 内部

在 TCP/IP 中包含一系列用于处理数据通信的协议:

  • TCP (传输控制协议) - 应用程序之间通信
  • UDP (用户数据报协议) - 应用程序之间的简单通信
  • IP (网际协议) - 计算机之间的通信
  • ICMP (因特网消息控制协议) - 针对错误和状态
  • DHCP (动态主机配置协议) - 针对动态寻址

TCP 使用固定的连接

TCP 用于应用程序之间的通信。

当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方”握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。

这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。

UDP 和 TCP 很相似,但是更简单,同时可靠性低于 TCP。


IP 是无连接的

IP 用于计算机之间的通信。

IP 是无连接的通信协议。它不会占用两个正在通信的计算机之间的通信线路。这样,IP 就降低了对网络线路的需求。每条线可以同时满足许多不同的计算机之间的通信需要。

通过 IP,消息(或者其他数据)被分割为小的独立的包,并通过因特网在计算机之间传送。

IP 负责将每个包路由至它的目的地。


IP 路由器

当一个 IP 包从一台计算机被发送,它会到达一个 IP 路由器。

IP 路由器负责将这个包路由至它的目的地,直接地或者通过其他的路由器。

在一个相同的通信中,一个包所经由的路径可能会和其他的包不同。而路由器负责根据通信量、网络中的错误或者其他参数来进行正确地寻址。


TCP/IP

TCP/IP 意味着 TCP 和 IP 在一起协同工作。

TCP 负责应用软件(比如您的浏览器)和网络软件之间的通信。

IP 负责计算机之间的通信。

TCP 负责将数据分割并装入 IP 包,然后在它们到达的时候重新组合它们。

IP 负责将包发送至接受者。

在局域网环境下,主机之间是通过ARP协议获取对应机器的MAC地址的,ARP交换是在二层网络上面的协议。IP数据包在以太网中传递,但是对于以太网设备是不能识别32位的IP地址的,它只能识别48的物理MAC地址,为此在每一台主机上面都会维护一张从IP地址到物理地址的映射表,而不断更新这个映射表就是ARP(地址解析协议)所需要做的事情,ARP协议位于TCP-IP协议的底层。

ARP协议的主要流程

  • 当网络层的TCP-IP协议封装的数据包传来时,主机A解开对应的数据包,得到对应的主机B的目的IP地址
  • 根据封包中的目的IP地址去检索本地的ARP表,分三种情况处理
    • 如果找到了对应的记录则将对应的目的MAC地址装入到帧数据包,同时将数据包发送至对应的主机;
    • 如果在本地的ARP表中没有对应的映射记录,主机A需要确定对应的目的IP地址和自己是否在同一个子网下,如果在同一个子网下面,则主机A会发起一个ARP Reply的广播封包请求,这个封包会发送至局域网中的每一台机器;进入3
    • 如果不在同一个子网下,则主机A会将ARP Reply封包发给默认网关询问对应的MAC地址
  • 当机器接收到了ARP Reply封包之后,解开封包查看目的IP地址是否为自己的IP地址,如果是则将源MAC地址和IP地址记录在本地的ARP表中(如果已经存在则覆盖),同时回应自己的MAC地址和IP地址响应主机A;如果解开之后的目的IP地址不是自己的地址,则忽略
  • 在发送端收到了对应的ARP响应之后,则将ARP Reply的记录添加到本地的ARP表中,同时用这个目的地址将数据发送至目的主机

举一个例子,如下图

  • 主机A想要访问公网,执行了ping 114.114.114.114的操作
  • A默认会将这个请求包也就是ping包发给网关192.168.10.1,但是主机A并不知道网关的mac地址,于是这个时候A会发送一个ARP Request的广播请求,询问在局域网中IP地址为192.168.10.1的mac地址。
  • 当路由器收到了这个ARP请求之后,发现请求中的ip地址是自己的地址,会回应A,发送一个回应单播包给A,告诉它自己的mac地址是什么。
  • 当A拿到了网关的物理地址后,就可以将icmp的数据包封装并发送到对应的路由器中
  • 路由器解开数据包判断对应的目的地址是什么,然后查看自己本地的路由表进行路由,将请求包转发出去。
  • 路由器在之后接受到了公网回应的icmp回显包的时候,会看到这个回显包的源地址是114.114.114.114,目的地址是192.168.10.3,因为路由器需要查看自己本地的arp表去查看是否有对应的目的地址的匹配表,如果有则将回显包发送到对应的mac地址的机器A,如果没有,就需要在局域网中发送一个arp request的请求,询问A的mac地址。
  • 主机A最后收到了icmp的回显包

在这个过程中,会看到假设说主机A或者路由器在自己本地的arp表中如果没有对应的记录的时候,都需要去询问对应的mac地址并且更新arp表,也就是说arp表示会一致刷新的。

那么在linux系统中,我们的arp表到了什么情况会被清理呢?

在linux系统中,arp表是缓存在内存中的,因此在到了一定的量之后,会有对应的垃圾回收器来回收对应的arp表。对应的配置在一下文件中可以找到

1
2
3
4
5
Debian 9

/proc/sys/net/ipv4/neigh/default/gc_thresh1
/proc/sys/net/ipv4/neigh/default/gc_thresh2
/proc/sys/net/ipv4/neigh/default/gc_thresh3

默认来说他们的值分别为128、512、1024,第一个值的垃圾回收器运行的最低要求,也就是说在arp数目达到了这个值之后才会启动对应的垃圾回收进程,第二个值是一个开始回收的阈值,当arp表的数目超过这个值一定时间(5秒)之后,垃圾回收器就会对arp表进行回收,而第三个值则是一个触发阈值,就是说一旦超过这个值垃圾回收器马上就进行arp的清理,当然在垃圾回收的时候,并不是全部都刷掉的,而是会根据一定的策略进行回收。

ARP欺骗

其实在ARP的整个工作流程中不难看出,其实是存在一定的可乘之机的。也就是说在图中的B主机是可以加入到整个arp工作流程来进行arp欺骗的。

具体的做法如下

  • 在A需要往外发送icmp的一个回显请求报文的时候,主机B发起ARP攻击,重复得发送一个ARP回应包,包的内容为mac:xx:xx:xx:yy:xx ip:192.168.10.1,以此来伪装自己就是网关,让A将数据发给自己
  • 于此同时,主机B也通过回应报文的形式告诉网关也就是路由器,称自己是主机A,具体的报文内容为max: xx:xx:xx:yy:xx ip: 192.168.10.3,这样主机B就达到了数据包嗅探的能力
  • 主机A先将自己的数据包发给B,因为它误以为B是网关,B再将数据转发给路由器,这个时候路由器接收了数据之后将数据转发到公网
  • 这里主机B是完全可以侦听A的数据包的,甚至去篡改A的数据包

下面可以通过linux来模拟这么一个实验

首先安装一个arp攻击的模拟工具包

1
apt install dsniff 

同时在攻击的机器上面打开ip转发

1
echo 1 > /proc/sys/net/ipv4/ip_forward 

然后使用 arpspoof 命令进行欺骗, 命令使用方法如下:

1
arpspoof -i <网卡名> -t <欺骗的目标> <我是谁> 

分别开两个终端:

终端1, 欺骗主机 A 我是网关

1
arpspoof -i eth0 -t 192.168.10.3 192.168.10.1 

终端2, 欺骗网关我是主机 A

1
arpspoof -i eth0 -t 192.168.10.1 192.168.10.3 

这样之后,在主机B上面就可以执行tcpdump或者urlsnarf来侦听数据了

1
apt install tcpdump snarf 

使用tcpdump

1
tcpdump -nntvvv -i eth0 port 8080 

使用urlsnarf

1
urlsnarf -i eth0 

arp欺骗的形式有很多,例如有:中间人攻击、被动式数据嗅探。

如何防御 ARP 欺骗攻击?

  • 可以通过登陆到网关地址所在的机器中(路由器)中修改配置,将ip和mac地址绑定,绑定之后就不会让arp攻击者肆意更改网关所在的arp表了。网络设备例如交换机有一种叫做动态ARP防御的技术叫做DAI,交换机会维护一张ip-mac-port的表,如果在arp询问过程中出现有冲突的就会丢弃。
  • 对于客户机,可以在本地记录mac-ip的对应关系表,当出现欺骗的时候及时发现并且丢弃。这方面可以使用一些软件辅助电脑例如腾讯管家、360。

参考