Category Archives: Unix

IPsec是什么

https://en.wikipedia.org/wiki/IPsec
https://www.cisco.com/c/en/us/td/docs/net_mgmt/vpn_solutions_center/2-0/ip_security/provisioning/guide/IPsecPG1.html
https://www.juniper.net/documentation/en_US/junos/topics/topic-map/security-ipsec-vpn-overview.html
http://www.h3c.com/cn/d_200812/624140_30003_0.htm
https://www.cnblogs.com/lolau/p/8746601.html

IPsec(IP Security)是一系列为IP通信提供安全性的协议和服务的集合,工作在IP层,可以为上层协议和应用提供透明的安全服务。IPsec提供两种安全机制:认证和加密。

认证机制使IP通信的数据接收方能够确认数据发送方的真实身份以及数据在传输过程中是否遭篡改。
加密机制通过对数据进行加密运算来保证数据的机密性,以防数据在传输过程中被窃听。

IPsec提供的安全保护包括:

用户数据加密,通过加密算法提供好数据私密性。
消息完整性验证,通过摘要认证确保数据在传输路径上未经修改。
防御特定类型攻击,通过序列号防数据重放、通过认证防中间人攻击。
提供设备之间安全算法和秘钥的协商能力,提供安全的在线秘钥生成机制。
提供隧道和传输两种模式,满足不同的网络结构需求。

IPsec出现的原因
网络安全问题日益严重,需要保证数据在网络上的传输是安全的。
大多数保证数据安全的协议或技术都是在应用层,如SSL协议可以为WEB或FTP提供安全连接,但对于ping、Telnet、SNMP等无效。需要在IP层提供安全性的方法,可以使在传输层上层的所有协议受益。

IPsec相关概念

IPsec协议不是一个单独的协议,它给出了应用于IP层上网络数据安全的一整套体系结构,包括网络认证协议AH(Authentication Header,认证头)、ESP(Encapsulating Security Payload,封装安全载荷)、IKE(Internet Key Exchange,因特网密钥交换)和用于网络认证及加密的一些算法等。其中,AH协议和ESP协议用于提供安全服务,IKE协议用于密钥交换。

SA(Security Association,安全关联):为安全目的创建的一个单向逻辑连接,所有经过同一个SA的数据流会使用相同的安全处理协议(AH或ESP)。对同一个数据流同时使用AH和ESP时需要两个嵌套的SA。双向的数据流需要通信实体之间维护一对出入彼此呼应的SA。

SPD(Security Association Database,安全关联数据库):用于存放与SA关联的所有状态数据的存储结构。

SPI(Security Parameters Index,安全参数索引):一个被携带在AH或ESP报文头中的32bit数值,用于在接收端识别数据流到SA的绑定关系。

SPD(Security Policy Database,安全策略数据库):指明所有IP数据报文应该使用何种安全服务,以及如何获得这些服务的数据结构。SPD是一个有序的结构,用访问控制列表来描述数据流特性。

AH(Authentication Headers,认证头协议):提供数据来源认证,数据完整性校验,保护通信免受篡改,但不能防止窃听,适合于传输非机密数据。AH协议使用事先协商好的算法和密钥计算报文数据部分的摘要值,然后作为报文完整性的证据保存在AH的头结构中。

ESP(Encapsulating Security Payloads,封装安全载荷协议):提供加密,数据源校验,数据完整性校验。ESP协议将原始报文加密后作为负载携带在报文中。

IKE(Internet Key Exchange,因特网密钥交换协议):用于动态建立SA,SA有生命周期,如果安全策略要求建立安全、保密的连接,但又不存在与该连接相应的SA,IPSec会立刻启动IKE来协商SA。

ISAKMP(Internet Security Association Key Management Protocol,安全联盟密钥管理协议):定义了协商、建立、修改和删除SA的过程和包格式,只是提供了一个通用框架,并没有定义具体的SA格式,与IKE独立,可以被不同的密钥交换协议使用。IKE使用ISAKMP消息来协商并建立SA。

注:由于AH提供数据来源确认,一旦源IP地址改变,AH校验失败,无法穿越NAT(NAT穿越在大陆的网络环境中显得尤为重要)。

