一个大型的信息化系统往往由多个第三方厂家的软硬件产品集成而成,包括网络设备、安全设备、服务器、业务系统、网管系统等,那么在维护这个系统的时候势必需要多个第三方厂家的售后远程访问系统,如何管理众多的远程账户权限是一个严肃的问题。

目前市面上有不少厂家有专门的解决方案,譬如h3c的secpath运维审计系统,它们统称为堡垒机,然而对于中小企业而言,信息化系统投资预算有限,堡垒机的价值不菲。所以只能另寻其它解决方案,本文讨论的就是利用pfsense[1]自带的strongswan+freeradius+pf,构建一个容易管理的,受控的ipsec/ikev2 vpn,实现堡垒机的部分功能。

思路很简单:

  • 第三方维护单位将获得独立的账号,允许系统管理员通过webUI快速创建和管理这些账号;

  • 允许系统管理员限定每个账号可访问的资源;

  • 对于图新界面的维护,譬如windows服务器,通过部署Active Directory来控制系统管理员的操作权限;

  • 对于字符界面的维护,譬如linux服务器、网络设备,通过日志系统来记录系统管理员的操作行为;

  • 对于web界面的维护,无解;

pfsense的pf+strongswan+freeradius仅实现前面两项需求。

strongswan支持l2tp、ikev1、ikev2多种vpn类型,ikev2特别适合于移动网络环境,具备快速重连的功能特性,而且安全性最高,所以本文采用的就是ikev2这种vpn类型。另外,eap-freeradius的认证配置稍显复杂,为了提高成功率,我决定先尝试配置eap-mschapv2,成功之后再配置eap-freeradius。

ikev2/EAP-MSCHAPv2

生成CA和服务器证书

由于windows7对证书有一些特殊的需求,而pfsense webUI的证书生成器缺乏一些参数,所以需要在命令行下创建证书:

cd /home/
ipsec pki --gen --type rsa --size 4096 --outform pem > qmcc.key.pem (1)
chmod 600 qmcc.key.pem
ipsec pki --self --ca --lifetime 3650 --in qmcc.key.pem --type rsa --dn "OU=jike, CN=qmcc CA" --outform pem > qmcc.cacert.pem (2)
ipsec pki --gen --type rsa --size 4096 --outform pem > private/pfs-gw1.syxy.key.pem (3)
chmod 600 private/pfs-gw1.syxy.key.pem
ipsec pki --pub --in private/pfs-gw1.syxy.key.pem --type rsa | ipsec pki --issue --lifetime 3650 --cacert cacerts/qmcc.cacert.pem --cakey private/qmcc.key.pem --dn "OU=syxy, CN=pfs-gw1.syxy.qmcc" --san pfs-gw1.syxy.qmcc --san @221.xx.xx.44 --flag serverAuth --flag ikeIntermediate --outform pem > certs/pfs-gw1.syxy.cert.pem (4)
1 创建ca key
2 创建ca 证书
3 创建服务器(pfs-gw1) key
4 创建服务器(pfs-gw1) 证书

将证书导入pfsense

进入system ▸ Cert. Manager标签页

图1、pfsense证书管理界面

点击add按钮,出现“图2、pfsense CAs创建界面”,method选择“Import an existing Certificate Authority”。

图2、pfsense CAs创建界面

接着在命令行下使用vi命令查看证书:

/home/qmcc.cert.pem
-----BEGIN CERTIFICATE-----
MIIFJzCCAw+gAwIBAgIIOqC4fSsDMIEwDQYJKoZIhvcNAQEFBQAwITENMAsGA1UE
CxMEamlrZTEQMA4GA1UEAxMHcW1jYyBDQTAeFw0xNTEyMzAwODE5MTJaFw0yNTEy
MjcwODE5MTJaMCExDTALBgNVBAsTBGppa2UxEDAOBgNVBAMTB3FtY2MgQ0EwggIi
MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDAD+6TWuAoy/gDE/z4pT2T/nOr
isBB8F7eavBx2Jppwc889v94I1w9mEB43lLo+nsXnEfp3b1fYPafVjLOBqAFwt3s
9uDQA9JOmOn1AuaoohVtyui9RvUAONldsHLxrgyBk/BwnnUYn/vcHG9lzC+hf4rY
.....
p4+7Qu/ZEfRllg9F2p8L81N7pPEwi3wEKZnTfW3LgKwXW9Hz431pEVd1pRxR39v5
TAmZS6JN7mnAYH2eT4esps4tJKiOajj3n+kGArQily14HPvVGN/gPJ1qgLWEfnQA
voTgzB6vNJDSjHILeDy2Z7uAOXxSgl342DCpi0GSUjEwyuby5iEGnE4XZwPWm05G
C4x8YfbziozcDcpVR7frXHI6lxiJW+uRI5mugYnb+UXNZdDfxrP96w8U/57kw0wk
qIKczV3buz3hhXN6bU0FroKhwSvGCdy0IUgTdc02O9ow6BiQaIj9qnNXWef6yhsJ
rmW7QxRnfOwri2g1TYmlhNV2herAo5gnNouhfHQL9gy8fDyCZsjSo0mCSnQoA+bK
0nmzY21vl6v/Bgo4PKIVwnYVRE1bYDIXbp/QWRhhnN65MXONXgoDtIU+Az7o3ks8
8ZrR8Foe4R3/g2VP2g17ZN/ccUc8TRhMXome
-----END CERTIFICATE-----

