ch1 VPN与OpenVPN应用场景分析

什么是VPN VPN ( Virtual Private Network) 虚拟专用网络,是依靠ISP和其他的NSP,在公共网络中建立专用的数据通信网络的技术,可以为企业与企业之间或者个人与企业之间提供安全的数据传输隧道服务。在VPN中任意两点之间的连接并没有传统专网所需的端到端的物理链路,而是利用公共网络资源动态组成的,可以理解为通过私有的隧道技术在公共数据网络上模拟出来的和专网有同样功能的点到点的专线技术,所谓虚拟是指不需要去拉实际的长途物理线路,而是借用了公共Internet网络实现。 vpn直观的形象图: VPN Server/Client <---------------------------------> VPN Server/Client VPN的作用 VPN功能可以帮助公司里的远程用户(出差,家里)、公司的分支机构、商业合作伙伴及供应商等公司和自己的公司内部网络之间建立可信的安全连接或者是局域网连接,确保数据的加密安全传输和业务访问,对至运维工程师来说,还可以连接不同的机房为局域网,处理相关的业务流。我们可以通过一张网络逻辑图来描述VPN的作用。 图:OpenVPN架构 Source:https://www.slideteam.net/vpn-tunnel-architecture-connecting-corporate-and-branch-office.html VPN的分类 我们根据VPN的常见企业应用,将VPN分为以下4类应用 远程访问VPN服务 即通过个人电脑远程拨号到企业办公网络。 一般为企业内部员工出差、休假或特殊情况下在远离办公室的时候,又有需求访问公司的内部网络获取相关资源,就可以通过VPN拨号到公司内部.此时远程拨号的员工和办公室内的员工以及其他拨号的员工之间都相当于一个局域网络内。例如:访问内部的域控制器,文件服务器,OA系统,ERP, HTTP服务,内网聊天工具等局域网服务应用。 对于运维人且就是需要个人电脑远程拨号到企业网站IDC机房,远程维护内网服务器(一般无外网IP)。 此点是技术人员特别是运维人且在工作中会经常用这个方法维护大量的机房内无外网的服务器及网络设备。 企业内部网络之间VPN服务 在公司的分支机构的局域网和公司总部LAN之间的VPN连接。通过公网Internet建立VPN将公司在各地的分支机构的LAN连接到公司总部的LAN。例如:各大超市之间业务结算等。 这是由于地域的原因而产生的VPN的需求,通过VPN让不同地域内的机器可以互相访问,就好像是一个局域网一样。例如:办公室互联协同办公,机房互联数据同步及业务访问等。 互联网公司多IDC机房之间VPN服务 此处是运维架构人员需要考虑的问题。不同机房之间业务管理和业务访问,数据流动。 企业外部VPN服务 在供应商、合作伙伴的LAN和本公司的LAN之间建立的VPN服务。 访问外国网站 翻墙的应用 常贝隧道协议介绍 PPTP 点对点隧道协议(PPTP)是由包括微软和3Com等公司组成的PPTP论坛开发的一种点对点隧道协议,基于拨号使用的PPP协议,使用PAP或CHAP之类的加密算法,或者使用Microsoft的点对点加密算法MPPE。其通过跨越基于TCP/IP的数据网络创建VPN。实现了从远程客户端到专用企业服务器之间数据的安全传输。PPTP支持通过公共网络(例如Internet)建立按需的、多协议的、虚拟专用网络。PPTP允许加密IP通讯,然后在要跨越公司IP网络或公共IP网络(如Internet)发送的IP头中对其进行封装。典型的linux平台的开源软件为pptp。 PPTP属于点对点方式的应用,比较适合远程的企业用户拨号到企业进行办公等的应用。 L2TP L2TP第2层隧道协议(L2TP)是IETF基于L2F (Cisco的第二层转发协议)开发的PPTP的后续版本。是一种工业标准Internet隧道协议,其可以为跨越面向数据包的媒体发送点到点协议(PPP)框架提供封装。PPTP和L2TP都使用PPP协议对数据进行封装,然后添加附加包头用于数据在互联网络上的传输。PPTP只能在两端点间建立单一隧道。L2TP支持在两端点间使用多隧道,用户可以针对不同的服务质量创建不同的隧道。L2TP可以提供隧道验证,而PPTP则不支持隧道验证。但是当L2TP或PPTP 与 IPSEC 共同使用时,可以由IPSEC提供隧道验证,不需要在第2层协议上验证隧道使用L2TP。PPTP要求互联 网络为IP网络。L2TP只要求隧道媒介提供面向数据包的点对点的连接,L2TP可以在IP(使用UDP),帧中继永久虚拟电路(PVCs),X.25虚拟电路(VCs)或ATM VCs网络上使用。 L2TP (Layer 2 Tunneling Protocol) 在计算机网络中,第2层隧道协议(L2TP)是一种隧道协议,用于支持虚拟专用网络(VPN)或作为ISP提供服务的一部分。它本身不提供任何加密或机密性。相反,它依靠它在隧道内传递的加密协议来提供隐私。 由于L2TP协议缺乏固有的机密性,因此通常与IPsec一起实施。这被称为L2TP / IPsec,并在IETF RFC 3193中进行了标准化。 Reference L2TP IPSec IP安全协议(IPSec: IP Security)实际上是一套协议包而不是一个独立的协议。从1995年开始IPSec的研究以来,IETF IPSec工作组在它的主页上发布了几十个Internet草案文献和12个RFC文件。其中,比较重要的有RFC2409 IKE(互连网密钥交换)、RFC2401 IPSec协议、RFC2402 AH验证包头、RFC2406 ESP加密数据等文件。 IPSec隧道模式隧道是封装、路由与解封装的整个过程。隧道将原始数据包隐藏(或封装)在新的数据包内部。该新的数据包可能会有新的寻址与路由信息,从而使其能够通过网络传输。隧道与数据保密性结合使用时,在网络上窃听通讯的人将无法获取原始数据包数据(以及原始的源和目标)。封装的数据包到达目的地后,会删除封装,原始数据包头用于将数据包路由到最终目的地。 隧道本身是封装数据经过的逻辑数据路径,对原始的源和目的端,隧道是不可见的,而只能看到网络路径中的点对点连接。连接双方并不关心隧道起点和终点之间的任何路由器、交换机、代理服务器或其他安全网关。将隧道和数据保密性结合使用时,可用于提供VPN。...

 ·  · 

