互联网有一座围墙,墙内的人想出去,墙外的人……真会玩
前言
在中国当个码农真难。想搜个问题,百度就别指望了,google的话,你还需要一个梯子。
IPSec/ikev2
使用的是一键安装脚本
最新更新内容请见Github上的项目说明:https://github.com/quericy/one-key-ikev2-vpn
特性
- 服务端要求:Ubuntu或者CentOS-6/7或者Debian
- 客户端:
- iOS/OSX=>ikev1,ikev2
- Andriod=>ikev1
- WindowsPhone=>ikev2
- 其他Windows平台=>ikev2
- 可使用自己的私钥和根证书,也可自动生成
- 证书可绑定域名或ip
- 要是图方便可一路回车
- 生成单独的sysctl配置文件/etc/sysctl.d/10-ipsec.conf单独加载,用于开启ipv4转发(如以后卸载或需要关闭net.ipv4.ip_forward,请记得删除此文件);
服务端安装说明
- 下载脚本:
1 | wget --no-check-certificate https://raw.githubusercontent.com/quericy/one-key-ikev2-vpn/master/one-key-ikev2.sh |
- 注:如需使用其他分支的脚本,请将上述url中的master修改为分支名称,各分支区别详见本页的分支说明节点
- 运行脚本:
1 | chmod +x one-key-ikev2.sh |
等待自动配置部分内容后,选择vps类型(OpenVZ还是Xen、KVM),选错将无法成功连接,请务必核实服务器的类型。输入服务器ip或者绑定的域名(连接vpn时服务器地址将需要与此保持一致,如果是导入泛域名证书这里需要写*.域名的形式);
选择使用使用证书颁发机构签发的SSL证书还是生成自签名证书:
- 如果选择no,使用自签名证书(客户端如果使用IkeV2方式连接,将需要导入生成的证书并信任)则需要填写证书的相关信息(C,O,CN),为空将使用默认值(default value),确认无误后按任意键继续,后续安装过程中会出现输入两次pkcs12证书的密码的提示(可以设置为空)
- 如果选择yes,使用SSL证书(如果证书是被信任的,后续步骤客户端将无需导入证书)请在继续下一步之前,将以下文件按提示命名并放在脚本相同的目录下:
- ca.cert.pem 证书颁发机构的CA,比如Let‘s Encrypt的证书,或者其他链证书;
- server.cert.pem 签发的域名证书;
- server.pem 签发域名证书时用的私钥;
是否使用SNAT规则(可选).默认为不使用.使用前请确保服务器具有不变的静态公网ip,可提升防火墙对数据包的处理速度.如果服务器网络设置了NAT(如AWS的弹性ip机制),则填写网卡连接接口的ip地址
防火墙配置.默认配置iptables(如果使用的是firewall(如CentOS7)请选择yes自动配置firewall,将无视SNAT并跳过后续的补充网卡接口步骤).补充网卡接口信息,为空则使用默认值(Xen、KVM默认使用eth0,OpenVZ默认使用venet0).如果服务器使用其他公网接口需要在此指定接口名称,填写错误VPN连接后将无法访问外网)
看到install Complete字样即表示安装完成。默认用户名密码将以黄字显示,可根据提示自行修改配置文件中的用户名密码,多用户则在配置文件中按格式一行一个(多用户时用户名不能使用%any),保存并重启服务生效。
将提示信息中的证书文件ca.cert.pem拷贝到客户端,修改后缀名为.cer后导入。ios设备使用Ikev1无需导入证书,而是需要在连接时输入共享密钥,共享密钥即是提示信息中的黄字PSK
客户端配置说明
连接的服务器地址和证书保持一致,即取决于签发证书ca.cert.pem时使用的是ip还是域名;
Android/iOS/OSX 可使用ikeV1,认证方式为用户名+密码+预共享密钥(PSK);
iOS/OSX/Windows7+/WindowsPhone8.1+/Linux 均可使用IkeV2,认证方式为用户名+密码。使用SSL证书则无需导入证书;使用自签名证书则需要先导入证书才能连接,可将ca.cert.pem更改后缀名作为邮件附件发送给客户端,手机端也可通过浏览器导入,其中:
iOS/OSX 的远程ID和服务器地址保持一致,用户鉴定选择”用户名”.如果通过浏览器导入,将证书放在可访问的远程外链上,并在系统浏览器(Safari)中访问外链地址;
Windows PC 系统导入证书需要导入到“本地计算机”的”受信任的根证书颁发机构”,以”当前用户”的导入方式是无效的.推荐运行mmc添加本地计算机的证书管理单元来操作;
WindowsPhone8.1 登录时的用户名需要带上域信息,即wp”关于”页面的设备名称\用户名,也可以使用%any %any : EAP “密码”进行任意用户名登录,但指定了就不能添加其他用户名了.
WindowsPhone10 的vpn还存在bug(截至10586.164),ikeV2方式可连接但系统流量不会走vpn,只能等微软解决. (截至14393.5,此bug已经得到修复,现在WP10已经可以正常使用IkeV2.)
Windows10 也存在此bug,部分Win10系统连接后ip不变,没有自动添加路由表,使用以下方法可解决:
手动关闭vpn的split tunneling功能(在远程网络上使用默认网关);
也可使用powershell修改,进入CMD窗口,运行如下命令:
1
2
3
4
5powershell #进入ps控制台
get-vpnconnection #检查vpn连接的设置(包括vpn连接的名称)
set-vpnconnection "vpn连接名称" -splittunneling $false #关闭split tunneling
get-vpnconnection #检查修改结果
exit #退出ps控制台
Windows 10
导入证书:
- 将 CA 根证书 ca.cert.pem 重命名为ca.cert.crt
- 双击 ca.cert.crt 开始安装证书
- 点击安装证书
- “存储位置” 选择 “本地计算机”, 下一步
- 选择 “将所有的证书都放入下列存储区”, 点浏览, 选择 “受信任的根证书颁发机构”, 确定, 下一步, 完成.
建立连接:
- “控制面板”-“网络和共享中心”-“设置新的连接或网络”-“连接到工作区”-“使用我的 Internet 连接”
- Internet 地址写服务器 IP 或 URL。
- 描述随便写。
- 用户名密码写之前配置的 EAP 的那个。
- 确定
- 转到 控制面板网络和 Internet网络连接
- 在新建的 VPN 连接上右键属性然后切换到“安全”选项卡
- VPN 类型选 IKEv2
- 数据加密选“需要加密”
- 身份认证这里需要说一下,如果想要使用 EAP 认证的话就选择“Microsoft:安全密码(EAP-MSCHAP v2)”; 想要使用私人证书认证的话就选择“使用计算机证书”。
- 再切换到 “网络” 选项卡, 双击 “Internet 协议版本 4” 以打开属性窗口, 这里说一下, 如果你使用的是老版本的 win10, 可能会打不开属性窗口, 这是已知的 bug, 升级最新版本即可解决.
- 点击 “高级” 按钮, 勾选 “在远程网络上使用默认网关”, 确定退出.
VPN 配置完成
Windows 7
- 开始菜单搜索「cmd」,打开后输入mmc(Microsoft 管理控制台)。
- 「文件」-「添加/删除管理单元」,添加「证书」单元
- 证书单元的弹出窗口中一定要选「计算机账户」,之后选「本地计算机」,确定。
- 在左边的「控制台根节点」下选择「证书」-「受信任的根证书颁发机构」-「证书」,右键 -「所有任务」-「导入」打开证书导入窗口。
- 选择 CA 证书 ca.cert.crt导入即可
注意 千万不要双击 .p12证书导入!因为那样会导入到当前用户而不是本机计算机中,ipsec 守护精灵是访问不了它的。
卸载方式
进入脚本所在目录的strongswan文件夹执行:
1
make uninstall
删除脚本所在目录的相关文件(one-key-ikev2.sh,strongswan.tar.gz,strongswan文件夹,my_key文件夹).
卸载后记得检查iptables配置.
分支说明
- master分支:经过测试的相对稳定的版本;
- dev-debian分支:Debian6/7测试分支,该脚本由bestoa修改提供;
- dev分支:开发分支,使用最新版本的strongswan,未进过充分测试,用于尝试和添加一些新的功能,未来可能添加对L2TP的兼容支持,以及对ipv6的支持;
部分问题解决方案
ipsec启动问题:服务器重启后默认ipsec不会自启动,请命令手动开启,或添加
/usr/local/sbin/ipsec start
到自启动脚本文件中(如rc.local等)ipsec常用指令:
1
2
3
4
5
6ipsec start #启动服务
ipsec stop #关闭服务
ipsec restart #重启服务
ipsec reload #重新读取
ipsec status #查看状态
ipsec --help #查看帮助可连接但是无法访问网络:
- 检查iptables是否正常启用,检查iptables规则是否与其他地方冲突,或根据服务器防火墙的实际情况手动修改配置。
- 检查sysctl是否开启ip_forward:
- 打开sysctl文件:
vim /etc/sysctl.conf
- 修改
net.ipv4.ip_forward=1
后保存并关闭文件 - 使用以下指令刷新sysctl:
sysctl -p
- 如执行后正常回显则表示生效。如显示错误信息,请重新打开/etc/syctl并根据错误信息对应部分用#号注释,保存后再刷新sysctl直至不会报错为止。
- 打开sysctl文件:
如果之前使用的自签名证书,后改用SSL证书,部分客户端可能需要卸载之前安装的自签名证书,否则可能会报Ike凭证不可接受的错误:
- iOS:设置-通用,删除证书对应的描述文件即可;
- Windows:Win+R,运行mmc打开Microsoft管理控制台,文件->添加管理单元,添加证书管理单元(必须选计算机账户),展开受信任的根证书颁发机构,找到对应的自签名证书,右键删除即可;
- Windows Phone:暂时没有找到可以卸载证书的方法(除非越狱),目前只能重置来解决此问题
IPSec/L2tp
很久之前搭建的L2tp服务器,顺便记录下
ipsec用于验证和加密数据包,由openswan提供;l2tp即第二层隧道协议,由xl2tpd提供。
以下是在我的linode VPS上安装 L2TP / IPSec VPN 的记录(用了openswan+xl2tpd实现):
环境
VPS:linode
OS: ubuntu 12.04.5 LTS
安装openswan
下载openswan
1 | apt-get update |
修改/etc/ipsec.conf:
1 | version 2.0 |
修改/etc/ipsec.secrets
注意把%YOUR.SERVER.IP.ADDRESS%替换成你的服务器地址。另外国外论坛也有提到第二种写法可以避免一些不必要的问题。
1 | %YOUR.SERVER.IP.ADDRESS% %any: PSK “YourSharedSecret” |
1 | : PSK “YourSharedSecret” |
修改包转发设置
1 | for each in /proc/sys/net/ipv4/conf/* |
重启并检查ipsec配置
1 | sudo service ipsec restart |
输出没有FAILED项即可,WARNING可以不管。
除了Opportunistic Encryption Support外,其他应该均正常
我碰到的2个错误和解决方法:
a:
1 | Two or more interfaces found, checking IP forwarding [FAILED] |
原因为未执行
1 | echo 1 > /proc/sys/net/ipv4/ip_forward |
b:
1 | Pluto listening for IKE on udp 500 [FAILED] |
原因为lsof未安装,需apt-get install lsof
最后重启ipsec服务
可试着新建一个 ipsec+l2tp 的连接,填好服务器地址和 SharedKey,点连接拨号,查看服务器那边的 /var/log/auth.log
1 | clrngd |
如果出现了类似记录即正常
STATE_QUICK_R2: IPsec SA established transport mode
同时,将上面这段代码完整地复制一次,加入到 /etc/rc.local 中,使其在每次系统启动时都生效。
安装L2TP服务
下载xl2tpd
1 | apt-get install xl2tpd |
修改/etc/xl2tpd/xl2tpd.conf
1 | [global] |
ip range和local ip根据自己的需要定义
安装PPP服务,用来管理 VPN 用户
下载ppp
1 | apt-get install ppp |
修改/etc/ppp/options.xl2tpd
没有的话建一个,为防止DNS污染,用了谷歌的DNS,也可用其他的DNS
1 | require-mschap-v2 |
修改 /etc/ppp/chap-secrets
设置拨号的用户名和密码
1 | # user server password ip |
重启xl2tpd服务
1 | /etc/init.d/xl2tpd restart |
修改iptables防火墙,启用包转发
1 | iptables –table nat –append POSTROUTING –jump MASQUERADE |
PPTP
记录了更早之前搭建的VPN
1 | apt-get install pptpd |
三个文件内容分别为:
pptpd.conf:
1 | option /etc/ppp/pptpd-options |
optons:
1 | asyncmap 0 |
pptpd-options:
1 | name 你的ip |