认证算法与加密算法

认证算法

认证算法的实现主要是通过杂凑函数。杂凑函数是一种能够接受任意长的消息输入,并产生固定长度输出的算法,该输出称为消息摘要。IPsec对等体计算摘要,如果两个摘要是相同的,则表示报文是完整未经篡改的。IPsec使用两种认证算法:

MD5:MD5通过输入任意长度的消息,产生128bit的消息摘要。

SHA-1:SHA-1通过输入长度小于2的64次方bit的消息,产生160bit的消息摘要。

MD5算法的计算速度比SHA-1算法快,而SHA-1算法的安全强度比MD5算法高。

加密算法

加密算法实现主要通过对称密钥系统,它使用相同的密钥对数据进行加密和解密。目前大多数IPsec设备实现三种加密算法:

DES(Data Encryption Standard):使用56bit的密钥对一个64bit的明文块进行加密。

3DES(Triple DES):使用三个56bit的DES密钥(共168bit密钥)对明文进行加密。

AES(Advanced Encryption Standard):使用128bit、192bit或256bit密钥长度的AES算法对明文进行加密。

这三个加密算法的安全性由高到低依次是:AES、3DES、DES,安全性高的加密算法实现机制复杂,运算速度慢。对于普通的安全要求,DES算法就可以满足需要。

IKE简介

在实施IPsec的过程中,可以使用IKE(Internet Key Exchange,因特网密钥交换)协议来建立SA,该协议建立在由ISAKMP(Internet Security Association and Key Management Protocol,互联网安全联盟和密钥管理协议)定义的框架上。IKE为IPsec提供了自动协商交换密钥、建立SA的服务,能够简化IPsec的使用和管理,大大简化IPsec的配置和维护工作。

IKE不是在网络上直接传输密钥,而是通过一系列数据的交换,最终计算出双方共享的密钥,并且即使第三者截获了双方用于计算密钥的所有交换数据,也不足以计算出真正的密钥。

IKE的安全机制
IKE具有一套自保护机制,可以在不安全的网络上安全地认证身份、分发密钥、建立IPsec SA。

数据认证
数据认证有如下两方面的概念:

身份认证:身份认证确认通信双方的身份。支持两种认证方法:预共享密钥(pre-shared-key)认证和基于PKI的数字签名(rsa-signature)认证。

身份保护:身份数据在密钥产生之后加密传送,实现了对身份数据的保护。

DH
DH(Diffie-Hellman,交换及密钥分发)算法是一种公共密钥算法。通信双方在不传输密钥的情况下通过交换一些数据,计算出共享的密钥。即使第三者(如黑客)截获了双方用于计算密钥的所有交换数据,由于其复杂度很高,不足以计算出真正的密钥。所以,DH交换技术可以保证双方能够安全地获得公有信息。

PFS
PFS(Perfect Forward Secrecy,完善的前向安全性)特性是一种安全特性,指一个密钥被破解,并不影响其他密钥的安全性,因为这些密钥间没有派生关系。对于IPsec,是通过在IKE阶段2协商中增加一次密钥交换来实现的。PFS特性是由DH算法保障的。

IKE的交换过程

IKE使用了两个阶段为IPsec进行密钥协商并建立SA:

第一阶段,通信各方彼此间建立了一个已通过身份认证和安全保护的通道,即建立一个ISAKMP SA。第一阶段有主模式(Main Mode)和野蛮模式(Aggressive Mode)两种IKE交换方法。

Main mode交换方法

第二阶段,用在第一阶段建立的安全隧道为IPsec协商安全服务,即为IPsec协商具体的SA,建立用于最终的IP数据安全传输的IPsec SA。

IKE在IPsec中的作用
因为有了IKE,IPsec很多参数(如:密钥)都可以自动建立,降低了手工配置的复杂度。

IKE协议中的DH交换过程,每次的计算和产生的结果都是不相关的。每次SA的建立都运行DH交换过程,保证了每个SA所使用的密钥互不相关。

IPsec使用AH或ESP报文头中的序列号实现防重放。此序列号是一个32比特的值,此数溢出后,为实现防重放,SA需要重新建立,这个过程需要IKE协议的配合。

