Ubuntu 14.04 搭建 Cisco IPSec VPN 服务器教程, 证书制作, 参数说明

摘要:Ubuntu 14.04 搭建 Cisco IPSec VPN 服务器教程, 证书制作, 参数说明...

作者:LoveCode标签:Ubuntu,搭建,Cisco,IPSec,VPN,服务器,教程, 证书制作, 参数说明

iOS 和 OS X 都自带 Cisco IPSec VPN 客户端,使用起来非常方便,安全性也比 PPTP 高。


搭建过程

安装strongswan

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

编辑 /etc/ipsec.secrets

替换8.8.8.8为服务器IP

8.8.8.8 %any : PSK "your-pskkey"
haha : XAUTH "hahapassword"
xixi : XAUTH "xixipassword"

编辑 /etc/ipsec.conf

config setup
       cachecrls=yes
       uniqueids=yes

ca vpnca
        cacert=caCert.pem
        crluri=crl.pem
        auto=add

conn %default
        auto=add
        left=%defaultroute
        leftsubnet=0.0.0.0/0
        right=%any
        
conn ios
       keyexchange=ikev1
       authby=xauthpsk
       xauth=server
       left=%defaultroute
       leftsubnet=0.0.0.0/0
       leftfirewall=yes
       right=%any
       rightsubnet=10.100.0.0/24
       rightsourceip=10.100.0.2/24
       rightdns=8.8.8.8
       auto=add
       dpddelay=30s
       dpdtimeout=120s
       dpdaction=clear

conn win7&android
        keyexchange=ikev2
        ike=aes256-sha1-modp1024!
        esp=aes256-sha1!
        dpdaction=clear
        dpddelay=30s
        rekey=no
        leftauth=pubkey
        leftcert=serverCert.pem
        leftid="C=CH, O=strongSwan, CN=VPS的公网ip"
        rightsourceip=10.100.0.2/24
        rightauth=eap-mschapv2
        rightsendcert=never
        eap_identity=%any

conn cisco
        keyexchange=ikev1
        ike=aes256-sha1-modp1024!
        esp=aes256-sha1!
        dpdaction=clear
        dpddelay=30s
        rekey=no
        #leftauth=pubkey
        leftcert=serverCert.pem
        leftid="C=CH, O=strongSwan, CN=VPS的公网ip"
        rightsourceip=10.100.0.2/24
        ikelifetime=60m
        keylife=20m
        rekeymargin=3m
        keyingtries=1
        type=tunnel
        authby=xauthrsasig
        xauth=server

重启 strongswan(如果重启失败,请确认缩进格式和默认的格式一样)

service strongswan restart

打开IPv4转发,设置NAT规则

sysctl net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 10.100.0.0/8 -o eth0 -j MASQUERADE

#编辑网卡文件,加载网卡时自动加载规则
sudo vi /etc/network/interfaces
#末尾加入:
pre-up iptables-restore < /etc/iptables-rules
#设置MTU,防止包过大:
sudo iptables -A FORWARD -s 10.100.0.0/8 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1356
#将规则保存,使重启后规则不丢失:
sudo iptables-save > /etc/iptables-rules


要在mac下连接Shared Secret:填写上面

PSK "your-pskkey"

中的值即可


如果strongman/ipsec启动失败,参考:

http://huangshanben.com/articles/2947


生成证书(可选)

注意 如果不生成证书,后面配置部分的配置中用 pubkey 认证的 conn 都不能用,甚至不能保留在配置中。

每一个完整的 ssl 证书都有一个公钥和一个私钥,它们可以在一起也可以分开放(当然如果你要在网络上传输,肯定只能用公钥)。公钥是在网络上传输的,而私钥是藏好用来和接收到的公钥配对的(因此私钥里也有整个公钥,用来配对)。

生成 CA 证书

生成一个私钥:

ipsec pki --gen --outform pem > ca.pem

没什么好解释的,--outform 一共有三个格式可选,但是另外两个是 der 和 pgp...

