networking

tun/tap运行机制

  最近需要连接Quagga和SDN Controller,由于Quagga原因,目前没办法直接在两者之间建立连接,所以只能曲线救国,采用tun/tap搞个虚拟网卡中转一下。本文主要介绍以下tun/tap的机制,关于具体连接部分将在以后进行介绍。   tun和tap的区别在于tun是三层设备,用于ip转发,无法与物理网卡做 bridge,但是可以通过三层交换(如 ip_forward)与物理网卡连通;tap是二层设备,用于mac转发。   以下几个图来自kghost的博客。   首先是正常网卡接收报文是从物理链路接收的:   而虚拟网卡(tun/tap)是从用户态接收数据,在用户态和协议栈之间进行中转数据。数据从用户态读进来,穿透/dev/net/tun字符设备抵达内核,然后交给虚拟网卡,虚…

Read more

vlan及vlan端口

  虽然知道这玩意都被大家写烂了,还是得总结总结,加深印象。   vlan用于划分二层网络,解决二层广播带来的广播风暴问题,不同的设备可以分属于不同vlan下。目前常用的标识vlan的协议为IEEE 802.1q,其在以太网头和ip头之间插入vlan的头。vlan id用12位表示,但是正常可用的vlan范围是1-1001,且vlan 1不能被使用,修改,vlan 1002-1005被预留。如果开启了vlan扩展,可以启用1006-4094的vlan id。   vlan端口的类型有Access, Trunk, Hybrid三种。 Access: 1) 收包:没有vlan tag,则打上默认的端口pvid;若有且不等于pvid则直接丢弃 2) 发包:pop vlan id后发包 Trunk: 1) 收包:没有vlan t…

Read more

三层交换机转发原理

1.三层交换机与路由器的区别 三层交换机可以同时工作在二三层,路由器只能工作在三层。 三层交换机端口都是以太网接口,路由器则不仅限于此。 三层交换机转发报文通过硬件实现,而传统路由器则通过软件实现,性能前者好。 2.三层交换机二层转发原理   源主机(src ip: 10.0.0.1/24)向目的主机(dst ip: 10.0.0.2/24)发送ping(同一vlan内): src检查dst ip为同一网段,则发送ARP请求,该ARP会在同一网段+同一vlan内广播。 dst收到ARP报文,发会arp reply。 src发送ping包 dst发回icmp reply 3.三层交换机三层转发原理   同样,源主机(src ip: 10.0.0.1/24)向目的主机(dst ip: 20.0.0.2/24)发送ping,假设经过中间…

Read more

mininet与namespace

  前一阵发现一个问题,就是用mininet起的主机的namespace用ip netns查看不到,一直感觉很奇怪,因为根据mininet官网给出的描述,起创建的switch,host还有自带的controller都是位于namespace下的,其中switch和自带controller都是位于root namespace下,不同host是位于不同的host下面,但是为啥子用ip netns就看不到,明明ip netns就是查看namespace的。今天有时间,上网查了一下,终于知道以前了解的namespace只是冰山一角。本文只给出概括说明,具体不同namespace的详细用法查看文章底部的链接。   总得概括来说其实就是一句话:ip netns add创建的namespace是带name的,而mininet创建的namespace是nameles…

Read more

ovs 2.3 流表匹配过程

  艾妈,终于跟进新版本流表匹配了。忧伤的故事是新版本内核匹配修改了好多,下放了部分wildcard matching到内核。源码看懂是没太大问题,逻辑还需要好好梳理一下。 1.datapatch内核流表匹配   datapath收到数据包的具体流程如下,艾妈,画得太丑,大家见谅: 1. neifreceive_skb是网卡收到包的函数,将会递送给netdev_frame_hook 2. netdev_frame_hook这个函数是vport初始化使注册的钩子函数,初始化vport流程(初始化vport => ovs_netdev_vport_ops => netdev_rx_handler_register)。它主要调用了两个函数: (1) vport = ovs_netdev_get_vport(skb->dev); //获取对应d…

Read more

ovs vlan gre vxlan实验

vlan实验   在宿主即创建了一个ovs bridge,连接至宿主机的出口网卡eht0,再创建了两个vport,然后用virtualbox创建两个虚拟机,分别桥接至两个vport。搭建方式可以参考我的上篇博客:使用VirtualBox创建虚拟机连接ovs bridge。网络拓扑如下:   在没设置vlan tag之前,两个主机是可以相互ping通的。然后设置vlan tag: ovs-vsctl set port vport1 tag=100 发现VM1无法ping通至VM2,同理在VM2设置相同的tag后,两个主机可以互相ping通,位于一个vlan下了。可以用ovs-vsctl list port指令查看port的vlan等配置。 参考: https://www.youtube.com/watch?v=rYW7kQRyUvA htt…

Read more