Ceph集群安装 - ceph-deploy

环境配置 Ceph 是一个开源去中心化存储平台,专为满足现代存储需求而设计。 Ceph可扩展至 EB 级,并且设计为无单点故障,使其成为需要高度可用的灵活存储的应用程序的理想选择。 下图显示了具有 Ceph 存储的示例 3 节点集群的布局。 两个网络接口可用于增加带宽和冗余,这有助于保持足够的带宽来满足存储要求,而不影响客户端应用程序。 图:Ceph存储集群 Source:https://www.jamescoyle.net/how-to/1244-create-a-3-node-ceph-storage-cluster 图中架构表示了一个无单点故障的 3 节点 Ceph 集群,以提供高度冗余的存储。 每个节点都配置了两个磁盘; 一台运行 Linux 操作系统,另一台将用于 Ceph 存储。 下面的输出显示了可用的存储空间,每个主机上的存储空间完全相同。 /dev/sda 是包含操作系统安装的根分区, /dev/sdb 是一个未触及的分区,将用于部署 Ceph 集群,对应的硬件信息如下表所示。 主机名 public IP cluster IP 数据盘 ceph-nautilus01 10.0.0.50 10.0.0.50 /dev/sda /dev/sdb ceph-nautilus02 10.0.0.51 10.0.0.51 /dev/sda/dev/sdb ceph-nautilus03 10.0.0.52 10.0.0.52 /dev/sda/dev/sdb ceph-control 10.0.0.49 10.0.0.49 /dev/sda 部署工具 ceph-deploy 工具是在 “管理节点” (ceph-admin) 上的目录中运行。 ceph-deploy 部署ceph的原生工具 (最后支持版本 octopus 15) 借助于ssh来管理目标主机,sudo,和一些 python 模块来完成 ceph 集群的部署和后期维护。 一般讲 ceph-deploy 放置在专用节点,作为 ceph 集群的管理节点。 ceph-deploy 不是一个通用的部署工具,只是用于管理Ceph集群的,专门为用户快速部署并运行一个Ceph集群,这些功能和特性不依赖于其他的编排工具。 它无法处理客户端的配置,因此在部署客户端时就无法使用此工具。 下图是来自 ceph 官网的 ceph-deploy 部署工具的一个模型图...

 ·  · 