基于这个私钥自己签一个 CA 证书:

ipsec pki --self --in ca.pem --dn "C=CN, O=strongSwan, CN=strongSwan CA" --ca --outform pem > ca.cert.pem

这里 --self 表示自签证书,--in 是输入的私钥,--dn 是判别名,--ca 表示生成 CA,其它同上。这里需要解释下判别名:

  • C 表示国家名,同样还有 ST 州/省名,L 地区名,STREET(全大写) 街道名。

  • O 表示组织名。

  • CN 为通用名。

具体见微软的文档:Distinguished Names

生成服务器证书

同样生成私钥:

ipsec pki --gen --outform pem > server.pem

用我们刚才自签的 CA 证书给自己发一个服务器证书:

 ipsec pki --pub --in server.pem | ipsec pki --issue --cacert ca.cert.pem \
--cakey ca.pem --dn "C=CN, O=strongSwan, CN=forum.suse.org.cn" \
--san="forum.suse.org.cn" --flag serverAuth --flag ikeIntermediate \
--outform pem > server.cert.pem

这条命令的意思解释下:

ipsec pki --pub --in server.pem

是从我们刚生成的私钥里把公钥提取出来,然后用公钥去参与后面的服务器证书签发(这个是 VPN 连接时候要用的,你不想把私钥也给它吧?那样跟没签证书一样...)。

--issue, --cacert 和 --cakey 就是表明要用刚才自签的 CA 证书来签这个服务器证书。

--dn, --san,--flag 是一些客户端方面的特殊要求:

  • iOS 客户端要求 CN 也就是通用名必须是你的服务器的 URL 或 IP 地址;

  • Windows 7 不但要求了上面,还要求必须显式说明这个服务器证书的用途(用于与服务器进行认证),--flag serverAuth;

  • 非 iOS 的 Mac OS X 要求了“IP 安全网络密钥互换居间(IP Security IKE Intermediate)”这种增强型密钥用法(EKU),--flag ikdeIntermediate;

  • Android 和 iOS 都要求服务器别名(serverAltName)就是服务器的 URL 或 IP 地址,--san。

生成客户端证书

依然是生成私钥:

ipsec pki --gen --outform pem > client.pem

然后用刚才自签的 CA 证书来签客户端证书:

 ipsec pki --pub --in client.pem | ipsec pki --issue --cacert caCert.pem \
--cakey caKey.pem --dn "C=CN, O=strongSwan, CN=client" \
--outform pem > client.cert.pem

这时命令行会提示你输入两遍密码,这个就是你的客户端证书密码

看懂了服务器的,客户端的也就不难理解了。除了没有那一堆特殊要求别的都一样。

客户端证书可以每个客户端签一个,也可以让它们公用一个。是否多签看用途,一般用于区分设备(计费是不用这样的,是用账户来区分的)。

生成 pkcs12 证书(可选)

你可能还想生成一个可以直接导入的 pkcs12 证书(用于手机,诺基亚没这东西还不行):

 openssl pkcs12 -export -inkey client.pem -in client.cert.pem -name "client" \
-certfile ca.cert.pem -caname "strongSwan CA" -out client.cert.p12

安装证书

cp -r ca.cert.pem /etc/ipsec.d/cacerts/
cp -r server.cert.pem /etc/ipsec.d/certs/
cp -r server.pem /etc/ipsec.d/private/
cp -r client.cert.pem /etc/ipsec.d/certs/
cp -r client.pem /etc/ipsec.d/private/

CA 证书、客户证书(两个)和 .p12 证书用 FTP 复制出来给客户端用。有几种 Android 配置还需要服务器证书(server.cert.pem)。


相关参数说明:

CONN SECTIONS

conn项定义了一个IPsec连接的规范,名字可以随意定义。例如:

conn snt

    left=10.11.11.1
    leftsubnet=10.0.1.0/24
    leftnexthop=172.16.55.66
    leftsourceip=10.0.1.1
    right=192.168.22.1
    rightsubnet=10.0.2.0/24
    rightnexthop=172.16.88.99
    rightsourceip=10.0.2.1
    keyingtries=%forever

CONN PARAMETERS: GENERAL

connaddrfamily

    连接地址族,可用参数为ipv4(缺省)或者ipv6。

    IPv6在openswan 2.4中的NETKEY支持和openswan 2.6.33中的KLIPS支持

type

    连接类型,参数如下:

        tunnel(缺省)表示 host-to-host,host-to-subnet,subnet-to-subnet 隧道模式;

        transport,表示 host-to-host传输模式;

        passthrough,表示不使用IPsec;        drop,表示丢弃数据;

        reject,表示丢弃数据并返回ICMP诊断包

left

    [必选项] 左侧设备公网接口IP地址,其中IP地址的格式请看ipsec_ttoaddr(3)。当前支持IPv4和IPv6。

    如果其参数为 %defaultroute,同时 config setup 项中的 interfaces 包含 %defaultroute,那么left将自动由本地的缺省路由接口地址填充;leftnexthop也支持。    %any 表示在协商时填充。    %opportunistic 表示 left 和 lefnexthop 的参数从 left 侧客户端的DNS数据中获取

leftsubnet

    左侧设备的私有子网,格式为 network/netmask (请看ipsec_ttosubnet(3));当前支持IPv4和IPv6地址范围。

    支持 vhost: 和 vnet: 这2个速记,语法与 virtual_private 相同    %priv 表示子网与 virtual_private相同    %no 表示没有子网

leftsubnets

    指定左侧设备的多个私有子网,格式 { networkA/netmaskA networkB/netmaskB [..] }。leftsubnet 和 leftsubnets 不能同时使用。 例子请看 testing/pluto/multinet-*

leftprotoport

    指定隧道中允许的通过的协议和端口。参数可以是数字或者协议名(请在 /etc/protocols 中查找),例如 leftprotoport=icmp,或 protocol/port,如 tcp/smtp。

    ports可以使用数字或名字表示(请在 /etc/services 中查找)。    %any 表示所有的协议端口

leftnexthop

    左侧设备连接公网的下一跳网关IP地址;缺省为 %direct。如果这方法没有使用,则leftnexthop为 %defaultroute

leftsourceip

    连接中主机的IP地址

leftupdown

    当连接状态改变时, 回调此处设置的命令(缺省为 ipsec _updown)。 详细请看 ipsec_pluto(8)

leftfirewall

    不再使用此选项

CONN PARAMETERS:AUTOMATIC KEYING

auto

    IPsec启动时自动执行;现在支持的参数有 

        add (ipsec auto --add)

        route(ipsec auto --route)start(ipsec auto --up)

        manual(ipsec manual --up)ignore 表示不自动启动

    具体请看 config setup

authby

    2个安全网关之间的认证方法;

    secret 表示共享密钥

    rsasig 表示RSA数据签名(缺省)

    secret|rsasig 同时使用

ike

    IKE第一阶段(ISAKMP SA)中的加密/认证算法。格式为 "cipher-hash;modpgroup,cipher-hash;modpgroup,..."

        例如:ike=3des-sha1,aes-sha1, ike=aes, ike=aes128-md5;modp2048, 

             ike=aes128-sha1;dh22, ike=3des-md5;modp1024,aes-sha1;modp1536 or ike=modp1536

    算法值请查看 ipsec_spi(8)中的 --ike选项。

      IKE组合形式:        cipher:                              3des or aes        hash:                                sha1 or md5

        pfsgroupt(DHgroup):                  modp1024 or modp153

phase2

    设置将产生的SA类型。esp用于加密(缺省),ah用于认证

phase2alg

    指定第二阶段中支持的算法。算法之间用逗号分隔

esp

    此选项不再使用,用phase2alg代替