ovs 处理openflow协议

  ovs中的ofproto模块是用于接收并处理openflows消息。这个消息主要包括两种:primary和service。   primary是与openflow controller连接,用于维持连接并发送Asynchronous消息,比如packet-in。这类消息通常包括一些主动连接,比如tcp,ssl,unix。主要是一些指导流转发的流变更消息   service是用于处理ovs-ofctl消息,这类消息由对端负责连接,不主动发送Asynchronous消息。通常包括一些被动连接,比如ptcp,pssl,punix。主要是一些用于测试,监控,查看的消息,比如添加自定义流表,查看ovs流表信息等。   vswitchd在启动后,处理下发消息流程如下: 1.  vswitchd.c。…

Read more

使用VirtualBox创建虚拟机连接ovs bridge

  在宿主机上创建了一个ovs bridge,给它分配ip。本机的原来上网网卡是eth0,把它down了。并创建两个vport使得VirtualBox创建的虚拟机与vport相连。创建脚本如下: #!/bin/bash ovs-vsctl add-br mybr ovs-vsctl add-port mybr eth0 ifconfig eth0 0 dhclient mybr ifconfig mybr up ip tuntap add mod tap vport1 ip tuntap add mod tap vport2 ifconfig vport1 up ifconfig vport2 up ovs-vsctl add-port mybr vport1 ovs-vsctl add-port mybr vport2 &…

Read more

ovs中流表在内核空间与用户空间的匹配过程

  一直对ovs中facet和subfacet概念搞不清楚,今天仔细查了网上,关于这个的解释信息好少,以下这个是mail list里面的回答,感觉挺正确了: As I understand, there are two kinds of flow in OVS. One is in the user space, e.g. vswitchd, where flow key can include some wildcards to match, while the other lies in kernel space, e.g. openvswitch.ko, where the flow key can never have wildcard. If no wildcard in user space flow (a.k.a facet), the flow from…

Read more

ovs datapath笔记

  这几天在学习ovs的源码,现在来做个datapath的笔记。事先声明,本文的内容摘自博客,源码,视频以及自己的总结等,具体参考文献已经在文章末尾给出,主要参考为Baohua Yang的OpenvSwitch 代码分析。 0.模块介绍   datapath为ovs内核模块,负责执行数据交换,也就是把从接收端口收到的数据包在流表中进行匹配,并执行匹配到的动作。   一个datapath可以对应多个vport,一个vport类似物理交换机的端口概念。一个datapth关联一个flow table,一个flow table包含多个条目,每个条目包括两个内容:一个match/key和一个action,一个match/key可以从包中获取,对应一个action处理行为,最常见的action是在不同flow中进行转发。下图所示的是1…

Read more

Linux网络内核数据结构之sk_buff

  sk_buff是Linux网络内核中最重要的数据结构之一。所有网络分层(MAC或L2分层上的另一种链路层协议,L3的IP,L4的TCP或UDP)都会使用这个结构来存储其报头,有关用户数据的信息,以及用来协调其工作的其他内部信息。当该结构从一个分层传到另一个分层时,其不同的字段会随之发生改变。在不同层数据传递时,通过附加报头的形式,减少了拷贝带来的开销。   内核把所有sk_buff结构链成一个双向链表,并添加了一个头元素,该头元素的结构是sk_buff_head: struct sk_buff_head {   struct sk_buff *next; 指向后继结点   struct sk_buff *prev; 指向前驱结点   __u32 qlen; 表中元素的数…

Read more

Netfilter/iptables框架总结

  今天,又把Netfilter回顾了一遍,发现经常容易遗忘,就写一篇博客总结一下。其实说起来总结,也都是参考网上大神的文献,文献已经在文章的末尾给出。 1. 概述   首先,说一下这两个是什么东西吧。netfilter是Linux内核中用于包过滤的框架,而iptables是在其之上设置的软件。它有五个钩子(Hook)去控制包的流动,总的来说就是我们可以在这5个钩子上设置过滤规则去控制包的流入/流出/转发等: INPUT:进入本机 OUTPUT:本机输出 FORWARD:转发 PREROUTING:输入控制 POSTROUTING:输出控制   其次,介绍一下这个框架到底能做些什么东西: 建立一个基于有状态和无状态的包过滤规则的因特网防火墙。 部署高度可用的有状态和无状态防火墙集群。 当公网ip不够用时,可以进行ip伪装,…

Read more

Linux socket跨局域网聊天和文件传输

  一直想写一个跨局域网聊天和文件传输,以及视频聊天的软件,这两天刚好闲着没啥事就把代码写完了,代码已经上传至github:https://github.com/vinllen/chat   其实之前想法P2P模式,P2P的话必须穿透NAT,现在的NAT有4种模式: 完全圆锥型NAT 受限圆锥型NAT 端口受限圆锥型NAT 对称NAT(双向NAT) 维基百科给出的定义如下: 1.Full cone NAT,亦即著名的一对一(one-to-one)NAT   一旦一个内部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有发自iAddr:port1的包都经由eAddr:port2向外发送。任意外部主机都能通过给eAddr:port2发包到达iAddr:port1 2.Address-Restricted…

Read more