实战中学习TCPIP模型——互联网层

文章目录

实战中学习TCP/IP模型——互联网层

学习一个复杂的概念,我有一些经验与大家分享。了解技术出现要解决的问题,知道解决这问题实施的步骤,列出技术的特点。也就是对自己的经典三问:Why? How ? Feature?

Why?

​ 互联网层最重要的协议是IP协议(Internet Protocol)。那么IP协议解决什么问题呢?我们知道,数据的传播分为单播,广播和组播。单播指向目标主机的MAC地址,广播则是对自身数据包进行标记,让所有主机都来处理。当前我国互联网用户超过8亿,如果每人1天发送1条广播,那么平均每人每分钟处理的广播数量为800,000,000/(3600*24),接近1万个广播。这无疑是对网络资源的巨大浪费,同时也无法防止滥发小广告式式的恶意骚扰。

​ 因此,既要保证单播正常运行,又要控制广播影响范围是互联网层要解决的基本问题,一代又一代的大佬们,都选择了IP协议。

HOW?

隔离广播——划分子网

​ 为了隔离广播,IP协议使用IP地址将整个互联网层划分成了多个子网,主机发送的广播只能在子网内。

范围寻址——路由表

​ 获取目标IP的mac地址的ARP服务是依赖广播的,广播被子网隔断后,如何获取其它子网的IP地址对应的mac地址就成了新问题。

​ 每个子网都有一个网关,承载它的网络设备一般是路由器。当ARP服务所需的IP不在子网内时,广播会被发送到网关路由器。路由器通过路由表,寻找目标IP对应子网段的路由器。这样广播就只在路由器间传递,同时又解决了实现单播所必须的ARP寻址问题。

#路由表查看
route -n

#路由表增加

#增加直连路由
route add -net 192.168.0.0/24 gw 172.16.0.1 dev eth0

#增加默认路由
route add -net 0.0.0.0/0 gw 172.16.0.1
route add default gw 172.16.0.1			#推荐

