| 
	VPN 协议有 pptp, l2tp, ipsec 等等. 安全性逐级提高, 这里选择安全性最高的 ipsec.为了支持多种设置使用VPN, 我们使用 ipsec + l2tp 的方式.
 google 到一款名为 strongSwan 的开源服务端. 官网为 https://www.strongswan.org.
 
	本文只介绍 IPSce 与 L2TP 方式的 VPN 配置, 如果需要 PPTP 方式, 请参考 <<CentOS VPS 建立 PPTP VPN 服务>>, 这三种方式可以共存, 互不干扰. 
	这里使用的 VPS 服务器配置: 
	
		CentOS 7 / 512M / 20G ssd , $5/月. 详情请看 这里
		禁用 firewallD, 启用 iptables.
		strongSwan 版本 5.2
		xl2tpd 版本 1.3.6 
	一. IPSec VPN
	安装 strongSwan
	strongSwan 的发行版已包含在 EPEL 源中, 如果没有添加 EPEL 源, 请看 <<CentOS 7 配置 LNMP + FTP 环境>> 添加 EPEL 源. 
	添加完 EPEL 源后输入如下命令 
	
	
		
			
				
					|  | 
							
								yum install strongswan 
								systemctl enable strongswan 
								systemctl start strongswan |  
	  
	生成证书
	证书应用于所有 pubkey 认证方式中 
	生成 CA 证书 
	1. 生成一个私钥: 
	
	
		
			
				
					|  | 
							
								strongswan pki --gen --outform pem > ca.key.pem |  
	2. 基于这个私钥自己签一个 CA 证书: 
	
	
		
			
				
					|  | 
							
								strongswan pki --self --in ca.key.pem --dn "C=CN, O=ITnmg, CN=strongSwan CA" --ca --lifetime 3650 --outform pem > ca.cert.pem |  
	这里 –self 表示自签证书,–in 是输入的私钥,–dn 是判别名,–ca 表示生成 CA,–lifetime 为有效期。这里需要解释下判别名: 
	
		C 表示国家名,同样还有 ST 州/省名,L 地区名,STREET(全大写) 街道名。
		O 表示组织名。
		CN 为通用名。 
	生成服务器证书 
	1. 同样先生成一个私钥 
	
	
		
			
				
					|  | 
							
								strongswan pki --gen --outform pem > server.key.pem |  
	2. 用我们刚才自签的 CA 证书给自己发一个服务器证书: 
	
	
		
			
				
					|  | 
							
								#从私钥生成公钥 
								strongswan pki --pub --in server.key.pem --outform pem > server.pub.pem 
								#用刚生成的公钥生成服务器证书 
								strongswan pki --issue --lifetime 1200 --cacert ca.cert.pem --cakey ca.key.pem --in server.pub.pem --dn "C=CN, O=ITnmg, CN=blog.itnmg.net" --san="blog.itnmg.net" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem |  
	–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。 
	生成客户端证书
	1. 依然是生成私钥: 
	
	
		
			
				
					|  | 
							
								strongswan pki --gen --outform pem > client.key.pem |  
	2. 然后用刚才自签的 CA 证书来签客户端证书: 
	
	
		
			
				
					|  | 
							
								#从私钥生成公钥 
								strongswan pki --pub --in client.key.pem --outform pem > client.pub.pem 
								#这里就不需要上面那一堆特殊参数了 
								strongswan pki --issue --lifetime 1200 --cacert ca.cert.pem --cakey ca.key.pem --in client.pub.pem --dn "C=CN, O=ITnmg, CN=blog.itnmg.net" --outform pem > client.cert.pem |  
	  
	生成 pkcs12 证书
	  
	
	
		
			
				
					|  | 
							
								openssl pkcs12 -export -inkey client.key.pem -in client.cert.pem -name "strongSwan Client Cert" -certfile ca.cert.pem -caname "strongSwan CA" -out client.cert.p12 |  
	此时会提示输入两次密码, 这个密码是在导入证书到其他系统时需要验证的. 没有这个密码即使别人拿到了证书也没法使用. 
	安装证书 
	
	
		
			
				
					|  | 
							
								cp -r ca.key.pem /etc/strongswan/ipsec.d/private/ 
								cp -r ca.cert.pem /etc/strongswan/ipsec.d/cacerts/ 
								cp -r server.cert.pem /etc/strongswan/ipsec.d/certs/ 
								cp -r server.key.pem /etc/strongswan/ipsec.d/private/ 
								cp -r client.cert.pem /etc/strongswan/ipsec.d/certs/ 
								cp -r client.key.pem /etc/strongswan/ipsec.d/private/ |  
	把 CA 证书(ca.cert.pem)、客户端证书(client.cert.pem)和 .p12 证书(client.cert.p12)用 FTP 复制出来给客户端用 
	配置 vpn 
	
	
		
			
				
					|  | 
							
								nano /etc/strongswan/ipsec.conf |  
	修改配置 
	
	
		
			
				
					| 
							
								1 
								2 
								3 
								4 
								5 
								6 
								7 
								8 
								9 
								10 
								11 
								12 
								13 
								14 
								15 
								16 
								17 
								18 
								19 
								20 
								21 
								22 
								23 
								24 
								25 
								26 
								27 
								28 
								29 
								30 
								31 
								32 
								33 
								34 
								35 
								36 
								37 
								38 
								39 
								40 
								41 
								42 
								43 
								44 
								45 
								46 
								47 
								48 
								49 
								50 
								51 
								52 
								53 
								54 
								55 
								56 | 
							
								config setup 
								    uniqueids=never              #允许多个客户端使用同一个证书 
								  
								#所有项目共用的配置项 
								conn %default 
								    keyexchange=ike              #ikev1 或 ikev2 都用这个 
								    left=%any                    #服务器端标识,%any表示任意 
								    leftsubnet=0.0.0.0/0         #服务器端虚拟ip, 0.0.0.0/0表示通配. 
								    right=%any                   #客户端标识,%any表示任意 
								  
								conn IKE-BASE 
								    leftca=ca.cert.pem           #服务器端 CA 证书 
								    leftcert=server.cert.pem     #服务器端证书 
								    rightsourceip=10.0.0.0/24    #分配给客户端的虚拟 ip 段 
								  
								#供 ios 使用, 使用客户端证书 
								conn IPSec-IKEv1 
								    also=IKE-BASE 
								    keyexchange=ikev1 
								    fragmentation=yes            #开启对 iOS 拆包的重组支持 
								    leftauth=pubkey 
								    rightauth=pubkey 
								    rightauth2=xauth 
								    rightcert=client.cert.pem 
								    auto=add 
								  
								#供 ios 使用, 使用 PSK 预设密钥 
								conn IPSec-IKEv1-PSK 
								    also=IKE-BASE 
								    keyexchange=ikev1 
								    fragmentation=yes 
								    leftauth=psk 
								    rightauth=psk 
								    rightauth2=xauth 
								    auto=add 
								  
								#供 android, linux, os x 使用 
								conn IPSec-IKEv2 
								    also=IKE-BASE 
								    keyexchange=ikev2 
								    leftauth=pubkey 
								    rightauth=pubkey 
								    rightcert=client.cert.pem 
								    auto=add 
								  
								#供 windows 7+ 使用, win7 以下版本需使用第三方 ipsec vpn 客户端连接 
								conn IPSec-IKEv2-EAP 
								    also=IKE-BASE 
								    keyexchange=ikev2 
								    #ike=aes256-sha1-modp1024!   #第一阶段加密方式 
								    rekey=no                     #服务器对 Windows 发出 rekey 请求会断开连接 
								    leftauth=pubkey 
								    rightauth=eap-mschapv2 
								    rightsendcert=never          #服务器不要向客户端请求证书 
								    eap_identity=%any 
								    auto=add |  
	修改 dns 配置 
	
	
		
			
				
					|  | 
							
								nano /etc/strongswan/strongswan.d/charon.conf |  
	修改如下 
	
	
		
			
				
					| 
							
								1 
								2 
								3 
								4 
								5 
								6 
								7 
								8 
								9 
								10 
								11 
								12 
								13 
								14 
								15 
								16 
								17 
								18 
								19 
								20 
								21 
								22 
								23 | 
							
								charon { 
								    duplicheck.enable = no #同时连接多个设备,把冗余检查关闭. 
								  
								    # 公用 dns 
								    dns1 = 8.8.8.8 
								    dns2 = 8.8.4.4 
								  
								    #以下是日志输出, 生产环境请关闭. 
								    filelog { 
								        /var/log/charon.log { 
								            # add a timestamp prefix 
								            time_format = %b %e %T 
								            # prepend connection name, simplifies grepping 
								            ike_name = yes 
								            # overwrite existing files 
								            append = no 
								            # increase default loglevel for all daemon subsystems 
								            default = 1 
								            # flush each line to disk 
								            flush_line = yes 
								        } 
								    } 
								} |  
	配置验证方式的用户名与密码 
	
	
		
			
				
					|  | 
							
								nano /etc/strongswan/ipsec.secrets |  
	格式为 : 
	
	
		
			
				
					|  | 
							
								域 用户名 : 方法 <本机证书/协议密码> <本机证书密码> |  
	以 : 为分界,分别从左到右填充,除了各类密码缺失以 null 补位,其它都用 %any 补位(密码怎么可能是 %any). 
	例如: 
	实际上等于 
	
	
		
			
				
					|  | 
							
								%any %any : PSK "PSK password" |  
	下面添加用户 
	
	
		
			
				
					|  | 
							
								: RSA server.key.pem #使用证书验证时的服务器端私钥 
								: PSK "预设加密密钥" #使用预设密钥时, 8-63位ASCII字符 
								用户名 : EAP "密码" #这里是使用EAP验证时的用户名和密码 
								用户名 : XAUTH "密码" #这里是使用XAUTH验证时的用户名和密码 |  
	开启内核转发 
	写入以下配置 
	
	
		
			
				
					|  | 
							
								# VPN 
								net.ipv4.ip_forward = 1 
								net.ipv6.conf.all.forwarding=1 |  
	保存退出, 执行下面命令. 
	配置防火墙 
	iptables 配置方法 
	将下面几条规则加入 iptables 规则中, 适当使用 -I 参数替换 -A 参数, 确保所有的项目位置都在拒绝项前面. 
	
	
		
			
				
					|  | 
							
								iptables -A INPUT -p udp --dport 500 -j ACCEPT #允许 ISAMKP 数据包 
								iptables -A INPUT -p udp --dport 4500 -j ACCEPT #允许 IPSec NAT Traversal 数据包 
								iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE #nat转换 
								iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT #允许转发 
								iptables -A FORWARD -d 10.0.0.0/24 -j ACCEPT 
								service iptables save 
								systemctl restart iptables |  
	如果嫌上面的操作麻烦, 可以直接编辑 iptables 规则文件. 
	
	
		
			
				
					|  | 
							
								nano /etc/sysconfig/iptables |  
	将下面的规则部分贴进去, 不要整个复制粘贴,  根据原有规则适当调整每条规则的位置, 确保规则在拒绝项前, 使之能生效. 
	
	
		
			
				
					| 
							
								1 
								2 
								3 
								4 
								5 
								6 
								7 
								8 
								9 
								10 
								11 
								12 
								13 
								14 
								15 
								16 
								17 
								18 
								19 
								20 
								21 
								22 
								23 
								24 
								25 
								26 
								27 
								28 
								29 | 
							
								*nat 
								:PREROUTING ACCEPT [0:0] 
								:INPUT ACCEPT [0:0] 
								:OUTPUT ACCEPT [0:0] 
								:POSTROUTING ACCEPT [0:0] 
								-A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE 
								COMMIT 
								*filter 
								:INPUT DROP [0:0] 
								:FORWARD DROP [0:0] 
								:OUTPUT ACCEPT [0:0] 
								-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 -p tcp -m tcp --dport 443 -j ACCEPT 
								-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT 
								-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT 
								-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT 
								-A INPUT -p tcp -m tcp --dport 30000:35000 -j ACCEPT 
								-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT 
								-A INPUT -p udp -m udp --dport 500 -j ACCEPT 
								-A INPUT -p udp -m udp --dport 4500 -j ACCEPT 
								-A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport 1701 -j ACCEPT 
								-A INPUT -j REJECT --reject-with icmp-host-prohibited 
								-A FORWARD -s 10.0.0.0/24 -j ACCEPT 
								-A FORWARD -d 10.0.0.0/24 -j ACCEPT 
								-A FORWARD -j REJECT --reject-with icmp-host-prohibited 
								COMMIT |  
	保存退出, 重启 iptables 使之生效. 
	
	
		
			
				
					|  | 
							
								systemctl restart iptables |  
	  
	以下是 firewallD 的配置方法, 使用 iptables 的可以忽略. 这里有个问题, –add-masquerade 会将整个区域进行 nat 转发, 无法指定 ip 段, 这也是为什么使用 iptables 而不用 firewallD 的原因. 
	
	
		
			
				
					|  | 
							
								#开放端口 
								firewall-cmd --permanent --add-port=500/udp #允许ISAMKP数据包 
								firewall-cmd --permanent --add-port=4500/udp #IPSec NAT Traversal数据包 
								  
								#启用nat 
								firewall-cmd --permanent --add-masquerade |  
	  
	配置完防火墙后重启 strongswan 服务 
	
	
		
			
				
					|  | 
							
								strongswan stop #使用strongswan 自身的命令停止服务 
								systemctl start strongswan #使用 systemctl 命令启动服务 |  
	这里不使用 strongswan restart 命令的原因是, 使用这条命令后, 再用 systemctl status strongswan 命令得不到正确的运行状态. 
	至此, 服务端配置已完成. 
	下面配置客户端 
	IOS:
	有两种选择 
	1. 使用证书 
	把之前的 .p12 证书用邮件发送到手机上.  导入到手机(此时需要之前设置的证书密码). 
	找到手机上 “设置->VPN->添加配置”, 选 IPSec 
	
		描述: 随便填
		服务器: 填url或ip
		帐户: 服务端设置中的 EAP 项用户名
		密码: 服务端设置中的 EAP 项密码
		使用证书: 打开 
	2. 使用预设密钥 
	找到手机上 “设置->VPN->添加配置”, 选 IPSec 
	
		描述: 随便填
		服务器: 填url或ip
		帐户: 服务端设置中的 EAP 项用户名
		密码: 服务端设置中的 EAP 项密码
		使用证书: 关闭
		密钥: 服务端设置中的 PSK 项密钥 
	Windows 7+
	导入证书: 
	
		开始菜单搜索“cmd”,打开后输入 mmc(Microsoft 管理控制台)。
		“文件”-“添加/删除管理单元”,添加“证书”单元
		证书单元的弹出窗口中一定要选“计算机账户”,之后选“本地计算机”,确定。
		在左边的“控制台根节点”下选择“证书”-“个人”,然后选右边的“更多操作”-“所有任务”-“导入”打开证书导入窗口。
		选择刚才生成的 client.cert.p12 文件。下一步输入私钥密码。下一步“证书存储”选“个人”。
		导入成功后,把导入的 CA 证书剪切到“受信任的根证书颁发机构”的证书文件夹里面。
		打开剩下的那个私人证书,看一下有没有显示“您有一个与该证书对应的私钥”,以及“证书路径”下面是不是显示“该证书没有问题”。
		然后关闭 mmc,提示“将控制台设置存入控制台1吗”,选“否”即可。 
	千万不要双击 .p12 证书导入!因为那样会导入到当前用户而不是本机计算机中,ipsec 守护精灵是访问不了它的。 
	建立连接: 
	
		“控制面板”-“网络和共享中心”-“设置新的连接或网络”-“连接到工作区”-“使用我的 Internet 连接”
		Internet 地址写服务器 IP 或 URL。
		描述随便写。
		用户名密码写之前配置的 EAP 的那个。
		确定
		以下是可选步骤
		点击右下角网络图标,在新建的 VPN 连接上右键属性然后切换到“安全”选项卡,
		VPN 类型选 IKEv2.
		数据加密是“需要加密”
		身份认证这里需要说一下,如果想要使用 EAP-MSCHAPV2 的话就选择“使用可扩展的身份认证协议”-“Microsoft 安全密码”,想要使用私人证书认证的话就选择“使用计算机证书”。 
	  
	二. l2tp VPN
	安装 xl2tpd 服务端
	下面的方法基于已经安装且配置好的 strongSwan. 
	
	
		
			
				
					|  | 
							
								yum install xl2tpd 
								systemctl enable xl2tpd 
								systemctl start xl2tpd |  
	在 strongSwan 的 ipsec.conf 配置中添加新的 l2tp 节, 注意, 这里写的配置是继承了 ipsec.conf 中的 %default 节, 某些必要且未给出的参数在 %default 中. 
	
	
		
			
				
					|  | 
							
								nano /etc/strongswan/ipsec.conf |  
	  
	
		
			
				
					|  | 
							
								conn L2TP-PSK 
								    keyexchange=ikev1 
								    authby=secret 
								    leftprotoport=17/1701 #l2tp端口 
								    leftfirewall=no 
								    rightprotoport=17/%any 
								    type=transport 
								    auto=add |  
	配置 xl2tpd 
	
	
		
			
				
					|  | 
							
								nano /etc/xl2tpd/xl2tpd.conf |  
	  
	
		
			
				
					|  | 
							
								[lns default] 
								ip range = 10.0.0.100-10.0.0.255 
								local ip = 10.0.0.10 
								require chap = yes 
								refuse pap = yes 
								require authentication = yes 
								name = itnmgVPN 
								ppp debug = yes 
								pppoptfile = /etc/ppp/options.xl2tpd 
								length bit = yes |  
	配置 ppp 
	
	
		
			
				
					|  | 
							
								nano /etc/ppp/options.xl2tpd |  
	  
	
	
		
			
				
					| 
							
								1 
								2 
								3 
								4 
								5 
								6 
								7 
								8 
								9 
								10 
								11 
								12 
								13 
								14 
								15 
								16 | 
							
								require-mschap-v2 
								ipcp-accept-local 
								ipcp-accept-remote 
								ms-dns  8.8.8.8 
								ms-dns  8.8.4.4 
								noccp 
								auth 
								crtscts 
								idle 1800 
								mtu 1410 
								mru 1410 
								nodefaultroute 
								debug 
								lock 
								proxyarp 
								connect-delay 5000 |  
	设置用户名,密码 
	
	
		
			
				
					|  | 
							
								nano /etc/ppp/chap-secrets |  
	  
	
	
		
			
				
					|  | 
							
								# Secrets for authentication using CHAP 
								# client(用户名)  server(服务器名)  secret(密码)  IP addresses(允许连接的客户端IP) 
								user1             itnmgVPN          "pasword1"    * |  
	开放防火墙端口 
	
	
		
			
				
					|  | 
							
								iptables -A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport 1701 -j ACCEPT # 强制l2tp 使用 ipsec 隧道 
								service iptables save 
								systemctl restart iptables |  
	重启服务 
	
	
		
			
				
					|  | 
							
								strongswan stop 
								systemctl restart strongswan 
								systemctl restart xl2tpd |  
	至此, l2tp 服务端配置完成. 
	  
	下面是客户端配置 
	win7+ 
	
		新建 VPN 连接, 步骤省略
		右键,属性-安全
		vpn类型选 “使用ipsec的第二层隧道协议”
		点高级设置, 选择”使用预共享的密钥作身份验证”
		输入预设psk密钥(在配置 strongSwan 时设置的)
		确定保存 
 
 (责任编辑:IT)
 |