route
add
default
via
10.2.1.254
设置默认路由指向硬件防火墙
#echo
1
>
/proc/sys/net/ipv4/ip_forward
开启路由转发功能,重启失效
需关闭linux的iptable或iptable的FORWARD默认策略为ACCEPT或具体设置FORWARD
Linux 路由需要记住两点:跨网段通信需要经过路由;Linux 本身就是一台路由器。
开启路由功能
$ cat/proc/sys/net/ipv4/ip_forward
如果值为 1,表示开启了路由功能,如未开启,需要在 /etc/sysctl.conf 中设置:
net.ipv4.ip_forward=1
然后执行 sysctl -p 使之生效。
实践
创建两个网络 namespace:
$ ip netns add ns1
$ ip netns add ns2
创建两对 veth-pair,一端分别挂在两个 namespace 中:
$iplinkadd v1type veth peer name v1_r$iplinkadd v2type veth peer name v2_r$iplink setv1netns ns1$iplink setv2netns ns2
分别给两对 veth-pair 端点配上 IP 并启用:
$ ip a a 10.10.10.1/24 dev v1_r$ ip l s v1_r up$ ip a a 10.10.20.1/24 dev v2_r$ ip l s v2_r up$ ip netnsexecns1 ip a a 10.10.10.2/24 dev v1$ ip netnsexecns1 ip l s v1 up$ ip netnsexecns2 ip a a 10.10.20.2/24 dev v2$ ip netnsexecns2 ip l s v2 up
测试:
$ ip netnsexecns1 ping 10.10.20.2
发现不通。
添加路由
查看路由:
$ ip netnsexecns1 route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 v1
只有一条直连路由,没有去往 10.10.20.0/24 网段的路由,怎么通?那就给它配一条:
$ ip netnsexecns1 route add -net 10.10.20.0 netmask 255.255.255.0 gw 10.10.10.1$ ip netnsexecns1 route -n
同理也给 ns2 配上去往 10.10.10.0/24 网段的路由:
$ ip netnsexecns2 route add -net 10.10.10.0 netmask 255.255.255.0 gw 10.10.20.1$ ip netnsexecns2 route -n
再次测试,发现可以 ping 通了:
$ ip netnsexecns1 ping 10.10.20.2
总结
Linux 本身是一台路由器。
上面的实验使用 namespace 效果和使用虚拟机是一样的,关键是知道有这个功能,知道怎么用就差不多了。
之前在调试Linux多网卡驱动时,想在应用层实现默认网关的自动切换,需要了解路由的知识,特此总结。
路由是指数据包从源节点到目的节点过程中,决定端到端路径的行为。说白了,就是数据在网络中从一个主机到另一个主机的传递路径。举个例子,我上班需要从家(A)走到公交站(B)坐130路车到大公司(C),那么我上班的路由就是A ->B ->C。
可以理解成是保存某个主机的所有路由信息的集合。还是说上班那个例子,我也可以从家里(A)走到公家站(B)先坐220路车到达山东路公交站(B1),再转106路车到达公司(C),所以A ->B ->B1 ->C也是一条路由信息,那么这两条路由信息都属于我的路由表。
路由器主要负责查询数据在网络中的传递路由信息,并完成数据包的投递。再举个公交车的例子,假如有一天我想去五四广场(D)玩,但不知道坐哪路车,所以我先从家里(A)走到公交站(B),查了一下站牌信息,需要做128路车到达,接着我就等车来然后坐车抵达目的地。在这个情景中,公交站就相当于路由器,帮我查到坐车信息并经此抵达,相应的A ->B ->D就是对应的路由。
以上只是对这几个重要概念的简单理解,真实网络环境中肯定要复杂许多。
正常情况下,嵌入式板子有一个网卡就够用了,要么WiFi,要么以太网。但有时候需要多个网卡的情况,以连接不同的子网。运行ifconfig命令可以查看系统网卡信息:
上面信息表明我的系统中有两个以太网卡,一个网络接口连到 192.168.10.* 段网络,另一个网络接口连到 192.168.56.* 段网络。再来看一下路由表信息,运行route命令可以查看:
上述 route 命令输出信息中各项的含义请看下表:
可以看到路由表里有4条路由信息。如果要发送的数据包的目的地址是192.168.56.8,跟第一条路由信息的子网掩码做与运算得到192.168.56.0,可判断与路由信息中目的网络地址不符;再跟第二条路由信息的子网掩码做与运算得到192.168.56.0,正是第二行的目的网络地址,因此数据从eth1网卡发送出去,由于192.168.56.0正是与eth1接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发。如果要发送的数据包的目的地址是114.114.114.114,跟前三条路由表条目都不匹配,那么就要按缺省路由信息,从eth0网卡发出去,首先发往地址为192.168.10.1的路由器,再让路由器根据它的路由表决定下一跳地址。
通过上面的分析可以发现,若使网络中任意两个节点能够通信,要么在路由表有对应的路由信息,要么通过默认网关进行转发。
纯个人理解,如有问题,欢迎指正~~~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)