#路由表删除
route del -net 192.168.122.0/24
route del default

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w6wIr5j6-1608369479755)(https://i.loli.net/2020/10/28/U8Dbcjao1MSgZ7h.png)]

一个路由表通常是这样的,图中代表10.0.0.0/24,192.168.122.0/24这两个网段,网关为0.0.0.0,即可以直接发送广播;其它网段需要将数据包发送给10.0.0.2这台主机。

实战:使用三台Linux主机作为路由器,使得两台Linux主机,IP分别为172.16.0.100/16,172.22.0.100/16能够相互通信。

环境搭建

配置网段

克隆三台虚拟机,每台虚拟机增加额外1张网卡。VMware配置子网,vmnet3,vmnet4,vmnet5,vmnet6

网络名称 网段
vmnet3 172.16.0.0/16
vmnet4 172.18.0.0/16
vmnet5 172.20.0.0/16
vmnet6 172.22.0.0/16
配置网卡

对五台主机配置双网卡,网络详情见下表。

主机名 eth0 eth1
CentOS6 10.0.0.6/24 172.16.0.100/16
CentOS7 10.0.0.7/24 172.22.0.100/16
R1 172.16.0.200/16 172.18.0.200/16
R2 172.18.0.201/16 172.20.0.200/16
R3 172.20.20.201/16 172.22.0.200/16

网络拓扑见图1-1。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c05kbUWK-1608369479758)(https://i.loli.net/2020/12/14/9HOAcoQgtkdXWC2.png)]

​ 图1-1

通过修改配置文件/etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth1两份配置文件完成

配置完成后,应该验证同一网段的网络是否能够连通,以验证配置的正确性。

#CentOS6与R1的网络验证
#-c 执行一次
#-W 时间窗口为1s,指超过1秒后没有响应则认为响应超时。
ping 172.16.0.200 -c1 -W1

#R1与R2的网络验证
ping 172.18.0.201 -c1 -W1

#R2与R3的的网络验证
ping 172.20.0.201 -c1 -W1

#R3与CentOS7的的网络验证
ping 172.22.0.100 -c1 -W1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WVJcKh7O-1608369479759)(https://i.loli.net/2020/12/14/TVkFN8uR4yEvDQH.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DE81qhDN-1608369479760)(https://i.loli.net/2020/12/14/ze4HFTvLoOrdBiV.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WvpaVQFr-1608369479761)(https://i.loli.net/2020/12/14/k9No8jyJ6lXCia7.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JE4hYdn5-1608369479763)(https://i.loli.net/2020/12/14/Fio7JgbjNaP1X5e.png)]

路由配置思路

主机172.16.0.100,主机名Centos6想要与主机172.22.0.100,主机名为Centos7通信,需要跨过的路由器R1,R2,R3,共172.16.0.0,172.18.0.0,172.20.0.0,172.22.0.0四个网段,配置路由表时要考虑这四个网段互通。

主机CentOS6

CentOS6应该要能与外网通信,与内网通信。

与外网通信,使用网关10.0.0.1/24,即宿主机作为NAT网关。

与内网的四个网段通信,172.16.0.0/16在与主机在同一网段,应该使用广播,即gw为0.0.0.0,与其它三个内网网段通信需要通过R1转发,与eth1直连的网卡为R1主机的eth0网卡,IP地址为172.16.0.200。

所以Centos6的路由表应该是

目标 网关 接口
default(与互联网通信) 10.0.0.1 eth0
172.16.0.0/16 0.0.0.0 eth1
172.18.0.0/16 172.16.0.200 eth1
172.20.0.0/16 172.16.0.200 eth1
172.22.0.0/16 172.16.0.200 eth1
路由器R1

路由器应该能与外网通信,与内网通信。

与外网通信,可以通过CentOS6主机转发,所以使用网关172.16.0.100

与内网通信,也需要配置四个网段的路由表。

因为有两块网卡分别配置为172.16.0.0/16和172.18.0.0/16。所以这两个网段的通信是使用广播,无需配置,路由表会自动生成。所以仅需配置172.20.0.0/16和172.22.0.0/16。

后两个网段连接都是通过R2的网卡eth0,所以网关地址为172.18.0.201

目标 网关 接口
default(与互联网通信) 172.16.0.100 eth0
172.16.0.0/16 0.0.0.0 eth1
172.18.0.0/16 0.0.0.0 eth1
172.20.0.0/16 172.18.0.201 eth1
172.22.0.0/16 172.18.0.201 eth1
路由器R2

与外网通信统一走CentOS6,通过R1传输,所以网关为R1的eth1。

18网段和20网段为同一子网,不需要配置。

16网段需通过R1的eth1,22网段需通过R3的eth0,所以获取相应的IP地址即可

目标 网关 接口
default(与互联网通信) 172.18.0.200 eth0
172.16.0.0/16 172.18.0.200 eth0
172.18.0.0/16 0.0.0.0 eth1
172.20.0.0/16 0.0.0.0 eth1
172.22.0.0/16 172.20.0.201 eth1
路由器R3

R3的配置与R1对称,访问其余网段均通过R2的eth1网口172.20.0.200。

目标 网关 接口
default(与互联网通信) 172.20.0.200 eth0
172.16.0.0/16 172.20.0.200 eth0
172.18.0.0/16 172.20.0.200 eth0
172.20.0.0/16 0.0.0.0 eth0
172.22.0.0/16 0.0.0.0 eth1
CentOS7主机

与CentOS7主机对称,使用宿主机网关访问互联网,使用R3的eth1网卡与内网通信。

目标 网关 接口
default(与互联网通信) 10.0.0.1 eth0
172.16.0.0/16 172.22.0.200 eth1
172.18.0.0/16 172.22.0.200 eth1
172.20.0.0/16 172.22.0.200 eth1
172.22.0.0/16 0.0.0.0 eth1

路由配置命令

route命令配置路由表(临时)
#route命令常见用法
#增
#增加默认路由
route add default gw 172.22.0.100
#增加网段
route -net 172.22.0.0/16 gw 172.22
#删
#删除默认路由
route del default
#删除网段
route del 172.22.0.0/16 gw 172.22.0.100
#改
#没有修改选项,只能删除后新增

#查
route -n

#route修改的路由表只在内存中,不能永久生效。
配置文件配置路由表(永久)
#配置文件/etc/sysconfig/network
#格式与ip命令配置路由表一致

#通往172.22.0.0/16网段,使用网关为172.18.0.201,后面的网卡可以省略
172.22.0.0/16 via 172.18.0.201 [dev interface]

#通往默认路由,使用网关为172.16.0.0
default via 172.16.0.0

配置过程

#CentOS6配置文件/etc/sysconfig/network-scripts/route-eth0
default via 10.0.0.1
#CentOS6配置文件/etc/sysconfig/network-scripts/route-eth1
172.18.0.0/16 via 172.16.0.200
172.20.0.0/16 via 172.16.0.200
172.22.0.0/16 via 172.16.0.200

#R1配置文件/etc/sysconfig/network-scripts/route-eth0
default via 172.16.0.100

#R1配置文件/etc/sysconfig/network-scripts/route-eth1
172.20.0.0/16 via 172.18.0.201
172.22.0.0/16 via 172.18.0.201

#R2配置文件/etc/sysconfig/network-scripts/route-eth0
default via 172.18.0.200
172.16.0.0/16 via 172.18.0.200

#R2配置文件/etc/sysconfig/network-scripts/route-eth1
172.22.0.0/16 via 172.20.0.201

#R3配置文件/etc/sysconfig/network-scripts/route-eth0
default via 172.20.0.200
172.16.0.0/16 via 172.20.0.200
172.18.0.0/16 via 172.20.0.200

#CentOS7配置文件/etc/sysconfig/network-scripts/route-eth0
default via 10.0.0.1

#CentOS7配置文件/etc/sysconfig/network-scripts/route-eth1
172.16.0.0/16 via 172.22.0.200
172.18.0.0/16 via 172.22.0.200
172.20.0.0/16 via 172.22.0.200

代码段
#CentOS6
cat <<EOF >>/etc/sysconfig/network-scripts/route-eth0
default via 10.0.0.1
EOF

cat <<EOF >>/etc/sysconfig/network-scripts/route-eth1
172.18.0.0/16 via 172.16.0.200
172.20.0.0/16 via 172.16.0.200
172.22.0.0/16 via 172.16.0.200
EOF

#R1
cat <<EOF >>/etc/sysconfig/network-scripts/route-eth0
default via 172.16.0.100
EOF

cat <<EOF >>/etc/sysconfig/network-scripts/route-eth1
172.20.0.0/16 via 172.18.0.201
172.22.0.0/16 via 172.18.0.201
EOF


#R2
cat <<EOF >>/etc/sysconfig/network-scripts/route-eth0
default via 172.18.0.200
172.16.0.0/16 via 172.18.0.200
EOF

cat <<EOF >>/etc/sysconfig/network-scripts/route-eth1
172.22.0.0/16 via 172.20.0.201
EOF

#R3
cat <<EOF >>/etc/sysconfig/network-scripts/route-eth0
default via 172.20.0.200
172.16.0.0/16 via 172.20.0.200
172.18.0.0/16 via 172.20.0.200
EOF

#CentOS7
cat <<EOF >>/etc/sysconfig/network-scripts/route-eth1
172.16.0.0/16 via 172.22.0.200
172.18.0.0/16 via 172.22.0.200
172.20.0.0/16 via 172.22.0.200
EOF

配置路由转发

路由表配置完毕后,重启主机

尝试在CentOS6与CentOS7通信

#CentOS7
ping 172.16.0.100 

实战中学习TCPIP模型——互联网层

未能成功,在R1,R2,R3上抓包,确认包是否成功发送。

#R1 R2 R3
tcpdump -i eth1 -nn icmp

在R3上发现包已经发送,R1和R2没有接收到。这是因为使用操作系统并不是真正的路由器,在处理单波时,会自动丢弃不是发给本机的数据包。解决方式是修改内核参数net.ipv4.ip_forward

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rNJxkhRG-1608369479764)(https://i.loli.net/2020/12/19/9bT5JsSFgjEW61N.png)]

临时修改net.ipv4.ip_forward
echo 1 > /proc/sys/net/ipv4/ip_forward

可以看到修改完后,R2立刻收到了数据包。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gs43WRLG-1608369479764)(https://i.loli.net/2020/12/19/BQV6RP3yOHuJiGL.png)]

当R1重新配置完后,再次从CentOS7尝试与CentOS6通信,发现已经成功。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UgWH6aA6-1608369479765)(https://i.loli.net/2020/12/19/9tyjQdcBNvwGOC4.png)]

配置永久生效
#内核参数修改
#查看
sysctl -a | grep ip_forwad
#修改配置文件
#自定义配置文件为/etc/sysctl.d/xxx.conf,使用这种配置文件的好处是想要恢复为默认状态,直接将该文件删除即可
#默认的配置文件为/etc/sysctl.conf,不建议修改它。
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.d/env.conf
上一篇:TcpIp


下一篇:Android(java)学习笔记243:多媒体之视频播放器