kubernetes应用 - Traefik Ingress Controller

Kubernetes Ingress Kubernetes Ingress是路由规则的集合,这些规则控制外部用户如何访问Kubernetes集群中运行的服务。 在Kubernetes中,有三种方式可以使内部Pod公开访问。 NodePort:使用Kubernetes Pod的NodePort,将Pod内应用程序公开到每个节点上的端口上。 Service LoadBalancer:使用Kubernetes Service,改功能会创建一个外部负载均衡器,使流量转向集群中的Kubernetes Pod。 Ingress Controller: Node Port是在Kubernetes集群中每个节点(Node)上开放端口,Kubernetes直接将流量转向集群中Pod。Kubernetes集群中使用NodePort,则需要编辑防火墙规则,但是NodePort是范围在Kubernetes集群中默认设置的范围为 30000–32767,最终导致流量端口暴露在非标准端口之上。 LoadBalancer一般应用于云厂商提供的Kubernetes服务,如果自行在机器上部署Kubernetes集群,则需要自行配置LoadBalancer的实现, Kubernetes Ingress,为Kubernetes中的抽象概念,实现为第三方代理实现,这种三方实现集合统称为Ingress Controller。Ingress Controller负责引入外部流量并将流量处理并转向对应的服务。 Kubernetes IngressController功能实现 上面只是说道,在Kubernetes集群中,如何将外部流量引入到Kubernetes集群服务中。 负载均衡 无论在Kubernetes集群中,无论采用什么方式进行流量引入,都需要在外部负载均衡完成,而后负载均衡将流量引入Kubernetes集群入口或内部中, 通常情况下,NodePort方式管理繁琐,一般不用于生产环境。 服务的Ingress选择 Kubernetes Ingress是选择正确的方法来管理引入外部流量到服务内部。一般选择也是具有多样性的。 Nginx Ingress Controller,Kubernetes默认推荐的Ingress,弊端①最终配置加载依赖config reload,②定制化开发较难,配置基本来源于config file。 Envoy & traefik api网关,支持tcp/udp/grpc/ws等多协议,支持流量控制,可观测性,多配置提供者。 云厂商提供的Ingress。AWS ALB,GCP GLBG/GCE,Azure AGIC Traefik介绍 traefik-现代反向代理,也可称为现代边缘路由;traefik原声兼容主流集群,Kubernetes,Docker,AWS等。官方的定位traefik是一个让开发人员将时间花费在系统研发与部署功能上,而非配置和维护。并且traefik官方也提供自己的服务网格解决方案 作为一个 modern edge router ,traefik拥有与envoy相似的特性 基于go语言研发,目的是为了简化开发人员的配置和维护 tcp/udp支持 http L7支持 GRPC支持 服务发现和动态配置 front/ edge prory支持 可观测性 流量管理 … traefik 术语 要了解trafik,首先需要先了解一下 有关trafik中的一些术语。 EntryPoints 入口点,是可以被下游客户端连接的命名网络位置,类似于envoy 的listener和nginx的listen services 服务,负载均衡,上游主机接收来自traefik的连接和请求并返回响应。 类似于nginx upstream envoy的clusters Providers 提供者,提供配置文件的后端,如file,kubernetes,consul,redis,etcd等,可使traefik自动更新 routers 路由器,承上启下,分析请求,将下游主机的请求处理转入到services middlewares: 中间件,在将下游主机的请求转入到services时进行的流量调整 在Kubernetes中使用traefik网关作为Ingress Traefik于2019年9月发布2....

 ·  · 

正则表达式在go中使用