对安全通信的各方身份的认证和管理,将影响到IPsec的部署。IPsec的大规模使用,必须有CA(Certificate Authority,认证中心)或其他集中管理身份数据的机构的参与。

IKE提供端与端之间动态认证,IKE是UDP之上的一个应用层协议,是IPsec的信令协议;

IKE为IPsec协商建立SA,并把建立的参数及生成的密钥交给IPsec;

IPsec使用IKE建立的SA对IP报文加密或认证处理。

IPsec的工作原理

封装模式

传输模式(transport):只对IP数据报的数据部分进行加密,在原始IP报文头部与上层协议之间插入AH或ESP协议头。适用于主机到主机方式报文的处理。

隧道模式(tunnel):对整个IP数据报进行加密,增加新IP头部而将原始IP数据包包括头部都作为负载。适用于转发设备上做封装处理的场景。

两者的区别在于 IP 数据报的 ESP 负载部分的内容不同。在隧道模式中,整个 IP 数据报都在 ESP 负载中进行封装和加密。当这完成以后,真正的 IP 源地址和目的地址都可以被隐藏为 Internet 发送的普通数据。这种模式的一种典型用法就是在防火墙-防火墙之间通过虚拟专用网的连接时进行的主机或拓扑隐藏。

安全协议数据封装格式

工作流程

两个IPsec实体之间的IKE协商分为两个阶段:

第一阶段:建立ISAKMP SA

两种模式:

主模式(main mode):6条ISAKMP消息交互
积极模式(aggressive mode):3条ISAKMP消息交互

ISAKMP SA为第二阶段的ISAKMP消息提供安全保护

第二阶段:建立IPsec SA

一种模式:
快速模式(quick mode):3条ISAKMP消息交互
IPSec SA为IP数据提供安全保护
ISAKMP报文头格式

cookie: 用于帮助通信双方确认一个ISAKMP报文是否真的来自对方,对于一个SA,cookie是唯一的,即在协商过程中,cookie不能改变。cookie由各自实体的机密信息生成,该机密信息不能通过cookie推到出来。

交换类型:表示该报文所属的交换类型,通常为主模式或积极模式。

标志 :加密位(encryp):如果是1,表示ISAKMP头部后的所有载荷都被加密了;如果是0,表示是载荷是明文,没有被加密。
提交位(commit):用于确保在发送被保护的数据之前完成协商。

IPsec配置步骤(下面以Cisco为例)

定义协商第一阶段ISAKMP策略
定义ISAKMP消息的保护策略,包括加密算法、验证算法、验证方式等。

定义协商第二阶段IPsec SA策略

定义IP数据的保护策略,协议是使用ESP还是AH、加密算法、验证算法、封装模式是隧道模式还是传输模式等。

定义要被IPsec保护的数据。

定义crypt to map

定义IPsec SA对端通信实体,并配置协商第二阶段IPsec SA策略和保护数据。

在出接口上调用crypt to map

确保路由表中的路由能将被保护的数据从配置了crypt to map的出接口转发出去。

数据包经过IPsec实体时有三种处理方式:IPsec保护、丢弃或旁路(自由穿越,不受保护)。

自由真好

自从今年十月一日以来,GFW针对各种类型自由上网的方式进行了屏蔽,但根据我对六台日本和美国服务器的观察,和对各类机场的销售话术分析,GFW并不能分析出加密流量的内容,它只是根据一些模型,或者人工,人工智能的分析,进行了一些间歇性的屏蔽,那么它的判断标准究竟为何?

一般来说,固定IP点到点,非常规端口的持续TCP流量大概率会被判定可疑,常规端口的流量,一定要符合该端口的流量模型,不符合的就会被判定可疑,进行短暂的中断,大概持续几个小时到几天,是的,屏蔽会取消,为什么会取消?人为的?还是有一个流量计数器,检测到没有持续流量或尝试,便将这个IP移出黑名单。

固定IP点到点的UDP流量,目前并没有这样的软件,但是,我们可以用另外的方式实现这个方案,也就是ipsec,由于ipsec的方案比较起来太过复杂,一般没有人这么做。

