配置epel源
1 |
|
安装Strongswan
yum -y install strongswan openssl openssl-devel
环境变量
1 | cat >> /etc/sysctl.conf << EOF |
防火墙配置
firewall-cmd --permanent --add-service=ipsec
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
cat /usr/lib/firewalld/services/ipsec.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>IPsec</short>
<description>Internet Protocol Security (IPsec) incorporates security for network transmissions directly into the Internet Protocol (IP). IPsec provides methods for both encrypting data and authentication for the host or network it sends to. If you plan to use a vpnc server or FreeS/WAN, do not disable this option.</description>
<port protocol="ah" port=""/>
<port protocol="esp" port=""/>
<port protocol="udp" port="500"/>
<port protocol="udp" port="4500"/>
</service>
## 或者
#启用ip伪装
# firewall-cmd --permanen --add-rich-rule='rule family="ipv4" source address="10.100.100.0/24" masquerade'
#添加 nat 转发
# firewall-cmd --permanen --add-rich-rule='rule family="ipv4" source address="10.100.100.0/24" forward-port port="4500" protocol="udp" to-port="4500"'
# firewall-cmd --permanen --add-rich-rule='rule family="ipv4" source address="10.100.100.0/24" forward-port port="500" protocol="udp" to-port="500"'
配置文件ipsec.conf
1 |
|
密码配置文件
1 |
|
配置文件strongswan.conf
1 |
|
生成服务器和客户端证书
1 |
|
重启strongswan
systemctl restart strongswan
systemctl enabble strongswan
显示当前接入动态信息
swanctl --log
iptables 配置方法
firewalld 要比 iptables 占太多内存. 小内存的 vps 用 firewalld 有点奢侈. 还是换回 iptables 了.
将下面几条规则加入 iptables 规则中, 适当使用 -I 参数替换 -A 参数, 确保所有的项目位置都在拒绝项前面.
#开放端口
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
#启用ip伪装
iptables -t nat -I POSTROUTING -s 10.1.0.0/16 -o eth0 -m policy --dir out --pol ipsec -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -o eth0 -j MASQUERADE
#添加转发
iptables -A FORWARD -s 10.1.0.0/16 -j ACCEPT
#保存规则
service iptables save
#重启服务
systemctl restart iptables
如果嫌上面的操作麻烦, 可以直接编辑 iptables 规则文件.
# vi /etc/sysconfig/iptables
将下面的规则部分贴进去, 不要整个复制粘贴, 根据原有规则适当调整每条规则的位置, 确保规则在拒绝项前, 使之能生效.
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.1.0.0/16 -o eth0 -m policy --dir out --pol ipsec -j ACCEPT
-A POSTROUTING -s 10.1.0.0/16 -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 udp -m udp --dport 500 -j ACCEPT
-A INPUT -p udp -m udp --dport 4500 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -s 10.1.0.0/16 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
保存退出, 重启 iptables 使之生效.
# systemctl restart iptables
配置说明
证书使用配置说名
. IKEv2有两个很总要的信息需要确认,一个是数字证书,证书必须正确配置ca、crt和key三个文件。其中服务器证书serverCert.crt中subject DN或subjectAltName字段必须包含服务器的IP或域名。
. left|rightid应该在用户认证过程中进行鉴别,同时left|rightcert的值应该是left|rightcert数字证书中的subject DN或subjectAltName中的值。left|rightid可以是IP地址、域名、邮箱地址甚至是证书中可以辨识的名称。
生成证书说明
生成证书
# mkdir /cert && cd /cert
下面所有的(--type rsa --size 2048|4096 )可以省略, me.touzhi.work 可以换成IP 地址
1) 生成 CA 根证书
A. 生成一个私钥,用于CA证书自签:
yum安装的strongswan,命令已经变成"strongswan --help"了,而手动编译的还是"ipsec --help",不要弄混,否则就是命令不存在了。
# strongswan pki --gen --type rsa --size 4096 --outform pem > ca_key.pem
B. 基于这个私钥自己签一个 CA 根证书:
# strongswan pki --self --ca --flag serverAuth --lifetime 3650 --in ca_key.pem --type rsa --dn "C=CN, O=WTO, CN=me.touzi.work" --outform pem >ca_cert.pem
–self 表示自签证书
–in 是输入的私钥
–dn 是判别名
C 表示国家名,同样还有 ST 州/省名,L 地区名,STREET(全大写) 街道名
O 组织名称
CN 友好显示的通用名
–ca 表示生成 CA 根证书
–lifetime 为有效期, 单位是天
C. 显示CA 根证书内容
# strongswan pki --print --in ca_cert.pem
2) 生成服务器端证书
A. 生成一个私钥,用于服务端证书自签
# strongswan pki --gen --type rsa --size 2048 --outform pem > server_key.pem
B. 从私钥生成公钥
# strongswan pki --pub --in server_key.pem --type rsa --outform pem > server_pub.pem
C. 用刚生成的公钥生成服务器证书
# strongswan pki --issue --lifetime 1200 --in server_pub.pem \
--cacert ca_cert.pem --cakey ca_key.pem --dn "C=CN, O=WTO, CN=me.touzi.work" \
--san="me.touzi.work" --san "162.219.120.136" --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。
所以这里C、O的值要跟第一步的一致,CN值及--san值是服务器公网地址或url,另外这里可以设置多个--san值。否则会出现错误 13801:IKE身份验证凭证不可接受.
D. 显示服务器证书内容
# strongswan pki --print --in server_cert.pem
3) 生成客户端证书(可选), 如果需要很高的安全性, 可以用客户端证书
A 生成客户端证书的私钥
# strongswan pki --gen --type rsa --size 2048 --outform pem > client_key.pem
6) 用CA证书签发客户端证书
A. 从私钥生成公钥
# strongswan pki --pub --in client_key.pem --type rsa --outform pem > client_pub.pem
B. 签发客户端证书,这里就不需要上面那一堆特殊参数了
# strongswan pki --issue --in client_pub.pem \
--cacert ca_cert.pem --cakey ca_key.pem --dn "C=CN, O=WTO, CN=dolphin@126.com" \
--san dolphin@126.com --lifetime 1200 --outform pem > client_cert.pem
--flag serverAuth --flag ikeIntermediate
--san dolphin@126.com 可以省略,--san CN= 可以是邮箱地址,也可以是me.touzhi.work
C. 打包证书为 pkcs12,生成 pkcs12 证书
# openssl pkcs12 -export -inkey client_key.pem -in client_cert.pem -name "WTO Client" \
-certfile ca_cert.pem -caname "me.touzi.work" -out client_cert.p12
CA证书转换,以防部分客户端不支持
# openssl x509 -inform PEM -outform DER -in ca_cert.pem -out ca.crt
8) 安装证书, 把证书复制到strongswan目录下
# 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 server_pub.pem /etc/strongswan/ipsec.d/certs/
# 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 复制出来给客户端用
配置验证方式的用户名与密码
下面添加用户
# vi /etc/strongswan/ipsec.secrets
#使用证书验证时的服务器端私钥
#格式 : RSA <private key file> [ <passphrase> | %prompt ]
: RSA server_key.pem
#使用预设加密密钥, 越长越好
#格式 [ <id selectors> ] : PSK <secret>
%any : PSK "预设加密密钥"
#EAP 方式, 格式同 psk 相同
用户名 : EAP "密码"
#XAUTH 方式, 只适用于 IKEv1
#格式 [ <servername> ] <username> : XAUTH "<password>"
用户名 : XAUTH "密码"
示例:
创建了VPN用户john和他的密码。在添加用户的时候,请注意在冒号(:)左右两边都需要一个空格。
: RSA server_key.pem
: PSK "PSK_KEY"
john %any : EAP "John's Password"
john %any : XAUTH "John's Password"
: RSA server_key.pem #使用证书验证时的服务器端私钥
: PSK "123456" #使用预设密钥时, 8-63位ASCII字符
: XAUTH "123456" #这里是使用XAUTH验证时的用户名和密码
VPN %any : EAP "123456" #这里是使用EAP验证时的用户名和密码
客户端配置
在客户端安装(client_cert.p12,ca_cert.pem)两个证书如果你是使用iPhone, 可以通过邮件将这个两个证书发送到iPhone上然后安装。
先下载安装一开始生成的CA证书ca_cert.pem,可能需要改扩展名,如ca.crt
IOS 9.x:
类型 IKEv2
服务器是 IP 或是 URL
远程ID是 IP 或是 URL
账户和密码填 ipsec.secrets 里 EAP 前后的那两个
IOS 9 以下:
类型 IPSec
iPhone, Android, Windows PC都可以通过证书加密码的方式登录VPN;
Mac OS X可以通过PSK key加密码的方式登录。
1) IOS:
先导入 CA 证书
将之前创建的 ca_cert.pem 用 ftp 导出 , 写邮件以附件的方式发到邮箱, 在 ios 浏览器登录邮箱, 下载附件, 安装 ca 证书.
1. 使用 IKEv2 + EAP 认证
找到手机上 “设置->VPN->添加配置”, 选 IKEv2
描述: 随便填
服务器: 填url或ip
远程ID: ipsec.conf 中的 leftid
用户鉴定: 用户名
用户名: EAP 项用户名
密码: EAP 项密码
2. 使用 IKEv2 + 客户端证书 认证
把之前的 .p12 证书(里面包含ca证书)发到邮箱在手机上打开. 导入到手机(此时需要之前设置的证书密码).
找到手机上 “设置->VPN->添加配置”, 选 IKEv2
描述: 随便填
服务器: 填url或ip
远程ID: ipsec.conf 中的 leftid
用户鉴定: 证书
证书: 选择安装完的客户端证书
3. 使用 IKEv2 + 预设密钥 认证
找到手机上 “设置->VPN->添加配置”, 选 IKEv2
描述: 随便填
服务器: 填url或ip
远程ID: ipsec.conf 中的 leftid
用户鉴定: 无
使用证书: 关
密钥: PSK 项密钥
2) 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 配置完成
3) Windows 7 导入证书略有不同
开始菜单搜索「cmd」,打开后输入 mmc(Microsoft 管理控制台)。
「文件」-「添加/删除管理单元」,添加「证书」单元
证书单元的弹出窗口中一定要选「计算机账户」,之后选「本地计算机」,确定。
在左边的「控制台根节点」下选择「证书」-「受信任的根证书颁发机构」-「证书」,右键 -「所有任务」-「导入」打开证书导入窗口。
选择 CA 证书 ca_cert.crt 导入即可
注意 千万不要双击 .p12 证书导入!因为那样会导入到当前用户而不是本机计算机中,ipsec 守护精灵是访问不了它的。
其它配置参考
1 |
|
1 |
|
参考文档
搭建strongswan服务器
http://www.bewindoweb.com/123.html
https://expats-in-china.com/t/setup-a-vpn-ipsec-on-centos-7-using-strongswan/27