文章目录
实战中学习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
未能成功,在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