P2P打洞技术

P2P 概述 相比于 C/S B/S 架构来说, P2P 是由 Peer 组成。每个Peer同时是客户端也是服务器。这意味着,P2P网络中的peer点为每个其他的peer提供服务,所有节点直接相互通信,没有中心节点,并共享资源源相互联系。 P2P有结构化的P2P网络和非结构化P2P网络。如TomP2P (Java的一个框架,一个分布式哈希表,提供去中心化的键/值基础设施)。而Gnutella (第一个分散式P2P文件共享网络),是非结构化 (unstructured)P2P网络的。另外还有两种类型的P2P网络,即集中式(centralized)P2P网络(Napster)和混合(hybrid p2p)peer网络(如Skype)。 NAT网络 由于NAT的网络模型,破坏了主机 Peer之间的端到端连接,因此P2P网络需要穿过NAT网络,而穿过NAT网络是目前为P2P技术面临的一个很大的挑战。 网络地址转换,NAT (Network Address Translation)是一种模糊指明的机制,可以将两个IP连接在一起,一个NAT设备总是拥有至少两个IP地址,(公网IP,私网IP),NAT就是将数据包上的IP地址在传输时,将私网IP转换为公网IP。每个NAT设备会维护一个NAT表,该表存储了所有活动的连接。 在创建网络映射后,NAT将源IP地址和端口更改为外部源IP地址和端口。NAT保留端口,不将新端口分配给外部源。一旦创建了映射,只要映射存在,与之联系的设备就能够发回消息。不存在NAT映射的所有来自外部的通信请求都是无法穿越NAT。因此,在P2P环境中,如果两个peer位于在NAT之后,两者都无法直接联系,因为它们之间不知道外部IP地址和源端口,NAT表中并没有其所维护的映射信息。所以NAT穿越中的主要问题之一是网络地址转换问题。 NAT网络类型 一般来讲, NAT网络可以分为四种类型: nat type 全锥型(Full Cone) 受限锥型(Restricted Cone), 或者说是IP受限锥型 端口受限锥型(Port Restricted Cone), 或者说是IP + PORT受限锥型 对称型(Symmetric) Full Cone NAT 全锥形 全锥形网络(Full Cone NAT) 的工作原理类似于 IP 地址一对一映射。 内部 IP 和端口映射到相同的外部地址和端口。 之后,任何外部源都可以通过向外部地址发送数据包来访问内部主机。 这意味着,一旦创建了映射,任何外部主机都可以联系内部主机。如下图 地址受限形的锥形NAT Address Restricted Cone NAT 地址受限形锥形 NAT是,仅当内部主机先联系外部主机时,受限锥形 NAT 才会为相应的内部主机分配外部IP。 外部主机然后能够通过分配的外部地址联系内部主机。 对称型 Symmetric nat 对称 NAT 是最难穿过的NAT,因为对称将随机端口分配给映射。 如果外部主机首先与内部主机连接,则外部主机只能知道外部映射。 在 P2P 场景中, 如果两个Peer(主机)位于 NAT 后面,则它们无法互相通信以让另一个对等体知道所使用的映射。 此外,对称 NAT 几乎不可能知道分配的端口以通过打孔(hole Punching)建立连接。...

 ·  · 

Linux中169.254.0.0/24的路由来自哪里

