本文假设已经具备基本的路由交换基础。个人学习记录,欢迎指正。
Linux其实原生就是一台路由器,只是默认他只转发自身包含的地址段的流量,要想实现转发非自身(非默认名称空间)的数据包,需要开启路由转发功能。
学过数通的同学肯定记得,路由器中有VRF来实现路由表的隔离实现虚拟路由,Linux中其实也有该项技术,但是这里我们主要是让Linux实现路由器功能,暂不涉及隔离相关问题。后续会单独整理Linux中VRF的实现。
操作路由
# 开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward # 临时开启
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf # 永久开启
sysctl -p /etc/sysctl.conf
# 添加路由
ip route add default via x.x.x.x dev ethx # 添加默认路由
ip route add 1.1.1.1/32 via x.x.x.x dev ethx # 添加明细路由
ip route add blackhole 1.1.1.2/32 # 添加黑洞路由
# 查看路由
ip route show
# 删除路由
ip route del blackhole 1.1.1.2/32
模拟路由转发实现
之前我们测试了Bridge这个虚拟设备,实现了二层的转发和vlan tag过滤等功能。因为默认我们创建的Bridge都是在默认网络名称空间创建的,他们的协议栈是同一空间,所以逻辑上所有交换机都是通过默认协议栈连接在一块的。当打开路由转发功能之后,Bridge更像是一台三层交换,流量会触发三层寻路,就会查找的路由表实现转发。
拓扑如图,我们给BR配置IP地址,也就是下层网络的出口网关。给默认名称空间打开路由转发功能之后,这时候逻辑上就相当于一个大路由器,BR可以简单理解成vlan interface(这里只是为了方便理解)。
# 打开路由转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 创建ns,模拟终端
ip netns add ns1
ip netns add ns2
# 创建BR设备,配置并启用
ip link add BR1 type bridge
ip link set BR1 up
ip addr add 10.0.1.1/24 dev BR1
ip link add BR2 type bridge
ip link set BR2 up
ip addr add 10.0.2.1/24 dev BR2
# 创建veth
ip link add veth1 type veth peer name veth11
ip link add veth2 type veth peer name veth22
# 如图分配veth到ns设备,配置并启用
ip link set dev veth11 netns ns1
ip netns exec ns1 ip addr add 10.0.1.2/24 dev veth11
ip netns exec ns1 ip link set veth11 up
ip link set dev veth22 netns ns2
ip netns exec ns2 ip addr add 10.0.2.2/24 dev veth22
ip