linux: ipsec服务器搭建
http://bbs.pceva.com.cn/thread-130112-1-1.html
先看看常用VPN协议有哪些?
常用的虚拟专用网协议有:
L2F
L2TP
PPTP
IPsec (如Cisco IPSec VPN)
SSL VPN
AnyConnect(Cisco SSL VPN)
OpenVPN
SoftEther
各协议的优缺点就不说了,有兴趣可以自己去查,这里我只关注IPsec。
基于IPsec的VPN通道其实包含以下两个部分:
IKE协议(互联网密钥交换协议): 两个系统端使用IKE协议来互相验证,并协商建立IPsec通道所需的特定加密参数和两端特定的网段。
IPsec协议(IP安全协议):使用特定加密参数对特定数据进行加密传输,通常由操作系统内核实现,目前基本上所有主流操作系统都支持IPsec协议。
用白话说就是,IKE负责连接双方的身份验证,双方协商得出的密码和使用的加密算法都告知给操作系统,操作系统对两边网段之间的流量数据进行加密传输。
既然数据加密传输的活都给操作系统来干了,操作系统我们也没什么好选的,能选的就只有实现IKE协议的软件了。
IKE的版本发展:
1988年11月,互联网工程任务组在一系列的RFC文件中,定义了这个协议,其中包括了 RFC 2407,RFC 2408 以及 RFC 2409。
2005年以后,IKE版本升级到了IKEv2版本,RFC文件有所更新,其中包括 RFC 4306, RFC 4718,RFC 5996 以及 RFC 7296。
IKEv2的主要改进:
更精简的RFC标准化文档
对移动设备更好的支持
全面支持NAT穿越和SCTP协议
简化的信息交换机制
增强的可靠性和状态管理
更好的防范DoS攻击机制
如下为当前可用的IKEv2开源实现:
OpenIKEv2,
strongSwan,
Openswan,
IKEv2,
Racoon and Racoon2 from the KAME project,
iked from the OpenBSD project.,
Libreswan,
Rockhopper VPN Software
名单的有些软件已经很久不更新了。
而稍微留心一下这个名单,会发现有个字眼很显眼,很明显就是天鹅swan家族:strongSwan, Openswan, Libreswan。
它们其实有一个共同的鼻祖:FreeS/WAN开源项目.
安装strongSwan的运行依赖环境
yum -y install gpm-devel pam-devel openssl-devel make gcc
下载源程序编译安装
为使用最新版本,还是得自己下载源码编译安装,我测试时的版本是5.3.5。
1.下载源代码压缩包
cd /root
wget http://download.strongswan.org/strongswan.tar.gz
2.解压
tar zxvf strongswan.tar.gz
3.编译安装
程序安装路径:/usr
strongSwan配置文件路径:/etc/strongswan
cd strongswan-5.3.5
./configure --prefix=/usr --sysconfdir=/etc/strongswan --enable-eap-identity --enable-eap-md5 \
--enable-eap-mschapv2 --enable-eap-tls --enable-eap-ttls --enable-eap-peap \
--enable-eap-tnc --enable-eap-dynamic --enable-eap-radius --enable-xauth-eap \
--enable-xauth-pam --enable-dhcp --enable-openssl --enable-addrblock \
--enable-unity --enable-certexpire --enable-radattr --enable-tools \
--enable-openssl --disable-gmp
make
make install
配置私钥和证书
1.生成CA私钥,并使用此私钥自签名生成CA证书
cd /etc/strongswan
ipsec pki --gen --outform pem > ca.pem
ipsec pki --self --in ca.pem --dn "C=CN, O=VPN, CN=strongSwan CA" --ca --lifetime 3652 \
--outform pem > ca.cert.pem
这里C表示国家名,O表示组织名,CN为通用名。默认证书有效期为3年,这里配置3652天,即10年。
2.生成服务器私钥,然后从私钥中导出公钥,用CA证书签发服务器证书
ipsec pki命令可用来生成RSA密钥对,包含了私钥和公钥,公钥是在网络上传输的,而私钥是藏好用来和接收到的公钥配对的(因此私钥里也有整个公钥,用来配对)
ipsec pki --gen --outform pem > server.pem
ipsec pki --pub --in server.pem | ipsec pki --issue --lifetime 3652 --cacert ca.cert.pem \
--cakey ca.pem --dn "C=CN, O=VPN, CN=119.81.236.70" --san="119.81.236.70" \
--flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem
a. iOS 客户端要求 CN 也就是通用名必须是你的服务器的 URL 或 IP 地址。
b. 除了上述要求,Windows 7 还要求必须显式说明这个服务器证书的用途(用于与服务器进行认证)--flag serverAuth。
c. 非 iOS 的 Mac OS X 要求了“IP 安全网络密钥互换居间(IP Security IKE Intermediate)”这种增强型密钥用法(EKU)--flag ikdeIntermediate。
d. Android 和 iOS 都要求服务器别名(serverAltName)就是服务器的 URL 或 IP 地址,--san。
所以这里C、O的值要跟第1步的一致,CN值及--san值是服务器公网地址或url,另外这里可以设置多个--san值。否则会出现错误 13801:IKE身份验证凭证不可接受.
3.生成客户端私钥,然后从私钥中导出公钥,用CA证书签发客户端证书
ipsec pki --gen --outform pem > client.pem
ipsec pki --pub --in client.pem | ipsec pki --issue --lifetime 3652 --cacert ca.cert.pem \
--cakey ca.pem --dn "C=CN, O=VPN, CN=strongSwan Client" --outform pem > client.cert.pem
这里C、O的值要跟第1步的一致
4.生成 pkcs12 证书,用来导入手机或电脑
openssl pkcs12 -export -inkey client.pem -in client.cert.pem -name "strongSwan Client" \
-certfile ca.cert.pem -caname "strongSwan CA" -out client.cert.p12
Export Password: pceva.com
生成时需设置密码,例如:pceva.com,请记住这个密码,在客户端导入此证书时需输入该密码。
安装证书
把刚才生成的私钥和证书文件复制到目录/etc/strongswan/ipsec.d/下的指定目录下即可。
cp -r ca.cert.pem /etc/strongswan/ipsec.d/cacerts/
cp -r server.cert.pem /etc/strongswan/ipsec.d/certs/
cp -r server.pem /etc/strongswan/ipsec.d/private/
cp -r client.cert.pem /etc/strongswan/ipsec.d/certs/
cp -r client.pem /etc/strongswan/ipsec.d/private/
cacerts/目录下放置CA证书
certs/目录下放置服务器和客户端证书
private/目录下放置服务器和客户端私钥
配置strongSwan
strongSwan包含3个配置文件,在目录/etc/strongswan/下。
strongswan.conf strongSwan各组件的通用配置
ipsec.conf IPsec相关的配置,定义IKE版本、验证方式、加密方式、连接属性等等
ipsec.secrets 定义各类密钥,例如:私钥、预共享密钥、用户账户和密码
vi /etc/strongswan/strongswan.conf
# strongswan.conf - strongSwan configuration file
#
# Refer to the strongswan.conf(5) manpage for details
#
# Configuration changes should be made in the included files
charon {
load_modular = yes
duplicheck.enable = no #冗余检查关闭,以允许同时连接多个设备
compress = yes #传输启用压缩
plugins {
include strongswan.d/charon/*.conf
}
dns1 = 8.8.8.8 #给远程端指定DNS服务器
dns2 = 8.8.4.4
nbns1 = 8.8.8.8 #指定Windows的WINS服务器
nbns2 = 8.8.4.4
filelog { #配置strongSwan日志级别和路径
/var/log/strongswan.log {
time_format = %b %e %T
default = 2
append = no
flush_line = yes
}
}
}
include strongswan.d/*.conf
vi /etc/strongswan/ipsec.conf
# ipsec.conf - strongSwan IPsec configuration file
config setup
uniqueids=never #关闭ID唯一性,即允许多个客户端使用同一个证书,多设备同时在线
conn %default #默认配置项,其他conn配置项都会调用此默认项
left=%any #left表示local,即本地端(服务器端)IP地址;%any是魔数字,表示任意地址
leftsubnet=0.0.0.0/0 #本地端网络,0.0.0.0/0为通配,表示所有IP网段
right=%any #right表示remote,即远程端(客户端)IP地址可为任意地址
rightsourceip=10.10.10.0/24 #分配给远程端的虚拟IP地址段,尽量避免使用常用私网地址段以免冲突
dpdaction=clear #dpd表示Dead Peer Detection,对端失效检测,clear表示对端失效时关闭连接
conn IKEv1-CERT-XAUTH #供老版本IOS使用。IKEv1,使用证书和XAUTH验证
keyexchange=ikev1 #密钥交换使用IKEv1
fragmentation=yes #允许分片
leftauth=pubkey #本地端使用公钥验证
leftcert=server.cert.pem #指定本地端证书
rightauth=pubkey #远程端使用公钥验证
rightauth2=xauth #远程端使用用户账号验证
rightcert=client.cert.pem #指定远程端证书
auto=add #auto定义strongSwan服务启动时该连接的行为,add是添加连接类型但不启动
conn IKEv1-PSK-XAUTH #供IOS, Android使用。IKEv1,使用预共享密钥和XAUTH验证
keyexchange=ikev1 #密钥交换使用IKEv1
leftauth=psk #本地端使用预共享密钥验证
rightauth=psk #远程端使用预共享密钥验证
rightauth2=xauth #远程端使用用户账号验证
auto=add #strongSwan启动时添加连接类型但不启动
conn IKEv2-CERT #供Windows 7+, Linux使用。IKEv2,使用证书验证
keyexchange=ikev2 #密钥交换使用IKEv2
leftauth=pubkey #本地端使用公钥验证
leftcert=server.cert.pem #指定本地端证书
rightauth=pubkey #远程端使用公钥验证
rightcert=client.cert.pem #指定远程端证书
auto=add #strongSwan启动时添加连接类型但不启动
conn IKEv2-EAP #供Windows 7+, IOS9+使用。IKEv2,EAP验证
keyexchange=ikev2 #密钥交换使用IKEv2
ike=aes256-sha256-modp1024,3des-sha1-modp1024,aes256-sha1-modp1024! #第一阶段加密方式
esp=aes256-sha256,3des-sha1,aes256-sha1! #ESP的顺序与IKE一致
rekey=no #本地端对Windows远程端发出rekey请求会断开连接,所以需配置为no
leftauth=pubkey #本地端使用公钥验证
leftcert=server.cert.pem #指定本地端证书
leftsendcert=always #本地端总是发送证书
leftid=119.81.236.70 #本地端标识,使用本地端公网IP地址作为标识,和生成服务器证书时的--san参数对应
rightauth=eap-mschapv2 #远程端使用eap-mschapv2验证
rightsendcert=never #不要求远程端发送证书
eap_identity=%any #指定EAP验证身份,任意账户
fragmentation=yes #允许分片
auto=add #strongSwan启动时添加连接类型但不启动
密码文件ipsec.secrets文件默认不存在,需要自己生成。
vi /etc/strongswan/ipsec.secrets
: RSA server.pem #指定服务器的RSA私钥文件
: PSK "hello2016.pceva.com" #配置预共享密钥为:hello2016.pceva.com
stone : XAUTH "PCeva2016" #配置XAUTH验证的用户名stone和密码PCeva2016,可配置多个用户账户
stone : EAP "PCeva2016" #配置EAP验证的用户名stone和密码PCeva2016,可配置多个用户账户
更改密码文件读写权限,仅限root可读写
chmod 600 ipsec.secrets
CentOS配置转发
sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
sysctl -p
CentOS配置iptables防火墙,允许UDP500,UDP4500,并配置转发和NAT规则
vi /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Thu Mar 31 17:56:08 2016
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [17175:5181315]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth1 -p udp -m udp --dport 500 -j ACCEPT
-A INPUT -i eth1 -p udp -m udp --dport 4500 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.10.10.0/24 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Thu Mar 31 17:56:08 2016
# Generated by iptables-save v1.4.7 on Thu Mar 31 17:56:08 2016
*nat
:PREROUTING ACCEPT [69:5938]
:POSTROUTING ACCEPT [13:839]
:OUTPUT ACCEPT [13:839]
-A POSTROUTING -s 10.10.10.0/24 -o eth1 -j MASQUERADE
COMMIT
# Completed on Thu Mar 31 17:56:08 2016
配置完成后,重启iptables服务,使新规则生效。
service iptables restart
配置init.d服务启动脚本(源码编译安装不带此脚本)
vi /etc/init.d/strongswan
#!/bin/sh
#
# strongswan An implementation of key management system for IPsec
#
# chkconfig: - 48 52
# description: Starts or stops the Strongswan daemon.
### BEGIN INIT INFO
# Provides: ipsec
# Required-Start: $network $remote_fs $syslog $named
# Required-Stop: $syslog $remote_fs
# Default-Start:
# Default-Stop: 0 1 6
# Short-Description: Start Strongswan daemons at boot time
### END INIT INFO
# Source function library.
. /etc/rc.d/init.d/functions
exec="/usr/sbin/ipsec"
prog="strongswan"
status_prog="starter"
config="/etc/strongswan/strongswan.conf"
lockfile=/var/lock/subsys/$prog
start() {
[ -x $exec ] || exit 5
[ -f $config ] || exit 6
echo -n $"Starting $prog: "
daemon $exec start
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
$exec stop
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
stop
start
}
reload() {
restart
}
force_reload() {
restart
}
_status() {
# run checks to determine if the service is running or use generic status
status $status_prog
}
_status_q() {
_status >/dev/null 2>&1
}
case "$1" in
start)
_status_q && exit 0
$1
;;
stop)
_status_q || exit 0
$1
;;
restart)
$1
;;
reload)
_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
_status
;;
condrestart|try-restart)
_status_q || exit 0
restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
exit 2
esac
exit $?
配置开机时strongswan服务自启动
cd /etc/init.d
chmod +x strongswan
chkconfig --add strongswan
chkconfig strongswan on
启动strongswan服务
service strongswan start #或者 ipsec start
查看strongswan服务状态