一、前言介绍:

IP地址分为公有ip地址和私有ip地址,Public Address是由INIC(internet network information center)负责的,这些IP地址分配给了注册并向INIC提出申请的组织机构。Private Address属于非注册地址,专门为组织内部使用。Private Address是不可能直接用来跟WAN通信的,要么利用帧来通信(FRE帧中继,HDLC,PPP),要么需要路由的转发(nat)功能把私有地址转换为公有地址才行。

出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。

二、路由转发的工作原理:

image.png
首先内网主机向外网主机发送数据包,由于内网主机与外网主机不在同一网段,所以数据包暂时发往内网默认网关GIP处理,而本网段的主机对此数据包不做任何回应。由于内网主机的SIP是私有的,禁止在公网使用,所以必须将数据包的SIP修改成公网上的可用IP,这就是网关收到数据包之后首先要做的事情—IP地址转换。然后网关再把数据包发往外网主机。外网主机收到数据包之后,只认为这是网关发送的请求,并不知道内网主机的存在,更不知道源IP地址是SIP而不是FIP,也没必要知道,目的主机处理完请求,把回应信息发还给网关的FIP。网关收到后,将目的主机返回的数据包的目标IP即FIP修改为发出请求的内网主机的IP地址即SIP,并根据路由表将其发给内网主机。这就是网关的第二个工作—数据包的路由转发。内网主机只要查看数据包的DIP与发送请求的SIP相同,就会回应,这就完成了一次请求。

三、配置Linux系统的IP转发功能:

首先保证硬件连通,然后打开系统的转发功能:

临时生效的配置方式

临时生效的配置方式,在系统重启,或对系统的网络服务进行重启后都会失效。这种方式可用于临时测试、或做实验时使用。
sysctl 命令的 -w 参数可以实时修改Linux的内核参数,并生效。所以使用如下命令可以开发Linux的路由转发功能。

  1. sysctl -w net.ipv4.ip_forward=1

修改内核参数的映射文件

内核参数在Linux文件系统中的映射出的文件:/proc/sys/net/ipv4/ip_forward中记录了Linux系统当前对路由转发功能的支持情况。文件中的值为0,说明禁止进行IP转发;如果是1,则说明IP转发功能已经打开。可使用vi编辑器修改文件的内容,也可以使用如下指令修改文件内容:

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

永久生效的配置方式

永久生效的配置方式,在系统重启、或对系统的网络服务进行重启后还会一直保持生效状态。这种方式可用于生产环境的部署搭建。
在sysctl.conf配置文件中有一项名为net.ipv4.ip_forward的配置项,用于配置Linux内核中的net.ipv4.ip_forward参数。其值为0,说明禁止进行IP转发;如果是1,则说明IP转发功能已经打开。
需要注意的是,修改sysctl.conf文件后需要执行指令sysctl -p 后新的配置才会生效。

  1. [root@CentOS7 ~]# vim /etc/sysctl.d/99-sysctl.conf
  2. ...
  3. 结尾添加:
  4. net.ipv4.ip_forward = 1
  5. :wq
  6. [root@CentOS7 ~]# sysctl -p
  7. net.ipv4.ip_forward = 1 //查看修改结果.

四、配置开启路由转发功能,实现两台不同网段的主机实现通信

实验环境:

主机 — 系统 — 主机名 — ip :

内网主机 — CentOS 6.7 — local_host — 10.68.7.234

外网主机 — CentOS 6.7 — pub_host — 192.168.1.201

网关主机 — CentOS 7.1 — gateway — 内网ip:10.68.7.107 —外网ip:192.168.1.200

相关配置如下:
首先开启网关服务器的路由转发功能:

  1. [root@gateway ~]# sysctl -p
  2. net.ipv4.ip_forward = 1
  3. [root@gateway ~]#

在内网主机配置到内网网关的默认路由:

  1. [root@local_host ~]# route add default gw 10.68.7.107

在外网主机配置到外网网关的默认路由:

  1. [root@pub_host ~]# route add default gw 192.168.1.200

通过ping测试连通性:

  1. [root@local_host ~]# ping 192.168.1.201
  2. PING 192.168.1.201 (192.168.1.201) 56(84) bytes of data.
  3. 64 bytes from 192.168.1.201: icmp_seq=1 ttl=63 time=0.742 ms
  4. 64 bytes from 192.168.1.201: icmp_seq=2 ttl=63 time=1.38 ms
  5. 64 bytes from 192.168.1.201: icmp_seq=3 ttl=63 time=2.64 ms
  6. 64 bytes from 192.168.1.201: icmp_seq=4 ttl=63 time=2.06 ms
  1. [root@pub_host ~]# ping 10.68.7.234
  2. PING 10.68.7.234 (10.68.7.234) 56(84) bytes of data.
  3. 64 bytes from 10.68.7.234: icmp_seq=1 ttl=63 time=0.568 ms
  4. 64 bytes from 10.68.7.234: icmp_seq=2 ttl=63 time=1.49 ms
  5. 64 bytes from 10.68.7.234: icmp_seq=3 ttl=63 time=3.48 ms
  6. 64 bytes from 10.68.7.234: icmp_seq=4 ttl=63 time=3.65 ms
  7. 64 bytes from 10.68.7.234: icmp_seq=5 ttl=63 time=2.20 ms

验证成功!
参考:
https://blog.51cto.com/13683137989/1880744