将上述文本粘贴到“图2、pfsense CAs创建界面”的“Certificate data”框中。

随后参考上面的步骤导入服务器(pfs-gw1)证书和服务器(pfs-gw1)key。

ikev2/EAP-MSCHAPv2

在创建ikev2/EAP-Radius之前,先实现简单的ikev2/eap-mschapv2,确认cert、ipsec、eap-mschapv2各个组件均可正常工作之后,再叠加freeradius和eap-radius功能。

  • Mobile Clients

    导航至VPN ▸ IPsec ▸ Mobile Clients标签页

    • 选中 Enable IPsec Mobile Client Support

    • 在User Authentication 选择Local Database

    • 选中 Provide a virtual IP address to clients

    • 输入一个未使用的私网子网和掩码,本例是“192.168.110.0/24”

    • 选中“Provide a list of accessible networks to clients”

    • 点击Save按钮

  • Phase 1

    导航至Tunnels标签页

    • 点击Create Phase1按钮

    • “Key Exchange version”选择“v2”

    • Authentication method选择“EAP-MSChapv2”

    • My Identifier 选择“Distinguished name”,在右边框输入防火墙的名称

      防火墙名称必须严格匹配前面的服务器证书中的Common Name,本项目中所用的是“pfs-gw1”
    • Peer Identifier选择“any”

    • My Certificate选择刚才所导入的服务器证书,本例中是“pfs-gw1 cert”

    • Encryption algorithm设为“AES”和“256 bits”

    • Hash algorithm 选择“SHA1”,假如没有iOS/OS X的用户,则可以选择“SHA256”

    • DH key group选择“2 (1024 bit) ”

    • Lifetime选择“28800 ”

    • 取消“Disable Rekey”

    • 取消“Disable Reauth”

    • 选中“Enable DPD”, 设为“10 seconds”和“5 retries”

    • 点击Save按钮

  • Phase 2

    用户通过ikev2拨号进来之后,允许访问哪些网段将在这里进行设置。

    • 展开“show Phase 2 Entries”

    • 点击“add P2”, 或者修改一个以存在的entry。

    • Mode选择“Tunnel IPv4 ”

    • Local Network建议选择“Network”,更细粒度的控制可在Firewall>Rules>IPsec中实现,本例中,ipsec客户端将访问“192.168.111.0/24”和“10.10.0.0/24”这两个子网中的网元。

      1. 假如设为0.0.0.0/0,那么客户端访问互联网的数据也将通过vpn,在本项目中并不需要。

      2. 因为无法在一个entry中设置两个网段,所以需要创建两个entry,每个entry对应一个子网

    • Description可填可不填

    • Protocol设置为“ESP ”

    • Encryption algorithms勾选“ AES+Auto” 假如没有iOS/OS X的用户,还可以额外选择“3DES”

    • Hash algorithms勾选“SHA1”和“SHA256”

    • PFS Key Group设为“off”

    • Lifetime设为“3600”

    • 点击Save

  • 创建用户

    导航至VPN ▸ IPsec ▸ Pre-Shared Keys标签页

    • 点击“”

    • 输入用户名,类似邮箱样式,譬如“user@example.com

    • Secret Type选择“EAP”

    • 在Pre-Shared Key输入密码

    • 点击Save按钮

该方式所创建的用户,其密码是明文且可见,并不安全,仅供测试只用。生产环境中应使用下面介绍的EAP-RADIUS或EAP-TLS认证方式。

防火墙

  • 策略

    ipsec在pfsense中是等同于物理接口的存在,可以通过防火墙策略来精细控制源和目标。eap-mschapv2认证方式仅用作测试连通性,所以先配置一条大颗粒度的rule

    导航至Firewall ▸ Rules ▸ IPsec标签页

    • 点击add按钮

    • Protocol、Source和Destination全部设为“any”

    • 点击Save按钮

    • 点击Apply Changes按钮

  • NAT

    ipsec客户端拨号至pfs-gw1后,获得的是192.168.110.0/24的ip地址,这个ip段尚未添加至h3c 5800中,所以通过ipsec隧道进来的数据包,在离开pfs-gw1之前,需要映射成pfs-gw1的接口ip地址,分别是10.10.0.17和192.168.111.60,才能正常访问10.10.0.0/24和192.168.111.0/24子网的网元。

    导航至Firewall ▸ NAT ▸ Outbound标签页

    • Mode选择Manual Outbound NAT rule generation

    • Interface选择LAN

    • Source选择Network,网段为192.168.110.0/24

    • Destination选择Any

    • Translation Address选择Interface Address

    • 点击saveapply change按钮

    上面的步骤创建的是192.168.110/24至10.10.0.17(WAN网卡IP)的映射,还需要遵循同样的步骤创建一条192.168.110.0/24至192.168.111.60(LAN网卡IP)的映射。