在Linux中,发现每次系统启动时,都会将(169.254.0.0/16)路由启动并将其添加到路由表中。但是并不知道这条路由具有什么功能和它到底来自于哪里? text 1 2 3 4 5 6 $ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.0.0.2 0.0.0.0 UG 0 0 0 eth0 10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 要想搞清楚路由(169.254.0.0/16)究竟来自哪里并且它的作用是什么?首先需要搞明白两个概念 zeroconf “zeroconf”或“Zero Configuration Networking” 是一种无需额外配置即可自动创建IP地址网络的技术。也被称为 “Automatic Private IP Addressing”(APIPA)。 zeroconf规范的提出者是Apple公司,其目的是让非专业用户也可以便捷的连接各种网络设备,例如计算机,打印机等。整个搭建网络的过程都是自动实现。如果没有“zeroconf”,用户必须手动,或者利用对应的服务(例如DHCP、DNS)对网络进行配置。这些过程对非技术用户和新用户们来说是很一件难的事情。 zeroconf的出现是问了解决三个问题: 为网络设备自动分配可用IP地址 解析计算机主机名 自动发现网络服务(如打印机等) zeroconf的地址选用 对于Link-local address,IPv4使用的特殊保留地址169.254.0.0/16,在RFC3927中所描述。作用是当DHCP客户端在超时和重试后扔找不到对应的DHCP服务器,它将随机从该网络(`169.254.0.0/16`)中获取地址。这样可以与无法获取DHCP地址的主机进行通信。 如何禁用zeroconf 要在系统引导期间禁用zeroconf路由,需要编辑/etc/sysconfig/network文件,配置以下内容 text 1 2 3 NETWORKING=YES HOSTNAME=localhost....

 ·  · 

ARP与ARP Proxy

什么是arp 地址解析协议,Address Resolution Protoco,使用ARP协议可实现通过IP地址获得对应主机的的物理地址(MAC) 在TCP/IP的网络环境下,每个互联网的主机都会被分配一个32位的IP地址,这种互联网地址是在网际范围标识主机的一种逻辑地址。为了让报文在物理网路上传输,还补习要知道对方目的主机的物理地址才行。这样就存在把IP地址变换成物理地址的地址转换问题。 在以太网环境,为了正确地向目的主机传送报文,必须把目的主机的32为IP地址转换成为目的主机48位以太网地址(MAC),这个就需要在互联层有一个服务或功能将IP地址转换为相应的物理地址(MAC),这个服务就是ARP协议. 所谓的"地址解析",就是主机在发送帧之前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证主机间互相通信的顺利进行. ARP协议和DNS有相像之处。不同点是:DNS实在域名和IP之间解析,另外ARP协议不需要配置服务,而DNS要配置服务才行。 ARP缓存表 在每台安装有TCP/IP协议的设备都会有一个ARP缓存表(windows命令提示符里输入arp -a即可), 表里的IP地址与MAC地址是一一对应的。 bash 1 2 3 4 5 6 7 8 9 10 C:\Users\CM>arp -a 接口: 192.168.1.103 --- 0x3 Internet 地址 物理地址 类型 192.168.1.1 3c-46-d8-5d-53-87 动态 192.168.1.255 ff-ff-ff-ff-ff-ff 静态 224.0.0.22 01-00-5e-00-00-16 静态 224.0.0.251 01-00-5e-00-00-fb 静态 224.0.0.252 01-00-5e-00-00-fc 静态 239.11.20.1 01-00-5e-0b-14-01 静态 239.255.255.250 01-00-5e-7f-ff-fa 静态 arp常用命令 arp -a 查看所有记录 arp -d 清除arp表 arp -s $ip $mac 将绑定IP和MAC arp -n 不解析名称打印arp表 ARP缓存是把双刃剑 主机有了arp缓存表,可以加快arp的解析速度,减少局域网内广播风暴。...

 ·  · 

动态路由- BGP

