centos6.5 x86_64
1,安装必须的库
yum update
yum install pam-devel openssl-devel make gcc
2,下载strongswan
wget http://download.strongswan.org/strongswan.tar.gz
tar xzf strongswan.tar.gz
cd strongswan-*
3,编译安装
./configure --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
4,生成CA证书私钥
ipsec pki --gen --outform pem > ca.pem
使用私钥自签一个CA证书
ipsec pki --self --in ca.pem --dn "C=col, O=ssvpn, CN=VPNCA" --ca --outform pem >ca.cert.pem
生成服务器证书所需的私钥:
ipsec pki --gen --outform pem > server.pem
用自签CA证书签发服务器证书
先确认你的服务器的IP地址或域名,以后客户端连接时只能使用证书中的地址连接(多服务器使用相同根证书CA的,请先做好服务器的域名解析),
然后将下面命令中的123.123.123.123替换为自己服务器的IP地址或域名,一共需要替换两处:
ipsec pki --pub --in server.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.pem --dn "C=col, O=ssvpn, CN=123.123.123.123" --san="123.123.123.123" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem
注意:以上命令中的”C=”和”O=”的值要与第2步CA中的C,O的值保持一致.
5,生成客户端证书所需的私钥:
ipsec pki --gen --outform pem > client.pem
用自签CA证书签发客户端证书(C,O的值要与上面第2步CA的值一致,CN的值随意):
ipsec pki --pub --in client.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.pem --dn "C=col, O=ssvpn, CN=VPN Client" --outform pem > client.cert.pem
将生成客户端证书转换pkcs12证书(以备移动端导入)
openssl pkcs12 -export -inkey client.pem -in client.cert.pem -name "client" -certfile ca.cert.pem -caname "VPNCA" -out client.cert.p12
注意以上命令中的”-caname”后面的引号里的值必须要与第2步CA中的”CN=”的值保持一致.
输入客户端登录用户密码hello
6,安装证书:
cp -r ca.cert.pem /usr/local/etc/ipsec.d/cacerts/
cp -r server.cert.pem /usr/local/etc/ipsec.d/certs/
cp -r server.pem /usr/local/etc/ipsec.d/private/
cp -r client.cert.pem /usr/local/etc/ipsec.d/certs/
cp -r client.pem /usr/local/etc/ipsec.d/private/
7,配置strongswan
vi /usr/local/etc/ipsec.conf 将内容完全替换为一下内容
config setup
uniqueids=never
conn iOS_cert
keyexchange=ikev1
fragmentation=yes 开启对 iOS 拆包的重组支持。
left=%defaultroute
leftauth=pubkey 表示用证书
leftsubnet=0.0.0.0/0
leftcert=server.cert.pem
right=%any
rightauth=pubkey
rightauth2=xauth
rightsourceip=10.11.2.0/24
rightcert=client.cert.pem
auto=add
conn android_xauth_psk
keyexchange=ikev1
left=%defaultroute
leftauth=psk 表示用密码
leftsubnet=0.0.0.0/0
right=%any
rightauth=psk
rightauth2=xauth
rightsourceip=10.11.2.0/24
auto=add
conn networkmanager-strongswan
keyexchange=ikev2
left=%defaultroute %defaultroute 表示自己从 ifconfig 里取 IP
leftauth=pubkey
leftsubnet=0.0.0.0/0
leftcert=server.cert.pem 指定证书名字
right=%any
rightauth=pubkey
rightsourceip=10.11.2.0/24 为客户端分配的虚拟 IP 段
rightcert=client.cert.pem 指定证书名字
auto=add
-
auto 定义 strongswan 启动时该连接的行为。start 是启动; route 是添加路由表,有数据通过就启动; add 是添加连接类型但不启动; ignore 是当它不存在。默认是 ignore。看起来似乎是 route 比较好,但问题是我们服务器端不能预分配虚拟 IP,所以服务器端一般用的都是 add。而客户端文本配置可以选择 start。
conn windows7
keyexchange=ikev2
ike=aes256-sha1-modp1024! 指定的第一阶段加密方法
rekey=no 服务器对 Windows 发出 rekey 请求会断开连接
left=%defaultroute
leftauth=pubkey
leftsubnet=0.0.0.0/0
leftcert=server.cert.pem
right=%any 魔术字 %any,表示什么都行。
rightauth=eap-mschapv2
rightsourceip=10.11.2.0/24
rightsendcert=never 服务器不要向客户端请求证书
eap_identity=%any eap 表示用扩展验证协议, eap_identity使用 Windows 的 eap 身份认证
auto=add
vi /usr/local/etc/strongswan.conf
charon {
load_modular = yes
duplicheck.enable = no
compress = yes
plugins {
include strongswan.d/charon/*.conf
}
dns1 = 8.8.8.8
dns2 = 8.8.4.4
nbns1 = 8.8.8.8
nbns2 = 8.8.4.4
}
include strongswan.d/*.conf
vi /usr/local/etc/ipsec.secrets
: RSA server.pem
: PSK "xskywallker"
: XAUTH "uiop890"
law %any : EAP "hello"
格式:主机 对等点 : 方法 <本机证书/协议密码> <本机证书密码>
以 :为分界,分别从左到右填充,除了各类密码缺失以 null 补位,其它都用 %any 补位(密码怎么可能是 %any)。
将上面的xskywallker单词更改为你需要的PSK认证方式的密钥;
将上面的uiop890单词更改为你需要的XAUTH认证方式的密码,该认证方式的用户名是随意的;
将上面的law改为自己想要的登录名,hello改为自己想要的密码,可以添加多行,得到多个用户,这即是使用IKEv2的用户名+密码认证方式的登录凭据.
启动服务
ipsec start
启动调试,打印整个连接建立过程,便于排错
ipsec start --nofork --debug-all
关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
配置转发
echo 1 > /proc/sys/net/ipv4/ip_forward
sed -i 's/net.ipv4.ip_forward=0/net.ipv4.ip_forward=1/g' /etc/sysctl.conf
sysctl -p
添加防火墙规则
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -p tcp --dport 22 -i eth0 -j ACCEPT
iptables -A INPUT -i lo -p all -j ACCEPT
iptables -A INPUT -p udp --dport 53 -i eth0 -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp --sport 443 -i eth0 -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.11.0.0/24 -j ACCEPT
iptables -A FORWARD -s 10.11.1.0/24 -j ACCEPT
iptables -A FORWARD -s 10.11.2.0/24 -j ACCEPT
iptables -A INPUT -i eth0 -p esp -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 500 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 500 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 1701 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 1723 -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s 10.11.0.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.11.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.11.2.0/24 -o eth0 -j MASQUERADE
service iptables save
win7下测试
使用 Shrew Soft VPN Client测试ikev1
下载:https://www.shrew.net/download/vpn
安装后打开,选「Add」:
「General」选项卡下,把「Host Name or IP address」添好
「Authorization」选项卡下:
「Authorization Method」选「Mutual PSK + XAuth」
「Local Identity」的「Identification Type」选「IP Address」
「Credentials」下面「Pre Shared Key」里输入 PSK 密码
「Phrase 1」,「Exchange Type」选「Main」
「Phrase 2」,「PFS Exchange」选「auto」
保存。连接时用户名密码是你的 XAUTH 用户名密码。
使用自带客户端(Agile):
导入证书:
开始菜单搜索「cmd」,打开后输入 mmc(Microsoft 管理控制台)。
「文件」-「添加/删除管理单元」,添加「证书」单元
证书单元的弹出窗口中一定要选「计算机账户」,之后选「本地计算机」,确定。
在左边的「控制台根节点」下选择「证书」-「个人」,然后选右边的「更多操作」-「所有任务」-「导入」打开证书导入窗口。
选择刚才生成的 client.cert.p12 文件。下一步输入私钥密码。下一步「证书存储」选「个人」。
导入成功后,把导入的 CA 证书剪切到「受信任的根证书颁发机构」的证书文件夹里面。
打开剩下的那个私人证书,看一下有没有显示「您有一个与该证书对应的私钥」,以及「证书路径」下面是不是显示「该证书没有问题」。
然后关闭 mmc,提示「将控制台设置存入控制台1吗」,选「否」即可。
至此,证书导入完成。
注意 千万不要双击 .p12 证书导入!因为那样会导入到当前用户而不是本机计算机中,ipsec 守护精灵是访问不了它的。
建立连接:
「控制面板」-「网络和共享中心」-「设置新的连接或网络」-「连接到工作区」-「使用我的 Internet 连接」
Internet 地址写服务器地址,注意事项同 openSUSE 的,都是 IP 或都是 URL。
描述随便写。
用户名密码写之前配置的 EAP 的那个。
确定
点击右下角网络图标,在新建的 VPN 连接上右键属性然后切换到「安全」选项卡。
VPN 类型选 IKEv2
数据加密是「需要加密」
身份认证这里需要说一下,如果想要使用 EAP-MSCHAPV2 的话就选择「使用可扩展的身份认证协议」-「Microsoft 安全密码」,想要使用私人证书认证的话就选择「使用计算机证书」。
安卓端
官网给有apk,下载安装,配置,连接试试
本文参考
http://quericy.me/blog/512
https://zh.opensuse.org/SDB:Setup_Ipsec_VPN_with_Strongswan#.E7.94.9F.E6.88.90.E8.AF.81.E4.B9.A6.EF.BC.88.E5.8F.AF.E9.80.89.EF.BC.89