strongSwan 实验 RoadWarrior模式
本文介绍strongSwan基于RoadWarrior模式的实验.
strongSwan有很多种模式,RoadWarrior模式因为涉及到多种客户端软件的交互,似乎是最难搞的。本文描述的实验主要目的有:
- 使用strongSwan做虚拟专用网服务端
- 使用virtual ip
- 发布默认路由
- 发布DNS
- 客户端
- 使用strongSwan做客户端
- 使用Windows做客户端
- 使用计算机证书 x_509_machine_certificates
- 使用Android做客户端
- 使用ChromeOS做客户端
- 使用FortiGate做客户端
- 实验默认路由
- 实验指定的路由 OSFP/BGP
- 防火墙
- 暂不考虑防火墙
- 以后有专门的实验来实验防火墙
准备
strongSwan配置
由于需要实验各种客户端,不方便在lxd中实验,这次直接在我所拥有的一台VPS上做实验.
服务端:
/etc/swanctl/swanctl.conf
include conf.d/*.conf
connections {
rw {
pools = rw_pool
local {
auth = pubkey
certs = moonCert.pem
id = moon.strongswan.org
}
remote {
auth = pubkey
}
children {
rw {
# local_ts = <本地子网> # 若只要客户端访问本地子网
local_ts = 0.0.0.0/0 # 允许客户端访问所有网段,一般要配套MASQUERADE
# remote_ts = <远程子网> # 不需要,只用没有使用pool才需要
}
}
}
}
pools {
rw_pool {
addrs = <分配给客户端的虚拟地址> #如 10.0.3.0/24
dns = <推送给客户端的DNS地址,逗号分隔> 如8.8.8.8,8.8.4.4
}
}
为了让客户端虚拟地址网段(如 10.2.3.0/24)访问公网,需要进行MASQUERADE SNAT转换,参考这里.
iptables -t nat -I POSTROUTING -m policy --pol ipsec --dir out -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.0.3.0/24 -o eth0 -j MASQUERADE
注:第一条是必须的,其作用是明文转ipsec报文(-m policy –pol ipec –dir out)的时候,跳过MASQUERADE。这点与GRE不同,GRE原则上是host-host的,所以不需要MQSQUERADE.
证书配置
使用以下两个脚本之一产生pem格式客户端证书
USERNAME=yourname ./gen_client_email.sh
ipsec pki --gen --type rsa --size 2048 --outform pem > private/${USERNAME}Key.pem
chmod 600 private/${USERNAME}Key.pem
ipsec pki --pub --in private/${USERNAME}Key.pem --type rsa | \
ipsec pki --issue --lifetime 730 --outform pem \
--cacert x509ca/strongswanCert.pem \
--cakey private/strongswanKey.pem \
--dn "C=CH, O=strongSwan, CN=${USERNAME}@strongswan.org" \
--san ${USERNAME}@strongswan.org \
--flag clientAuth --flag ikeIntermediate \
> x509/${USERNAME}Cert.pem
HOSTNAME=yourhostname ./gen_client_domain.sh
ipsec pki --gen --type rsa --size 2048 --outform pem > private/${HOSTNAME}Key.pem
chmod 600 private/${HOSTNAME}Key.pem
ipsec pki --pub --in private/${HOSTNAME}Key.pem --type rsa | \
ipsec pki --issue --lifetime 730 --outform pem \
--cacert x509ca/strongswanCert.pem \
--cakey private/strongswanKey.pem \
--dn "C=CH, O=strongSwan, CN=${HOSTNAME}.strongswan.org" \
--san ${HOSTNAME}.strongswan.org \
--flag clientAuth --flag ikeIntermediate \
> x509/${HOSTNAME}Cert.pem
注意:--flag 要么没有,要么要有clientAuth,否则至少Windows不能工作
将pem格式证书转换为p12格式
NAME=name ./p12.sh
openssl pkcs12 -export -inkey private/${NAME}Key.pem \
-in x509/${NAME}Cert.pem -name "${NAME}" \
-certfile x509ca/strongswanCert.pem -caname "strongSwan Root CA" \
-out pkcs12/${NAME}Cert.p12
实验
strongSwan客户端
/etc/swanctl/swanctl.conf
include conf.d/*.conf
connections {
myserver {
remote_addrs = moon.strongswan.org
vips = 0.0.0.0
local {
auth = pubkey
certs = carolCert.pem
id = carol@strongswan.org
}
remote {
auth = pubkey
id = moon.strongswan.org
}
children {
myserver {
remote_ts = 0.0.0.0/0
start_action = start
}
}
}
}
TODO: 还没有研究出如何利用strongswan客户端更新使用systemd-resolved系统的DNS。strongswan使用了resolconf,目前研究到的一点眉目是需要安装systemd-resolvconf软件包。还有一种方法也许是换用NetworkManager。
Windows客户端
首先在regedit中设置NegotiateDH2048_AES256 DWORD 为2
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Rasman\Parameters\NegotiateDH2048_AES256
在Windows上导入p12证书文件
- 双击打开
- 存储位置 本地计算机
- 证书导入向导-要导入的文件 直接点"下一步"
- 证书导入向导-私钥保护 输入p12文件密码后,选择"标志此密钥为可导出的密钥"、“包括所有扩展属性”,点"下一步"
- 证书导入向导-证书存储 选"根据证书类型自动选择证书存储",点"下一步"
- 点"完成"
打开网络和Internet设置
添加"虚拟专用网"连接
- “虚拟专用网"提供商 Windows内置
- 连接名称 test
- 服务器名称或地址 moon.strongswan.org #注意若无公网域名,需要添加hosts文件
- VPN类型 IKEv2
- 登录信息的类型 证书
- 用户名(可选) 空
- 密码(可选) 空
更改适配器设置,在“test”连接上点右键,选属性
- 安全
- 数据加密 最大强度的加密(如果服务器拒绝将断开连接)
- 身份验证 使用计算机证书
最后测试连接成功
Android客户端
下载p12文件,在文件管理器中打开 (经测试,不用带-legacy参数也可以打开)
- 选择证书类型 VPN和应用用户证书
- 为此证书命名 test
安装strongSwan Android客户端
- 添加VPN配置
- 服务器地址 moon.strongswan.org
- VPN类型 IKEv2证书
- 用户证书 选择用户证书 在弹出的窗口中选择test证书, 点选择
- CA证书 保留 自动选择
最后测试连接成功
改进
- CA证书选择 自动选择 会发送大量的CA请求,为了减少无用的流量 可以导入x509ca\strongSwanCert.pem CA证书,然后显示选择这一个证书 或在 不发送
- IPv6流量似乎有问题 可以勾选 屏蔽不通过VPN的IPv6流量
- TODO 有时间再研究搭建CRL或自动化下载配置
ChromeOS客户端
打开chrome://settings/certificates
在Your certificates页面 点Import and Bind导入p12证书
在虚拟专用网 - Private network - Built-in 虚拟专用网 旁边点加号,出现Join 虚拟专用网
- Service name: test
- Provider type: IPsec(IKEv2)
- Server hostname: moon.strongswan.org
- Authentication type: User certificate
- Local identity: 空
- Remote identity: 空
- Server CA certificate: strongSwan Root CA
- User certificate: strongSwan Root CA [yourname@strongswan.org]
最后测试连接成功
FortiGate客户端
服务端添加
为了使用FortiGate客户端,先在strongSwan服务端connections下添加
net-net {
local {
auth = pubkey
certs = moonCert.pem
id = moon.strongswan.org
}
remote {
auth = pubkey
id = "C=CH, O=strongSwan, CN=saturn.strongswan.org"
}
children {
fortigate {
local_ts = 0.0.0.0/0
remote_ts = 0.0.0.0/0
esp_proposals = aes256-sha256-x25519
}
}
}
然后以下是FortiGate客户端配置
添加证书
System-Certificates
Import Certificate
- Type PKCS#12 saturnCert.p12
Import CA Certificate File strongSwanCert.pem
添加虚拟专用网连接有两种方法Site-to-Site 静态路由或Hub-to-Spoke 动态路由
添加虚拟专用网连接Site-to-Site向导 静态路由
虚拟专用网 - IPsec Wizard
虚拟专用网 Setup
- Name mySite
- Template type: Site to Site
- NAT Configuration This site is behind NAT
- Remote device type FortiGate
Authentication
- Remote device: IP Address
- Remote IP address: xxx.xxx.xxx.xxx
- Outgoing Interface: wan
- Authentication method: Signature
- Certificate Name: StaturnCert
- Peer Certificate CA: CA_Cert_1
Policy & Routing
- Local interface: lan
- Local subnets: 10.x.x.0/24 # 自己的LAN子网 貌似也可以0.0.0.0/0
- Remote Subnets: 0.0.0.0/0
- Internet Access: None
这样通过模板创建的是IKEv1还不能直接用,需要将其转换为Custom Tunnel类型,然后设置
- Authentication: IKEv2
- Pharse 1 Proposal: Diffie-Hellman Groups 31
- Pharse 1 Proposal: Diffie-Hellman Groups 31
通过Site-to-Site 模板创建的虚拟专用网,会自动创建静态路由,不用再设置路由了
然后到 Monitor - IPsec Monitor中Bring Up tunnel 进行测试
添加虚拟专用网连接Hub-to-Spoke向导 动态路由
虚拟专用网 - IPsec Wizard
虚拟专用网 Setup
- Name: mySpoke
- Template type: Hub-and-Spoke
- Type: Spoke
Autentication
- Remote IP address: xxx.xxx.xxx.xxx # 貌似不能用域名
- Outgoing Interface: wan
- Authentication method: Signature
- Certificate Name: StaturnCert
- Peer Certificate CA: CA_Cert_1
Tunnel Interface
- IP: 10.88.0.1 随便定义的
- Network mask: 255.255.255.255
- Remote IP/netmask: 10.88.0.2/32
Policy & Routing
- Local identifier 65400
- Local interface lan
- Local subnets 10.x.x.0/24 # 自己的LAN子网 貌似也可以0.0.0.0/0
这样通过模板创建的是IKEv1还不能直接用,需要将其转换为Custom Tunnel类型,然后设置
- Authentication: IKEv2
- Pharse 1 Proposal: Diffie-Hellman Groups 31
- Pharse 1 Proposal: Diffie-Hellman Groups 31
然后还需要设置路由,先添加IPv4静态路由到任一服务器网段进行测速,测速通过后,即可添加OSPF和BGP动态路由。
FortiGate上OSPF和BGP动态路由设置又是另一个课题,暂未实现。
结论
参考
- https://docs.strongswan.org/docs/5.9/interop/windowsCertRequirements.html#_user_and_machine_certificates 要么没有EKU,要么EKU要包含clientAuth
- https://docs.strongswan.org/docs/5.9/interop/windowsClients.html#_using_x_509_machine_certificates
- https://docs.strongswan.org/docs/5.9/pki/pkiQuickstart.html#_pkcs12_container 这里说Apple和Android导出pkcs12证书时需要legacy参数
- https://docs.strongswan.org/docs/5.9/interop/fortinet.html fortigate作服务端
- https://docs.strongswan.org/docs/5.9/config/IKEv2CipherSuites.html 各种CipherSuites含义
- https://community.fortinet.com/t5/FortiGate/Technical-Tip-IPv4-over-IPv6-IPsec-Tunnel/ta-p/253492 FortiGate 查错
下一步
- 实验在strongSwan服务端启用防火墙