2017-09-04
用strongswan配置vpn

什么是ipsec

ipsec是在网络层上提供安全保护(包括加密,认证,访问控制等)的一组协议.

ipsec提供的是一种机制而不是策略。最明显的一点是它没规定必须用什么加密算法,而是通过配置和双方协商决定.

ipsec的通讯大致可分成两个阶段: 初始化阶段 和 数据交换阶段。 初始化阶段负责(为当前的通讯和后面数据交换的通讯)沟通好必要的安全参数和配置信息. 数据交换阶段利用初始化阶段沟通好的安全参数来保护数据.

在ipsec的术语里,连接发起者称为initiator, 另一方称为responder. ipsec可以选择性的处理网络包,这些筛选规则存在叫做security policy database(SPD)的数据库里.

strongswan本质上只是一个keying daemon, 即用IKE来建立SA,并把沟通好的SA和SP通过内核api载入到系统内核里,实际的ipsec 流量只在内核里被处理而不会流经strongswan。

strongswan里,”Charon”是IKE daemon. IKE 默认使用UDP的500(当使用nat-t时默认4500)端口通讯.

strongswan 通过ipsec.conf来配置跟ipsec相关的参数,strongswan.conf配置跟strongswan相关的参数.

ipsec.conf

在ipsec.conf里一个conn表示一个initiator和responder建立起的连接。conn可以通过also=来继承已有conn的配置。

当一个连接发起时,strongswan首先是通过多个因素(IP address(left/right),IKE版本,认证方式,leftid等)来匹配conn.

一般用left代表这一边,right代表对方。

一些重要的conn 参数:

  1. auto

    auto=add 表示ipsec daemon作为responder. auto=start 表示ipsec daemon启动时会主动执行,作为initiator.

  2. leftsubnet

    有这个值表明left是一个gateway。对方只能与该网段内的ip通讯。(同理rightsubnet)

  3. leftfirewall

  4. rightsourceip

    为对方分配的内部ip源地址.

  5. left

    你的ip地址,%defaultroute表示用系统默认

  6. right

    对方的ip地址,%any表示对方可以是任何地址。

在ubuntu上用ipsec配置一个vpn

这里用 ikev1 + xauth 方案来实现vpn.

要为转发的包分配一个虚拟地址,注意不要跟已经用的网段重合了,这里用192.168.201.0/24.

安装

sudo apt-get install strongswan strongswan-plugin-xauth-generic

配置ipsec.conf

conn XAUTH-PSK
    keyexchange=ikev1
    aggressive=yes   # 用IKEv1的aggressive mode

    leftauth=psk     # 这里也可以用 authby=xauthpsk ; xauth=server 替代
    rightauth=psk
    rightauth2=xauth

    left=%defaultroute
    leftsubnet=0.0.0.0/0  # ip的目标地址为任意地址
    leftfirewall=yes
    right=%any
    rightsubnet=0.0.0.0/0
    rightsourceip=192.168.201.1/24
    rightdns=8.8.8.8
    auto=add

配置strongswan.conf

在charon {…} 内加入

    install_virtual_ip = yes
    i_dont_care_about_security_and_use_aggressive_mode_psk = yes
    dns1 = 8.8.8.8
    dns2 = 8.8.4.4

在ipsec.secrets里配置xauth 和 psk

    : PSK "ThisIsYourPSK"
    
    UserName1 : XAUTH "PASSWD1"
    UserName2 : XAUTH "PASSWD2"

配置iptables转发

把网络包通过nat的方式从外网出口出去

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j MASQUERADE  # 把eth1替换为你的外网出口

启动ipsec

ipsec start

或者

ipsec start --nofork

lazyrobot.me