ah

    连接中的AH算法。算法格式请看 ipsec_spi(8)中的 --ah选项

ikev2

    IKEv2(RFC4309)设置使用。

    never 或 no 表示不使用IKEv2;

    propos 或 yes 表示允许使用IKEv2,同时缺省使用IKEv2进行协商;

    insist,表示只接受IKEv2协商,IKEv1将被拒绝;

    permit(缺省),表示不主动使用IKEv2,但对端使用IKEv2的话也接受

leftid

    左侧参加者的身份确认方法。

    可以是IP地址,域名    %fromcert 表示ID从证书的DN获取;%none 表示不使用ID值

leftrsasigkey

    左侧RSA签名认证,格式使用RFC2537 ipsec_ttodata(3)编码。    %none 表示不指定值; 

    %dnsondemand 表示值从DNS中获取当需要使用到此值时; 

    %dnsonload 表示值从DNS中获取当读取ipsec.conf时;    %cert 表示信息从 %leftcert 中获取

leftrsasigkey2

    第2个公钥

leftcert

    指定X509证书,如果没有指定全路径,则从 /etc/ipsec.d/certs/ 目录中查找

    如果opesnswan编译时指定了 USE_LIBNSS=true,那么openswan将会去NSS数据库中查找RSA key

leftca

    指定CA,如果没有指定,那么将用 leftcert 中的证书认为是CA证书

leftsendcert

    openswan发送X509证书到远程主机的选项配置。    yes|always 表示总是允许发送证书

    ifasked 表示如果远程主机要求证书则进行发送    no|never 表示从不发送证书。

    缺省参数为 ifasked

leftxauthserver

    左侧为XAUH服务端。可以使用PAM认证或 /etc/ipsec.d/passwd中的MD5口令。对端必须配置为rightxauthclient ,做为XAUTH客户端

leftxauthclient

    左侧为XAUT客户端。xauth连接必须进行交互启动,不能使用配置 atuo=start。它必须使用命令行ipsec auto --up conname

leftxauthusername

    XAUTH认证中使用的用户名,XAUTH密码在 ipsec.secrets 文件中配置

leftmodecfgserver

    左侧是模式配置服务端。它能下发网络配置到客户端。 参数为 yes 或 no (缺省)

leftmodecfgclient

    左侧是模式配置客户端。它能从服务端接收网络配置。参数为 yes 或 no (缺省)

modecfgpull

    从服务端接收模式配置信息。参数为 yes 或 no (缺省)

modecfgdns1, modecfgdns2, modecfgwins1, modecfgwins2

    指定DNS、WINS的IP地址

remote_peer_type

    设置远程主机类型。参数为 cisco 或 ietf

forceencaps

    参数为 yes 或 no (缺省为no)

    当forceencaps=yes时将强制使用RFC-3948封装(UPD端口4500包封闭ESP)

    如果此选项打开,那么 nat_traveral=yes必须打开

dpddelay

    主机探测延迟时间,缺省为30秒。如果此选项被设置,dpdtimeout也应该设置

dpdtimeout

   主机探测超时时间(以秒为单位),缺省为120秒。如果超时,将删除SA

dpdaction

    当PDP探测到主机死亡时要执行的动作

    hold (缺省)表示eroute将进入 %hold 状态

    clear 表示eroute和SA都要清除

    restart 表示SA将立即从协商

    restart_by_peer 表示所有死亡主机的SA将进行从协商

pfs

    参数为 yes 或 no (缺省为yes)

aggrmode

    使用野蛮模式替换主模式。野蛮模式不安全,容易受到服务拒绝攻击。

    参数为 yes 或 no (缺省为no)

salifetime

    SA存活时间,参数为数字 + s/m/h/d (缺省为8h,最大24h)    "keylife""lifetime" 是 "salifetime" 的别名

rekey

    参数为 yes 或 no (缺省为 yes)。表示当密钥到期后是否进行从协商

rekeymargin

    密钥到期前多长时间进行从协商。参数请看 salifetime (缺省9m)