SS在今年十月一日之后已经成为历史,因为它只是加密和混淆流量,而没有办法把自己伪装成正常的流量,即使它运行在一个正常的端口,GFW也会进行流量的模型检测,不符合模型的,进行主动探测,比如你运行在25端口,那你要给GFW返回个smtp,运行在110你要给返回helo,如果你什么都不返回,也就是SS的做法,那你就非常可疑了,封掉。

v2ray是一个已经发展相当久的软件,但在十月一日之前,SS可以毫无问题的使用,v2ray也就没有那么显眼,v2ray的设计者在一开始就考虑到了各种场景和伪装,它可以把自己的流量伪装成正常的流量,这样就无法辨识它,因为它就是一个正常的https访问,特别是它的cdn+ws+tls方式,将流量隐藏在各大CDN的浩瀚IP地址中,GFW根本就是大海捞针,用固定IP点到点的TCP流量模型去分析,是不可能在很短的时间内得到结果的。

使用v2ray的cdn模式已经很好用,目前我想不出来有什么办法可以屏蔽它,除非是禁止cdn的https代理中包含websocket请求,理论上来说它可以一纸文件让国内的CDN服务提供商全都这样做,但是它管不了国外的,所以不太可能,而且禁止websocket请求,对于各个手机app厂商来说,简直就是找死啊。

当然对于我来说,我个人更偏好使用ipsec tunnel的方式,把各个不同地点的网络全都连接在一起,然后在这个网络上设置一个简单的明文代理就可以了,加密和解密完全由路由器的硬件来实现,不必费尽心思去考虑说什么样的加密方式速度更快,因为硬件防火墙的指标就在那,DES最大流量多少,3DES最大流量多少,AES最大流量多少。

倒不是说这个方法比较好,这个方法只是我偶然所得,我的本意是要把各地区服务器的局域网互联起来,然后我发现运行在UDP端口上的流量几乎不会受到干扰,因为目前的各类软件都是基于TCP的,更重要的是,ipsec是工业标准,顾名思义,ip security,它是工作在IP协议层的,成千上万的企业在使用它,但配置它对于初学者来说可能是个梦魇,要达到现在非常流行四百块的千兆软路由效果,二手千兆硬件防火墙的成本也可能要接近千元,于购置成本和学习成本来说都很高,但是我相信钱应该不是问题,学习成本太高才是问题,所以没什么人用它,相信在GFW不断升级和进步的未来,可能会有ipsec的用武之地。

这里需要说明一下,市面上的千兆软路由,搭配在售的运营商宽带产品,最高也就到500M,用一个上千元的软路由可以实现,用一个三百块的二手百兆Cisco或Juniper防火墙也是可以实现的,因为Cisco和Juniper可以进行端口聚合,8个端口的百兆防火墙,实际上是可以每4个端口聚合起来,变成400M的吞吐,但这个方案太过复杂和专业,还需要增加一台或两台支持端口聚合的交换机,在两百元到四百元之间,成本太高,但就像上一段说的,钱不会是问题,配置和学习成本才是问题。

使用iperf进行tcp测速

由于目前我的本地带宽最多也就100M,所以一个Juniper百兆硬件防火墙完全就够用,srx110经过加密的ipsec tunnel,官方文档DES吞吐可以达到65M,文档上说AES会低一些,但是我实际测试DES最大也就30M的样子,这可能是因为我本地带宽的问题。

这是建立好的5条IPsec Security Associations,每15分钟rekey一次,你甚至可以设置得更短

在实际场景中我发现,如果使用DES/MD5的方式,在产生较大流量的时候,很快就会被短暂中断连接,如果使用AES256/SHA256的话,检测的时间会稍长。

我并不认为是GFW分析出了这个ipsec tunnel中的流量是什么,符合工业标准的加密流量没有密钥是不可能被解密的,但为什么最低阶的加密方式和最高阶的加密方式之间,会出现时间差异,这是我一直没有想明白的问题,也许是GFW进行了解密,解密后的依然是密文,但是这个密文可能带有某种特征,又或者,也许是GFW做一个简单的屏蔽尝试,如果你是一个跨国企业或者外贸企业的ipsec tunnel,你应该会不停的尝试重连,在达到某个阀值时解除屏蔽,这也符合之前各界人士对于GFW是一个分布式部署的入侵检测系统的猜测。