概述 BGP Border Gateway Protocol 边界网关协议,,是一种运行于TCP上的自治系统AS(Autonomous System)之间的路由可达,并选择最佳路由的距离矢量路由协议。 早期发布的三个版本分别是BGP-1、BGP-2和BGP-3,1994年开始使用BGP-4,2006年之后单播IPv4网络使用的版本是BGP-4,其他网络(如IPv6等)使用的版本是MP-BGP。 MP-BGP是对BGP-4进行了扩展,来达到在不同网络中应用的目的,BGP-4原有的消息机制和路由机制并没有改变。MP-BGP在IPv6单播网络上的应用称为BGP4+,在IPv4组播网络上的应用称为MBGP(Multicast BGP)。 历史 为方便管理规模不断扩大的网络,网络被分成了不同的自治系统。1982年,外部网关协议EGP(Exterior Gateway Protocol)被用于实现在AS之间动态交换路由信息。但是EGP设计得比较简单,只发布网络可达的路由信息,而不对路由信息进行优选,同时也没有考虑环路避免等问题,很快就无法满足网络管理的要求。 BGP是为取代最初的EGP而设计的另一种外部网关协议。不同于最初的EGP,BGP能够进行路由优选、避免路由环路、更高效率的传递路由和维护大量的路由信息。 虽然BGP用在AS之间传递路由信息,但并非所有AS之间传递路由信息都要运行BGP。如数据中心上行到Internet的出口上,为了避免Internet海量路由对数据中心内部网络影响,设备采用静态路由代替BGP与外部网络通信。 受益 BGP从多方面保证了网络的安全性、灵活性、稳定性、可靠性和高效性: BGP采用认证和GTSM的方式,保证了网络的安全性。 BGP提供了丰富的路由策略,能够灵活的进行路由选路,并且能指导邻居按策略发布路由。 BGP提供了路由聚合和路由衰减功能用于防止路由振荡,有效提高了网络的稳定性。 BGP使用TCP作为其传输层协议(端口号为179),并支持BGP与BFD联动、BGP Tracking和BGP GR和NSR,提高了网络的可靠性。 在邻居数目多、路由量大且大多邻居有相同出口策略场景下,BGP用按组打包技术极大提高了BGP打包发包性能。 BGP相关名词说明 名词 说明 BGP 边界网关协议(Border Gateway Protocol)是互联网上一个核心的去中心化自治路由协议,它通过维护IP路由表或前缀表来实现自治系统(AS)之间的可达性大多数ISP使用BGP来与其他ISP创建路由连接,特大型的私有IP网络也可以使用BGPBGP的通信对端(对等实体,Peer)通过TCP(端口179)会话交换数据,BGP路由器会周期地发送19字节的保活消息来维护连接。在路由协议中,只有BGP使用TCP作为传输层协议 IBGP 内部边界网关协议。同一个AS内部的两个或多个对等实体之间运行的BGP被称为IBGP IGP 内部网关协议。同一AS内部的对等实体(路由器)之间使用的协议,它存在可扩容性问题:1. 一个IGP内部应该仅有数十(最多小几百)个对等实体2. 对于端点数,也存在限制,一般在数百(最多上千)个Endpoint级别IBGP和IGP都是处理AS内部路由的,仍然需要IGP的原因是:1. IBGP之间是TCP连接,也就意味着IBGP邻居采用的是逻辑连接的方式,两个IBGP连接不一定存在实际的物理链路。所以需要有IGP来提供路由,以完成BGP路由的递归查找2. BGP协议本身实际上并不发现路由,BGP将路由发现的工作全部移交给了IGP协议,它本身着重于路由的控制 EBGP 外部边界网关协议。归属不同的AS的对等实体之间运行的BGP称为EBGP AS 自治系统(Autonomous system),一个组织(例如ISP)管辖下的所有IP网络和路由器的整体参与BGP路由的每个AS都被分配一个唯一的自治系统编号(ASN)。对BGP来说ASN是区别整个相互连接的网络中的各个网络的唯一标识。64512到65535之间的ASN编号保留给专用网络使用 RouteReflector 同一AS内如果有多个路由器参与BGP路由,则它们之间必须配置成全连通的网状结构——任意两个路由器之间都必须配置成对等实体。由于所需要TCP连接数是路由器数量的平方,这就导致了巨大的TCP连接数为了缓解这种问题,BGP支持两种方案:Route Reflector、Confederations路由反射器(Route Reflector)是AS内的一台路由器,其它所有路由器都和RR直接连接,作为RR的客户机。RR和客户机之间建立BGP连接,而客户机之间则不需要相互通信RR的工作步骤如下:1. 从非客户机IBGP对等实体学到的路由,发布给此RR的所有客户机2. 从客户机学到的路由,发布给此RR的所有非客户机和客户机3. 从EBGP对等实体学到的路由,发布给所有的非客户机和客户机RR的一个优势是配置方便,因为只需要在反射器上配置 工作负载 Workload,即运行在Calico节点上的虚机或容器 全互联 全互联网络(Full node-to-node Mesh)是指任何两个Calico节点都进行配对的L3连接模式 BGP 应用 国内IDC机房需要在 CNNIC (中国互联网信息中心)或 APNIC (亚太网络信息中心)申请自己的IP地址段和AS号,然后将自己的IP地址广播到其它网络运营商的AS中,并通过BGP协议将多个AS进行连接,从而实现可自动跨网访问。此时,当用户发出访问请求后,将根据BGP协议的机制自动在已建立连接的多个AS之间为用户提供最佳路由,从而实现不同网络运营商用户的高速访问同一机房资源。 BGP的运行 BGP使用TCP为传输层协议,TCP端口号179。路由器之间的BGP会话基于TCP连接而建立。运行BGP的路由器被称为BGP发言者(BGP Speaker),或BGP路由器。两个建立BGP会话的路由器互为对等体(或称通信对端/对等实体,peer)。BGP对等体之间交换BGP路由表。 BGP路由器只发送增量的BGP路由更新,或进行触发更新(不会周期性更新)。 BGP具有丰富的路径属性和强大的路由策略工具。...

 ·  · 

