手把手教你实现Docker部署Redis集群( 三 )

ip netns exec netns1 ip link show当然 , 在docker里面 , 除了将Veth放入容器 , 还改名为eth0 。 想要通信必须先分配IP地址:
ip netns exec netns1 ip addr add 10.1.1.1/24 dev veth1ip addr add 10.1.1.2/24 dev veth0启动它们:
ip netns exec netns1 ip link set dev veth1 upip link set dev veth0 up测试通信:
ip netns exec netns1 ping 10.1.1.2Veth Pair查看端对端在实际操作Veth Pair时 , 可以使用ethtool便于操作 。
在一个Namespace中查看Veth Pair接口在设备列表中的序列号:
ip netns exec netns1 ethtool -S veth1如果得知另一端的接口设备序列号 , 假如序列号为6 , 则可以继续查看6代表了什么设备:
ip netns exec netns2 ip link | grep 6Iptables/NetfilterLinux协议栈非常高效且复杂 。 如果我们想要在数据处理过程中对关心的数据进行一些操作 , 则需要Linux提供一套相应的机制帮助用户实现自定义的数据包处理过程 。
在Linux网络协议栈有一组网络回调函数挂接点 , 通过这些挂接点函数挂接的钩子函数可以在Linux网络栈处理数据包的过程中对数据包一些操作 , 例如过滤、修改、丢弃等 。 整个挂接点技术叫做Iptables和Netfilter 。
Netfilter负责在内核中执行各种各样的挂接规则 , 运行在内核模式中 。 而Iptables是在用户模式下运行的进程 , 负责协助维护内核中Netfilter的各种规则表 。 通过二者的配合来实现整个Linux网络协议栈中灵活的数据包处理机制 。
手把手教你实现Docker部署Redis集群文章插图
规则表Table这些挂载点能挂接的规则也分不同的类型 , 目前主要支持的Table类型如下:
?RAW?MANGLE?NAT?FILTER
上述4个规则链的优先级是RAW最高 , FILTER最低 。
在实际应用中 , 不同挂接点需要的规则类型通常不同 。 例如 , 在Input的挂接点上明显不需要FILTER的过滤规则 , 因为根据目标地址 , 已经在本机的上层协议栈了 , 所以无需再挂载FILTER过滤规则 。
RouteLinux系统包含了一个完整的路由功能 。 当IP层在处理数据发送或者转发时 , 会使用路由表来决定发往哪里 。 通常情况下 , 如果主机与目的主机直接相连 , 那么主机可以直接发送IP报文到目的主机 。
路由功能是由IP层维护的一张路由表来实现 。 当主机收到数据报文时 , 它用此表来决策接下来应该做什么操作 。 当从网络侧接收到数据报文时 , IP层首先会检查报文的IP地址是否与主机自身的地址相同 。 如果数据报文中的IP地址是自身主机的地址 , 那么报文将被发送到传输层相应的协议栈中去 。 如果报文中的IP地址不是主机自身的地址 , 并且配置了路由功能 , 那么报文将被转发 , 否则报文将被丢弃 。
路由表的数据一般以条目形式存在 , 一个典型的路由表条目通常包含以下主要的条目项:
?目的IP地址?下一个路由器的IP地址?标志?网络接口规范
通过路由表转发时 , 如果任何条目的第一个字段完全匹配目标条目的IP地址(主机)或部分匹配(网络) , 那么它将指示下一个路由器的IP地址 。 这些信息将告诉主机数据包该转发到哪一个“下一个路由器” 。 而条目中所有其它字段将提供更多的辅助信息来为路由转发做决定 。
如果没有一个完全匹配的IP , 则继续搜索网络ID 。 找到则转发数据到指定路由器上 。 由此可知 , 网络上所有主机都是通过这个路由表中的单个条目进行管理 。
如果上述两个条件都不匹配 , 则将数据报文转发到一个默认路由器上 。
如果上述步骤失败 , 默认路由器也不存在 , 那么这个数据报文无法转发 。 任何无法投递的数据都会产生一个ICMP主机不可达或者ICMP网络不可达的错误 , 并将该错误返回给生成此数据的应用程序 。