天天看点

ip_forward与路由转发

一、前言介绍:

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

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

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

<a href="http://s4.51cto.com/wyfs02/M00/8B/45/wKioL1hI896Q9q7IAABV7Z6Rw7o772.png" target="_blank"></a>

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

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

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

对于CentOS系统,CentOS 6 和 CentOS 7开启路由转发的方式有区别:

 1、对于CentOS 6,有三种方法:

  第一种:

<code>[root@centos6 ~]</code><code># echo 1 &gt; /proc/sys/net/ipv4/ip_forward</code>

 第二种:

<code>[root@centos6 ~]</code><code># vim /etc/sysctl.conf  </code>

<code> </code><code>net.ipv4.ip_forward = 0   </code><code>//</code><code>该行的0改为1即可</code>

<code> </code><code>net.ipv4.conf.default.rp_filter = 1</code>

<code> </code><code>net.ipv4.conf.default.accept_source_route = 0</code>

<code> </code><code>kernel.sysrq = 0</code>

<code> </code><code>kernel.core_uses_pid = 1</code>

<code> </code><code>net.ipv4.tcp_syncookies = 1</code>

<code> </code><code>kernel.msgmnb = 65536</code>

<code> </code><code>kernel.msgmax = 65536</code>

<code> </code><code>kernel.shmmax = 68719476736</code>

<code> </code><code>kernel.shmall = 4294967296</code>

<code>[root@centos6 ~]</code><code># sysctl -p   //查看修改结果.</code>

 第三种:

<code>[root@centos6 ~]</code><code># sysctl -w net.ipv4.ip_forward=1</code>

<code>net.ipv4.ip_forward = 1</code>

<code>[root@centos6 ~]</code><code>#   //这种方法我试过,但修改后没生效。以前两种为主吧!</code>

2、对于CentOS7,CentOS 6中的第二种方法不适用,需用如下方法:

<code>[root@CentOS7 ~]</code><code># vim /etc/sysctl.d/99-sysctl.conf </code>

<code> </code><code>...</code>

<code> </code><code>结尾添加:</code>

<code> </code><code>net.ipv4.ip_forward = 1</code>

<code>:wq</code>

<code>[root@CentOS7 ~]</code><code># sysctl -p</code>

<code>net.ipv4.ip_forward = 1   </code><code>//</code><code>查看修改结果.</code>

<code>[root@CentOS7 ~]</code><code>#</code>

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

实验环境:

主机  --  系统  --  主机名  --  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

相关配置如下:

首先开启网关服务器的路由转发功能:

<code>[root@gateway ~]</code><code># sysctl -p</code>

<code>[root@gateway ~]</code><code>#</code>

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

<code>[root@local_host ~]</code><code># route add default gw 10.68.7.107</code>

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

<code>[root@pub_host ~]</code><code># route add default gw 192.168.1.200</code>

通过ping测试连通性:

<code>[root@local_host ~]</code><code># ping 192.168.1.201</code>

<code>PING 192.168.1.201 (192.168.1.201) 56(84) bytes of data.</code>

<code>64 bytes from 192.168.1.201: icmp_seq=1 ttl=63 </code><code>time</code><code>=0.742 ms</code>

<code>64 bytes from 192.168.1.201: icmp_seq=2 ttl=63 </code><code>time</code><code>=1.38 ms</code>

<code>64 bytes from 192.168.1.201: icmp_seq=3 ttl=63 </code><code>time</code><code>=2.64 ms</code>

<code>64 bytes from 192.168.1.201: icmp_seq=4 ttl=63 </code><code>time</code><code>=2.06 ms</code>

<code>...</code>

<code>[root@pub_host ~]</code><code># ping 10.68.7.234</code>

<code>PING 10.68.7.234 (10.68.7.234) 56(84) bytes of data.</code>

<code>64 bytes from 10.68.7.234: icmp_seq=1 ttl=63 </code><code>time</code><code>=0.568 ms</code>

<code>64 bytes from 10.68.7.234: icmp_seq=2 ttl=63 </code><code>time</code><code>=1.49 ms</code>

<code>64 bytes from 10.68.7.234: icmp_seq=3 ttl=63 </code><code>time</code><code>=3.48 ms</code>

<code>64 bytes from 10.68.7.234: icmp_seq=4 ttl=63 </code><code>time</code><code>=3.65 ms</code>

<code>64 bytes from 10.68.7.234: icmp_seq=5 ttl=63 </code><code>time</code><code>=2.20 ms</code>

验证成功!

本文转自 羽丰1995 51CTO博客,原文链接:http://blog.51cto.com/13683137989/1880744

继续阅读