Linux虚拟网络技术

Overview 本文将介绍Kubernetes中使用的相关虚拟网络功能,目的是为了任何无相关网络背景经历的人都可以了解这些技术在kubernetes中式如何应用的。 VLAN VLAN (Virtual local area networks)是逻辑上的LAN而不受限于同一物理网络交换机上。同样的VLAN也可以将同一台交换机/网桥下的设备/划分为不同的子网。 VLAN 区分的广播域的标准是VLAN ID,此功能是Linux内核3.8中引入的 在Linux中创建一个VLAN bash 1 ip link add link eth0 name eth0.2 type vlan id 2 VETH [1] VETH (Virtual Ethernet device),是一个本地的以太网隧道,创建出的设备是成对的,通常会存在两个名称空间内,例如在docker中创建出的设备一端在root名称空间内,一端被挂在到容器的名称空间内。 图:veth topology Source:https://medium.com/@arpitkh96/basics-of-container-networking-with-linux-part-1-3a3cdc64c87a bash 1 ip link add <p1-name> type veth peer name <p2-name> Bridge 目的 Linux bridge(又称为网桥、VLAN交换机)是Linux内核中集成的功能,用来做tcp/ip做二层协议交换的设备,虽然是软件实现的,但它与普通的二层物理交换机功能一样。bridge 就是为了解决虚拟机网卡连接问题。可以添加若干个网络设备到 bridge 上作为其接口,添加到 bridge 上的设备被设置为只接受二层数据帧并且转发所有收到的数据包到 bridge 中。 由于 Linux bridge 是二层设备,故数据包是根据MAC地址而不是IP转发的。因此所有协议都可以透明地通过网桥。Linux bridge 广泛用于虚拟机,名称空间等。 图:Linux Bridge Source:https://kbespalov.medium.com/linux-linux-bridge-7e0e887edd01 MACVLAN [2] MACVLAN 允许在一个物理接口创建多个子接口,并且每个子接口都拥有一个随机生成的MAC地址,与IP地址。 MACVLAN 中子接口不能与与父接口直接通讯,例如在虚拟化环境中,容器是不能ping通宿主机的IP,如果子接口需要和父接口进行通讯,需要将子接口分配给父接口。...

 ·  ·