linux配置主机路由转发

基础太薄弱,最近做一个关于主机路由转发的东西折腾了挺久。做个记录 😕

默认网关、路由 区别

两者其实是一类功能,在不同应用的产生的不同叫法。

内网主机向公网发送数据包时,由于目的主机跟源主机不在同一网段,所以数据包暂时发往内网默认网关处理,而本网段的主机对此数据包不做任何回应。

由于源主机ip是私有的,禁止在公网使用,所以必须将数据包的源发送地址修改成公网上的可用ip,这就是网关收到数据包之后首先要做的工作–ip转换。

然后网关再把数据包发往目的主机。目的主机收到数据包之后,只认为这是网关发送的请求,并不知道内网主机的存在,也没必要知道,目的主机处理完请求,把回应信息发还给网关。网关收到后,将目的主机发还的数据包的目的ip地址修改为发出请求的内网主机的ip地址,并将其发给内网主机。

这就是网关的第二个工作–数据包的路由转发。内网的主机只要查看数据包的目的ip与发送请求的源主机ip地址相同,就会回应,这就完成了一次请求。 出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将包发往本机另一网卡,该网卡根据路由表继续发送数据包。这通常就是路由器所要实现的功能。

场景介绍

以下图为例
一共有三个场景:

  • 场景一:右上角为路由器做转发无需任何配置的局域网,

  • 场景二:其下为三台主机分别桥接的局域网,其中n10左右桥接的两个网卡对应两个网段,n10做路由转发

  • 场景三: 左边的场景为上方桥接局域网与下方桥接局域网通过中间两台机器的无线互相转发路由

配置主机路由转发

Linux系统缺省并没有打开IP转发功能,要确认IP转发功能的状态,可以查看/proc文件系统, 使用下面命令: cat /proc/sys/net/ipv4/ip_forward 查看是否开启

在测试中是n10 n1 n4 都开启了IP forward
这里采用core仿真的配置来设定转发

# auto-generated by IPForward service (utility.py)
sysctl -w net.ipv4.conf.all.forwarding=1
sysctl -w net.ipv4.conf.default.forwarding=1

sysctl -w net.ipv6.conf.all.forwarding=1
sysctl -w net.ipv6.conf.default.forwarding=1

sysctl -w net.ipv4.conf.all.send_redirects=0
sysctl -w net.ipv4.conf.default.send_redirects=0
sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf.default.rp_filter=0

sysctl -w net.ipv4.conf.eth0.forwarding=1
sysctl -w net.ipv4.conf.eth0.send_redirects=0
sysctl -w net.ipv4.conf.eth0.rp_filter=0

sysctl -w net.ipv4.conf.eth1.forwarding=1
sysctl -w net.ipv4.conf.eth1.send_redirects=0
sysctl -w net.ipv4.conf.eth1.rp_filter=0

配置后主机就开启了上面路由器默认开启的路由转发服务(ip_forward)

配置转发网关路由

经过多次测试,发现一直钻了死胡同,只配中转的路由而不是网关路由所以没有将路由转发出去。抓n10包只有一端有数据,还以为是网卡转发未开启成功。

错误复盘:
场景二节点 n6 n7配默认路由都是指向自己的网卡,以为只要配n10的路由转发就能正确传输。
即在n10设定右边网卡收到的10.0.0.0/24网段全由左网卡出去,左网卡收到的10.0.2.0/24由右边网卡发出。
这样是无法通过测试的。

对于节点n6,只配默认路由到本地网卡10.0.2.20是无法让主机n10转发该数据的,应该配n6路由为下一跳网关。
n10无需配置路由只要开ip转发即可。  

其实仔细想想,本地路由只是针对当前网段局域网内的转发,跨网段会找不到路直接丢弃包的

路由配置方法,统一使用 ip route,route命令当然也可配置,不推荐。

  • 在场景2中

    # (网关ip要为下一跳地址) 
    # 配置到网段的静态路由
    ip route add 10.0.2.20/24 via 10.0.0.20
    # 配置特定到特定主机的网关/路由
    ip route add ip 目标主机 via 网关
    # 配置默认网关/路由 
    ip route add default via 10.0.2.21
    
  • 在场景3中,类比场景2

    分别配置  
    n2 -> n4  
    n4 -> n1  
    n1 -> n4  
    n11 ->n1  
    这四条默认网关即可