至此完成ikev2/eap-mschapv2的部署,可在windows7中创建一个ipsec/ikev2拨号连接进行测试。

如果一切正常的话,客户端将获得一个192.168.110.0/24的ip地址,可以ping通192.168.111.0/24和10.10.0.0/24这两个子网中的网元。

ikev2/eap-radius

前面完成了ikev2/eap-mschapv2的热身,下面正式配置freeradius作为ipsec的认证后端,其好处是:

  1. 特定的用户将获得固定的ip地址,便于在防火墙策略中限定其访问的特定网元;

  2. 用户密码以密文方式存储,提高安全性。

其它功能特性,包括数据库支持、记账、审计等有待进一步挖掘,本期未涉及。

pfsense提供了一个官方的freeradius2包,版本比较低,但是足以应付本项目需求。如何安装软件包详见官方文档。

  • 在ikev2/eap-mschapv2配置的基础上,做一些简单的修改:

    • System ▸ User Manager ▸ Authentication Servers标签页 中定义radius服务器

    • 点击添加按钮

    • Type选择RADIUS

    • Hostname of IP address填入pfs-gw1,注意该名称并不需要存在dns记录,只需要在pfs-gw1本机的命令行界面中ping得通即可。

    • Shared Secret填入syxy

    • Service offered选择Authentication and Accounting

    • Authentication port和Accounting port保持18121813不变

  • 更改ipsec/mobile clients中的配置

    • 导航至VPN ▸ IPsec ▸ Mobile Clients标签页

    • User Authentication选择freeradius on pfs-gw1,该名称是前面所定义的radius服务器中的Descriptive name

    • 取消Provide a virtual IP address to clients

      改由freeradius/user将特定ip下发给客户端。
  • 更改ipsec/Phase 1中的Authentication method

    • 导航至VPN ▸ IPsec ▸ Tunnel标签页

    • 编辑road warrior ikev2 p1,Authentication method选择EAP-RADIUS

freeradius

导航至services ▸ FreeRADIUS

  • 添加Users

    • 在Users标签页,点击“add”按钮

    • 填入Username和Password

      username建议采用邮箱形式,譬如“xxx@rad.syxy.qmcc
    • Password Encryption选择“Cleartext-Password”

    • IP address填入该用户的特定ip,后续将在防火墙策略中针对该ip做精细控制

    • subnet mask和gateway留空

  • 添加NAS/Clients

    • 在NAS/Clients标签页,点击add按钮

    • Client IP Address填入“192.168.111.60”

    • Client IP Version选择“IPv4”

    • Client Shortname填入“pfs-gw1”

    • Client Shared Secret填入“syxy”

    • 点击保存按钮

  • 添加Interfaces

    • 在Interfaces标签页,点击add按钮

    • Interface IP address填入“192.168.111.60”

    • Port默认“1812”

    • Interface Type选择“Authentication”

    • IP Version选择“IPv4”

    • 点击保存按钮

遵照上列步骤添加再一条Accounting Interface,端口是1813

  • 其它

    • EAP保持默认值即可,Default EAP Type的默认值为“MD5”,无需修改。

至此,ikev2/eap-radius配置完成,每个用户将获得一个固定的ip地址,再通过防火墙策略实现精细控制。

关于split-tunnel

The Windows 7 client will always allow access to the host’s LAN. So to access, for instance, a local printer nothing special has to be done. Since the client always proposes 0.0.0.0/0 as remote TS, the gateway is free to narrow it to a subset. But to make split-tunneling actually work on the client the Use default gateway on remote network option in the Advanced TCP/IP settings of the VPN connection has to be disabled. Also, because a classful route is installed the virtual IP address has to belong to the remote subnet, otherwise, the Disable class based route addition option has to be enabled and routes have to be installed manually. With Windows 8.1 (and in Windows Server 2012 R2) Microsoft introduced PowerShell cmdlets to configure VPN connections. These provide more options and also allow to configure split tunneling directly (-SplitTunneling option).


1. pfsense是一款优秀的软路由软件,自带了pf、carp、open-bgpd、strongswan等功能强大的组件,加上精美的webUI,深受运维人员的喜爱。