自由真好。

修改vi的顏色配置

一般來說,我們使用vi的時候,默認是沒有顏色配置的,看起來就是一個色。

第一步,看一下用戶目錄中是否有.vimrc文件,如果沒有的話,那就複製一個。

cp /usr/share/vim/vimrc ~/.vimrc
然後打開這個文件:
vi .vimrc
在set backspace=2下面加一行
syntax enable

vi有提供很多種配色方案,你可以參考如下,讀下README你可以得到更多:

ls /usr/share/vim/vim80/colors
README.txt delek.vim industry.vim pablo.vim slate.vim
blue.vim desert.vim koehler.vim peachpuff.vim torte.vim
darkblue.vim elflord.vim morning.vim ron.vim zellner.vim
default.vim evening.vim murphy.vim shine.vim

複製一下 cp -r /usr/share/vim/vim80/colors ~/.vim/

剛才我們不是在.vimrc文件中添加了一行,那現在比如說我想用那個藍色的配色方案,可以再加一行 colorscheme blue使用這個配色方案。

看起來就好多了嘛!

Deploy Google BBR on Centos

visit https://www.elrepo.org

rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

Centos6:rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm

Centos7:rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

yum –enablerepo=elrepo-kernel install kernel-ml -y

vi /boot/grub/grub.conf

default=0

vi /etc/sysctl.conf

net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr

reboot

sysctl net.ipv4.tcp_available_congestion_control

The output should resemble:
net.ipv4.tcp_available_congestion_control = bbr cubic reno

OpenVPN Server on FreeBSD

和Centos有点区别。

  1. 使用pkg安装openvpn:pkg install openvpn
  2. 使用easy-rsa生成数字证书,生成openvpn server配置文件,默认的即可,我们使用udp协议,把服务端口修改为443,这样比较通用。
  3. 修改rc.conf,启用pf做nat,启用gateway,增加openvpn配置。pf_enable=”YES”
    pf_rules=”/etc/pf.conf”
    pflog_enable=”YES”
    pflog_logfile=”/var/log/pflog”
    gateway_enable=”YES”
    openvpn_enable=”yes”
    openvpn_configfile=”/usr/local/etc/openvpn/2.0/conf/server.conf”
    openvpn_if=”tun”
  4. 增加pf.conf配置文件,这里我们的FreeBSD运行在ESXI上,所以网卡是vmx0,openvpn clients的网络是10.9.0.0/24,服务器的IP地址是192.168.0.99:#/etc/pf.conf
    if=”vmx0″
    vpn_if=”tun0″
    vpn_net = “10.9.0.0/24″icmp_types = “echoreq”
    open_tcp = “{22}”
    open_udp = “{443}”
    # wan ip
    ip = 192.168.0.99
    set block-policy drop
    set skip on lo0
    set limit { states 10000, frags 5000 }
    set loginterface vmx0
    set optimization normal
    set require-order yes
    set fingerprints “/etc/pf.os”
    set ruleset-optimization basicscrub in all fragment reassemble random-idnat on $if from $vpn_net to any -> $ip

    block log all
    block return

    antispoof quick for $if
    pass in quick proto udp from any to port 443 keep state label “openvpn”

    # Pass stuff on the VPN interface
    pass quick on $vpn_if keep state

    pass in on $if proto tcp from any to any port 22 keep state

    pass in on $if proto tcp from any to any port $open_tcp keep state
    pass in on $if proto udp from any to any port $open_udp keep state

    pass out quick all keep state

    pass in on $if inet proto icmp all icmp-type $icmp_types keep state

  5. 在sysctl.conf中增加IP forwarding配置:net.inet.ip.forwarding=1
  6. 可以启动了:service openvpn start
  7. 其实大同小异,不过最近发现zfs和jail都是蛮不错的好东西,大神的设计往往超越了时代,却是那些简陋而充满bug的设计流行于世间。