Ubuntu16.04安装StrongSwan VPN教程
by kowen
本文讲述了如何在Ubuntu16.04服务器上部署基于IKEv2的VPN服务,主要内容翻译自How to Set Up an IKEv2 VPN Server with StrongSwan on Ubuntu 16.04。
斜体部分是我的画蛇添足,在windows、ios亲测完全正常可用。
介绍
介绍看不懂的可以不看
VPN连接英文全名叫virtual private network,即虚拟专用网络,有了它你可以在一些不安全的网络(比如咖啡馆、机场的公共wifi接入网络)中实现可靠的加密信息传输。 当然,国内最多的用途当然就是科学上网了
IKEv2,英文全称Internet Key Exchange v2,是一个让客户端服务器建立直接IPSec通道连接的协议。在基于IKEv2的 VPN中,IPSec为网络传输提供加密功能。IKEv2在OS X10.11+ IOS 9.1+ 和windows10中默认支持,不用安装其他软件 所以苹果手机也可以很方便的使用哦
本文将教你如何在ubuntu16.04服务器上使用StrongSwan建立一个IKEv2 VPN服务器,并在windows、IOS和mac客户端上连接。
前提
你需要做以下准备:
- 一台Ubuntu16.04服务器,按照the Ubuntu 16.04 initial server setup guide配置好,包括一个执行sudo命令的非root用户和防火墙。特殊需求的用户服务器可以用糖果主机之类的vps, 不用个人配置,直接给你克隆好,包月40左右,英文不好的可以用糖果,网站是中文,服务人员也用中文,去度娘吧不多说了。另外,我直接用root用户配的
另外,你需要先了解一下IPTables,你可以学习一下 How the Iptables Firewall Works 中文的教程:iptables中文简明教程
一、安装strongSwan
首先需要安装StrongSwan,它是一个开源的IPSec后台服务,在此我们把它配制成一个VPN服务器。不建议使用基于证书的登录验证方式,最好使用基于密码的客户端验证登录,使用StrongSwan EAP插件可以帮我们实现密码登录功能。还需要设置一些防火墙规则,所以我们还要安装一个保存防火墙规则的工具防止重启后规则丢失
在服务器上执行以下命令安装上述程序
注意:安装过程中会提示是否要保存当前 IPv4和IPv6规则。因为我们想保留目前的防火墙规则不变,都选择是即可。
安装完成后,下一步是建立证书
二、建立认证中心
IKEv2服务器需要证书来向客户端验证自己的身份,StrongSwan给我们提供了生成认证中心和服务器证书的工具来帮助我们创建所需的证书。首先我们来创建一个文件夹来保存下面生成的各种文件。
|
|
文件夹创建好后,需要创建根密钥,这是一个4096位的RSA密钥,它的用途是给认证中心进行签名。这个密钥非常重要,所以我们只给root用户读权限,其他用户不能访问。生成密钥的命令如下:
接下来,建立根认证中心,使用刚才创建的密钥对认证中心进行签名。注意下面一大垛是一条命令,一块复制到Shell下执行
你可以修改DN参数后的国家C、组织O和CN名称(Common Name),CN名称在这只是一个名称,你可以胡编乱造。这个时候你可以在vpn-certs下看到生成了两个文件server-root-key.pem和server-root-ca.pem
等会我们将复制根证书server-root-ca.pem到我们的客户端,这样客户端连接时就可以验证服务器了。
到现在根认证中心已经建好并运行,下面创建VPN服务器使用的证书。
三、为VPN服务器生成证书
为VPN服务器生成证书,这个证书用于客户端验证服务器的真实性。
首先为VPN服务器创建一个密钥
然后生成VPN服务器证书,用前面生成的认证中心的密钥对这个证书进行签名。先修改一下命令,把SERVER_NAME_OR_IP换成你服务器的DNS名称或者IP地址。注意要替换两个SERVER_NAME_OR_IP,下面依然是一条命令
|
|
把证书拷贝到配置目录以便StrongSwan读取
|
|
最后更改权限只允许root用户有读权限
这样,我们已经建立了客户端和服务器安全通讯的证书对,还用根密钥对证书进行了签名以使客户端能验证VPN服务器的真实性。所有的证书文件都已准备好了,下面开始配置软件。
四、配置StrongSwan
前面步骤生成了所需要的证书,本节对StrongSwan进行配置。
StrongSwan有一个默认配置文件,在进行配置前,需要进行备份,以便搞错后进行恢复。
默认配置文件相当长,为了防止配置出错,我们清除默认配置,从零开始写配置文件。首先,清除配置文件
下面的步骤都是编辑配置文件,比较繁琐,本节最后有完整配置文件,建议本地编写好上传覆盖,完整配置文件中需要根据第5步修改@server_name_or_ip参数
然后编辑配置文件
首先开启StrongSwan的后台日志方便调试,允许多重连接。在文件中插入以下下几行:
123config setupcharondebug="ike 1, knl 1, cfg 0"uniqueids=no建立VPN配置,让StrongSwan建立IKEv2通道并且在它启动时自动加载该配置,再加入以下几行:
1234567conn ikev2-vpnauto=addcompress=notype=tunnelkeyexchange=ikev2fragmentation=yesforceencaps=yes加入StrongSwan VPN需要支持的通讯加密算法,再加入以下几行:
12ike=aes256-sha1-modp1024,3des-sha1-modp1024!esp=aes256-sha1,3des-sha1!启用断开连接探测清理掉线的连接,再加入以下几行:
123dpdaction=cleardpddelay=300srekey=no配置服务器端(left)IPSec参数,添加以下几行(注意: 当配置leftid时,只有通过域名连接VPN服务器时才写@符号,比如@vpn.example.com,IP地址不用@符号,比如111.111.111.111):
12345left=%anyleftid=@server_name_or_ipleftcert=/etc/ipsec.d/certs/vpn-server-cert.pemleftsendcert=alwaysleftsubnet=0.0.0.0/0配置客户端(right)IPSec参数,包括客户端连接后分配的IP地址段和DNS配置xxx
123456right=%anyrightid=%anyrightauth=eap-mschapv2rightsourceip=10.10.10.0/24rightdns=8.8.8.8,8.8.4.4rightsendcert=never最后,配置StrongSwan向客户端要求用户证书:
1eap_identity=%identity
完整的配置文件如下:
|
|
那么VPN参数配置完毕,下面介绍如何建立一个远程连接用户。
五、配置VPN登录验证
到这里服务器已经可以接受客户端的连接了,但是我们还没有进行证书配置,证书配置文件是ipsec.secrets,这个文件的作用:
- 告诉StrongSwan服务器证书私钥的位置,这样服务器才能加密解密传输的数据
- 建立VPN用户
编辑配置文件:
告诉StrongSwan私钥的位置:
1server_name_or_ip : RSA "/etc/ipsec.d/private/vpn-server-key.pem"建立用户登陆凭证(用户名密码),用户名和密码随意取,但是必须注明允许StrongSwan接受用户来自任意地址的连接
1your_username %any% : EAP "your_password"关闭保存文件,重新启动ipsec服务启用新的配置。
1sudo ipsec reload
VPN服务器已经配置完毕,下面是最重要的一步:配置防火墙
六、配置防火墙和IP转发
配置完VPN服务器后,需要对防火墙进行配置,以使防火墙允许和转发VPN流量。使用IPTables工具来实现。
如果已经开启了UFW,先禁用,因为它会跟我们的配置冲突
1sudo ufw disable删除所有UFW留下的防火墙规则
1234sudo iptables -P INPUT ACCEPTsudo iptables -P FORWARD ACCEPTsudo iptables -Fsudo iptables -Z为了防止SSH连接断开,先允许目前的连接,然后打开22或者自己设定的SSH端口
12sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTsudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT允许本地回环地址的连接
1sudo iptables -A INPUT -i lo -j ACCEPT允许IPSec连接
12sudo iptables -A INPUT -p udp --dport 500 -j ACCEPTsudo iptables -A INPUT -p udp --dport 4500 -j ACCEPT设置IPTables转发ESp(Encapsulating Security Payload)流量。转发ESP流量,ESP可以在非可信网络中给我们VPN包增加额外保护。
12sudo iptables -A FORWARD --match policy --pol ipsec --dir in --proto esp -s 10.10.10.10/24 -j ACCEPTsudo iptables -A FORWARD --match policy --pol ipsec --dir out --proto esp -d 10.10.10.10/24 -j ACCEPTVPN服务器在客户端和网络之间扮演了网关的角色。因为VPN服务器只有一个公网IP,我们需要启用伪装让服务器代替客户端从互联网请求数据,这样就可以使数据在VPN客户端和服务器之间传输。
12sudo iptables -t nat -A POSTROUTING -s 10.10.10.10/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPTsudo iptables -t nat -A POSTROUTING -s 10.10.10.10/24 -o eth0 -j MASQUERADE为了防止某些客户端的IP包拆分,设置IPTables包大小参数以减小包的大小,预防某些VPN客户端出问题。
1sudo iptables -t mangle -A FORWARD --match policy --pol ipsec --dir in -s 10.10.10.10/24 -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360安全起见,禁止其他所有连接。服务器上有其他服务的请用iptables工具打开相应端口
12sudo iptables -A INPUT -j DROPsudo iptables -A FORWARD -j DROP保存防火墙配置,防止重启丢失
12sudo netfilter-persistent savesudo netfilter-persistent reload最后启用包转发功能,包转发用来将数据在服务器上从一个IP发送到另一个IP,实际上我们服务器就是一个转发器。编辑配置文件 /etc/sysctl.conf
1sudo nano /etc/sysctl.conf需要配置的东西包括:
- 启用IPv4转发
- 禁用Path MTU discovery防止包拆分问题
- 禁止接受和发送ICMP重定向,防止中间人攻击
配置修改部分如下(4个参数,前三个取消注释即可,最后一个自己添加):
1234567891011. . .# Uncomment the next line to enable packet forwarding for IPv4net.ipv4.ip_forward=1. . .# Do not accept ICMP redirects (prevent MITM attacks)net.ipv4.conf.all.accept_redirects = 0# Do not send ICMP redirects (we are not a router)net.ipv4.conf.all.send_redirects = 0. . .net.ipv4.ip_no_pmtu_disc = 1重启服务器
1sudo reboot
服务器配置已经完成,如果客户端连接正常就大功告成了,下面是连接方法
七、测试连接
VPN服务器已经配置完毕,下面来测试一下是否能正常连接。首先要下载根证书到本地,安装到你的客户机上。有两种方式,命令行打印输出和远程下载。
- 方式一、命令行输出1cat ~/vpn-certs/server-root-ca.pem
你会看到
复制所有内容包括—–BEGIN CERTIFICATE—–和—–END CERTIFICATE—–到文字编辑器比如记事本,
然后保存,名称自己起,但后缀名必须是pem,比如vpn_root_certificate.pem。
- 方式二、使用SFTP工具下载
不详述。
一旦下载了根证书文件,就可以建立VPN连接了。鸡动吧
windows连接
- 首先导入根证书
- 在运行中,输入mmc.exe,打开控制台窗口
- 从文件菜单中选择添加删除管理单元,弹出窗口中选择证书,添加
- 如果想要本地计算机所有用户都可以使用VPN连接,选择计算机账户,下一步
- 选择本地计算机,完成
- 依次展开证书->受信任的根证书办法机构(Trusted Root Certification Authorities)-证书
- 点击操作->所有任务->导入
- 选择证书文件vpn_root_certificate.pem,下一步
- 确认证书保存到收信人的根证书办法机构
- 完成导入成功。
- 然后配置VPN连接
- 打开控制面板,进入网络和共享中心
- 点击设置新的连接或网络,选择连接到工作区
- 选择使用我的Internet连接(VPN)
- 地址中输入服务器名称或者IP,目标名称可以随意起
- 输入用户名密码(ipsec.secret中配置的),域不填写,点击连接
创建后,你可以在网络列表中看到新建的VPN连接,选择然后点击连接,输入用户名密码即可连接。
IOS连接
在苹果手机上连接VPN服务,请遵循一下步骤:
- 把根证书文件作为附件发送到你的邮箱
- 用IOS登录邮箱,点击附件,点击安装,会要求输入你的ios密码,点击完成
- 打开“设置->通用->VPN”,点击添加VPN配置
- 类型选择 IKEv2
- 描述输入你给vpn连接起的名字
- 服务器和远程ID输入ip地址或域名,本地ID不用填
- 输入用户名、密码(ipsec.secret),点击完成
- 选择创建的vpn名称,点击连接
macOS连接
贫农没有mac,以下纯翻译,未验证,系统提示信息可能与实际不一致
导入证书
- 双击证书文件,Keychain Access弹出窗口提示“Keychain Access试图更改系统keychain,输入密码允许”
- 输入密码,点击允许更改Keychain
- 双击导入的vpn证书,会弹出窗口指定信任级别,设置IP Security为Always Trust,再次输入密码,系统会自动保存配置。
创建VPN连接
- 进入系统设置(System Preference),选择网络
- 点击网络列表左下角加号按钮
- 弹出窗口中,设置接口为VPN, 配置VPN类型为IKEv2,给连接起一个名字
- 在服务器和远程ID中输入服务器域名或者IP,本地ID设置为空
- 点击认证设置,选择用户名,输入用户名密码,确定保存。
常见问题
如果不能导入证书,请确认证书的后缀名是pem,而不是pem.txt或其他。
如果不能连接到VPN服务器,检查连接的服务器域名或地址是否正确。服务器的域名或IP地址必须和创建证书文件时配置的CN名称一致,否则vpn不能工作。比如你用CN参数为vpn.example.com建立证书,那你必须使用vpn.example.com来创建连接。执行生成证书命令和建立VPN连接时,要反复检查。
最后,检查VPN配置确保使用域名做leftid的时候前面一定要加@,使用IP时一定不加@。
或者
总结
按照本教程你已经建立好了一个支持IKEv2协议的VPN服务器,现在你可以在任何地方使用你的加密连接(科学上网)了。
添加或删除用户,只需要遵照步骤5设置即可,每个用户单独占一行。
StrongSwan输出日志到syslog,也许你想配置一个日志分析器,可以查看这篇文章 How To Install and Use Logwatch Log Analyzer and Reporter on a VPS 。
翻译结语
防火墙中间有一步转发忘了翻译,结果能连接不能上网,折腾了两天才发现,好累,有时间写个简明教程。
linode测试的ubuntu16.04,iptables配置完后不能正常保存,重启后配置丢失,sugarhost ssd的最低配置,网络很溜,油管秒开,高清视频非常流畅,就是偶尔有不稳定的时候。