keyingtries

    协商尝试次数。 %forever 表示从不放弃,一直进行协商

ikelifetime

    IKE存活时间。参数请看salifetime

compress

    是否进行压缩处理。 参数为 yes 或 no (缺省为 no)

metric

     设置ipsecX 或 mastX 接口的 metric 优先级

mtu

    设置MTU

failureshunt

    当协商失败时执行的动作。缺省为 none;passthrough;drop;reject;具体看选项 type

CONFIG SECTIONS

    config部分使用为一名字setup,此部分包含了软件启动时所使用到的信息(ipsec_setup(8). 例如:

config setup

        interfaes="ipsec0=eth1 ipsec1=ppp0"
        klipsdebug=none
        plutodebug=control
        protostack=auto
        manualstart=

config setup目前可用的选项如下:

protostack

    指定IPsec协议攻栈。参数为 auto/klips/netkey/mast。mast是klips的变种

interfaces

    IPsec使用的虚接口和实接口。格式为 "virtual=physical virtual=physical ..."

listen

    监听IP地址

nat_traversal

    是否支持NAT。参数为 yes 或 no (缺省为no)

disable_port_floasting

    是否启用NAT-T。 参数为 yes 或 no (缺省为no)

force_keepalive

    是否强制发送NAT-T保活。参数为 yes 或 no (缺省为no)

keep_alive

    NAT-T保活包发送间隔时间

oe

    是否启用机会加密(Opportunistic Encryption)。参数为 yes 或 no(缺省为no)

    只有KLIPS支持此选项

nhelpers

    设置pluto处理密码运算的进程(线程)

    0表示所有操作都在主线程

    -1表示根据CPU进行计算(n-1,n是CPU数)

    其它值则表示强制的进程(线程)数

crlcheckinterval

    CRL检查间隔时间,单位为秒。 如果设置为0表示开关CRL检查

strictcrlpolicy

    是否强制进行CRL检查。参数为 yes 或 no (缺省为no)

forwardcontrol

    此选项不再使用。请使用 /etc/sysctl.conf 文件中的 net.ipv4.ip_forward=0 控制IP转发设置

rp_filter

    此选项不再使用。请使用 /etc/sysctl.conf 文件中的 net.ipv4.conf/[iface]/rp_filter=0 。 此参数在IPsec必须设置为0

syslog

    syslog(2)中的显示名。缺省为 daemon.error

klipsdebug

    KLIPS日志输出设置。none表示不输出;all表示全部输出。具体参数请看 ipsec_klipsdebug(8)

plutodebug

    pluto日志输出设置。none表示不输出;all表示全部输出。具体参数请看 ipsec_pluto(8)

uniqueids

    唯一ID。参数为 yes 或 no (缺省为yes)

plutorestartoncrash

    当pluto崩溃时重启,并生成core文件。参数为 yes 或 no(缺省为yes)

plutopts

    设置pluto的额外参数。具体请看ipsec_pluto(8)

plutostderrlog

    不使用syslog,把日志输出重定向到指定的文件中

pluto

    是否启动pluto。参数为 yes 或 no(缺省为yes)

plutowait

    在处理下一个协商时,pluto是否等待当前协商完成。参数为 yes 或 no(缺省为no)

prepluto

    配置Pluto启动前执行的脚本

postpluto

    配置Pluto启动后执行的脚本

dumpdir

    设置core dump文件路径

fragicmp

    包被分片时是否发送ICMP消息。参数为 yes 或 no (缺省为yes)。此选项只对KLIPS起作用

hidetos

    隧道中数据包的TOS设置为0。参数为 yes 或 no(缺省为yes)。此选项只对KLIPS起作用

overridemtu

    设置ipsecX接口的MTU。此选项只对KLIPS起作用


CopyRight © 2017 荒山本的官方网站 粤ICP备16049175号 All Right Service 网站地图(xml) 网站地图(html)