正则表达式是一种进行模式匹配和文本操纵的复杂而又强大的工具。虽然正则表达式比纯粹的文本匹配效率低,但是它却更灵活。按照它的语法规则,随需构造出的匹配模式就能够从原始文本中筛选出几乎任何你想要得到的字符组合。 Go语言通过regexp(regular expression)标准包为正则表达式提供了官方支持,包名采用regular expression的每个单词的前三个首字母组成。 Go语言的正则表达式实现的是RE2标准,Go语言的正则表达式与其他编程语言之间也有一些小的差异。 正则表达式规则 go语言中regexp包使用 简单来说,Go语言中使用正则表达式只需要两步即可: 解析、编译正则表达式 regexp.MustCompile() 返回一个regexp结构体 根据解析好的规则(结构体形式),从指定字符串中提取需要的信息。如 MatchString() FindAllSubmatch()等 go 1 2 3 4 5 6 7 8 9 10 11 12 13 package main import ( "fmt" "regexp" ) func main() { rege := regexp.MustCompile(`(\d{1,3}\.){3}\d{1,3}`) str := rege.FindAllString("SLAJDLKAJ192.168.0.1DASDASA1231", -1) fmt.Println(str) }

 ·  · 

通过Go语言中阐述TCP Handshake

TCP的三次握手 所谓三次握手 Three-Way Handshake 是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。好比两个人在打电话: 当连接被建立或被终止,交换的报文段只包含TCP头部,而没有数据。 tcp报文头部结构 序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。 确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,确认方ack=发起方seq+1,两端配对。 标志位 ACK:确认序号有效。 FIN:释放一个连接。 RST:重置连接。 SYN:发起一个新连接。 PSH:接收方应该尽快将这个报文交给应用层。 URG:紧急指针(urgent pointer)有效。 第一次握手:客户端要向服务端发起连接请求,首先客户端随机生成一个起始序列号ISN(比如是100),那客户端向服务端发送的报文段包含SYN标志位(也就是SYN=1),序列号seq=100。 第二次握手:服务端收到客户端发过来的报文后,发现SYN=1,知道这是一个连接请求,于是将客户端的起始序列号100存起来,并且随机生成一个服务端的起始序列号(比如是300)。然后给客户端回复一段报文,回复报文包含SYN和ACK标志(也就是SYN=1,ACK=1)、序列号seq=300、确认号ack=101(客户端发过来的序列号+1)。 第三次握手:客户端收到服务端的回复后发现ACK=1并且ack=101,于是知道服务端已经收到了序列号为100的那段报文;同时发现SYN=1,知道了服务端同意了这次连接,于是就将服务端的序列号300给存下来。然后客户端再回复一段报文给服务端,报文包含ACK标志位(ACK=1)、ack=301(服务端序列号+1)、seq=101(第一次握手时发送报文是占据一个序列号的,所以这次seq就从101开始,需要注意的是不携带数据的ACK报文是不占据序列号的,所以后面第一次正式发送数据时seq还是101)。当服务端收到报文后发现ACK=1并且ack=301,就知道客户端收到序列号为300的报文了,就这样客户端和服务端通过TCP建立了连接。 四次挥手 比如客户端初始化的序列号ISA=100,服务端初始化的序列号ISA=300。TCP连接成功后客户端总共发送了1000个字节的数据,服务端在客户端发FIN报文前总共回复了2000个字节的数据。 第一次挥手:当客户端的数据都传输完成后,客户端向服务端发出连接释放报文(当然数据没发完时也可以发送连接释放报文并停止发送数据),释放连接报文包含FIN标志位(FIN=1)、序列号seq=1101(100+1+1000,其中的1是建立连接时占的一个序列号)。需要注意的是客户端发出FIN报文段后只是不能发数据了,但是还可以正常收数据;另外FIN报文段即使不携带数据也要占据一个序列号。 第二次挥手:服务端收到客户端发的FIN报文后给客户端回复确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=1102(客户端FIN报文序列号1101+1)、序列号seq=2300(300+2000)。此时服务端处于关闭等待状态,而不是立马给客户端发FIN报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。 第三次挥手:服务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文,报文包含FIN和ACK标志位(FIN=1,ACK=1)、确认号和第二次挥手一样ack=1102、序列号seq=2350(2300+50)。 第四次挥手:客户端收到服务端发的FIN报文后,向服务端发出确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=2351、序列号seq=1102。注意客户端发出确认报文后不是立马释放TCP连接,而是要经过2MSL(最长报文段寿命的2倍时长)后才释放TCP连接。而服务端一旦收到客户端发出的确认报文就会立马释放TCP连接,所以服务端结束TCP连接的时间要比客户端早一些。

 ·  ·