使用 Openswan 为 Nokia E61 创建 Linux VPN
虚拟专用网络 (VPN) 允许您在不信任的网络上发送流量,而不会暴露流量的内容。从概念上讲,这是通过在两个主机之间创建管道来完成的,其中传输的所有网络流量都受到密码学的保护。
本文中的示例是将 Nokia E61 设备通过 Internet 上的 VPN 连接到家庭网络。Nokia E61 是一款智能手机,具有 Wi-Fi 支持以及 VPN 客户端。类似的过程可能适用于使用相同 VPN 客户端软件的其他型号的手机,尽管手头没有硬件来测试这一点。Linux 端在 Fedora Linux 6 上运行;其他发行版可能在路径和软件包名称上略有不同。
Nokia E61 上的 VPN 支持使用 IP 安全 (IPSec)。Openswan 是一个 IPSec 服务器,它在 Linux 机器上配置,以提供虚拟网络的另一端。
我应该首先提到一个警告:我一直无法配置手机上的 VPN 客户端来连接到没有静态 IP 地址的服务器。
为了保持符号简单,我将手机称为 e61,将运行 Openswan 的服务器称为 vserv。e61 的 IP 地址与本文无关,因为您可能会随手机移动到不同的 Wi-Fi 热点。当 VPN 设置好后,e61 会获得另一个 IP 地址,e61 将其称为虚拟 IP 地址。一旦 VPN 设置好,所有往返 e61 的流量都将发送到此虚拟 IP 地址。在本文中,我使用 192.168.x.x IP 地址作为此 e61 VPN 地址。由于 e61 的非 VPN IP 地址大多无关紧要,除非我明确提及,否则 e61 IP 地址将是此不可通过 Internet 路由的 IP 地址。
与手机上的其他网络设置不同,您不能使用 e61 本身手动配置 VPN。您必须创建一个包含有关 VPN 的所有信息的软件包,并将该软件包安装到手机上。这些软件包是 SIS 文件。VPN SIS 文件也必须经过数字签名,e61 才会允许您安装它。签名的 SIS 文件通常具有 sisx 扩展名。设置 e61 与 Openswan 通信的最困难部分是创建要在手机上安装的 sisx 文件。
即使您已将配置参数“软件安装”设置为“应用程序管理器/选项/设置”中的“全部”,SIS 文件仍然必须进行数字签名。
sisx 软件包由三个文件组成。其中两个是样板类型的软件包元数据(VPN.pin 和 VPN.pkg 文件)。
摆脱样板文件,VPN.pin 文件大多无趣,如列表 1 所示,VPN.pkg 文件如列表 2 所示。这两个文件应该可以正常工作,无需任何更改。请注意,列表 2 中显示的路径应相对于手机本身进行解释,不应更改。
列表 1. 一些非常基本的软件包元数据
[POLICYNAME] VPN public [POLICYDESCRIPTION] VPN public [POLICYVERSION] 1.1 [ISSUERNAME] Do not edit [CONTACTINFO] Do not edit
列表 2. 软件包清单和关于应用程序类型的描述。您可以将 0x1000597E 前面的“VPN Policy”字符串更改为其他内容。
:"VPN public" &EN %{"VPN public"} ; ; A VPN POLICY PACKAGE ; ; LANGUAGES ; - None (English only by default) ; INSTALLATION HEADER ; - Only one component name is needed ; to support English only ; - UID is the UID of the ; VPN Policy Installer application #{"VPN Policy"},(0x1000597E),1,0,1,TYPE = SA ; LIST OF FILES ; Policy file "VPN.pol"-"C:\System\Data\Security\Install\VPN.pol" ; Policy-information file ; - NOTE: The policy-information file ; MUST be the last file in this list! ; - FM (FILEMIME) passes the file to the ; respective MIME handler ; (in this case, the VPN Policy Installer ; application). "VPN.pin"-"C:\System\Data\Security\Install\VPN.pin", FM, "application/x-ipsec-policy-info" ; REQUIRED FILES ; - The VPN Policy Installer application (0x1000597E), 1, 0, 0, {"VPN Policy Installer"} [0x101F7961], 0, 0, 0, {"S60ProductID"}
列表 3 中显示的 VPN.pol 文件定义了如何连接到 VPN 以及使用哪个密钥进行身份验证的核心内容。
在使用 VPN.pol 之前,需要更改一些内容。主要更改是 Openswan 服务器的静态 IP 地址 (192.168.0.1) 和用于连接的密码。服务器的 IP 地址在配置文件中多次出现。为了避免对上面提到的虚拟 IP 地址产生任何混淆,此 IP 地址是 vserv 可以从 Internet 公开访问的地址。密码在最后一个字段中:KEY。数字是密钥的字符串长度,该密钥在空格后跟随。
如果 USE_XAUTH 设置为 true,则在建立 VPN 连接时,e61 会提示您输入用户名和密码以进行连接。这提供了额外的安全级别。如果 e61 被盗,小偷将必须知道您的用户名和密码才能访问您的 VPN。
Openswan 可以使用 PAM 或单独的配置文件来测试服务器上的用户名和密码(稍后会详细介绍)。
列表 3. VPN 策略:连接到哪里、如何连接以及如何告知是我的
SECURITY_FILE_VERSION: 3 [INFO] VPN [POLICY] sa ipsec_1 = { esp encrypt_alg 12 max_encrypt_bits 256 auth_alg 3 identity_remote 0.0.0.0/0 src_specific hard_lifetime_bytes 0 hard_lifetime_addtime 3600 hard_lifetime_usetime 3600 soft_lifetime_bytes 0 soft_lifetime_addtime 3600 soft_lifetime_usetime 3600 } remote 0.0.0.0 0.0.0.0 = { ipsec_1(192.168.0.1) } inbound = { } outbound = { } [IKE] ADDR: 192.168.0.1 255.255.255.255 MODE: Main SEND_NOTIFICATION: TRUE ID_TYPE: 11 FQDN: MobileGroup GROUP_DESCRIPTION_II: MODP_1536 USE_COMMIT: FALSE IPSEC_EXPIRE: FALSE SEND_CERT: FALSE INITIAL_CONTACT: FALSE RESPONDER_LIFETIME: TRUE REPLAY_STATUS: TRUE USE_INTERNAL_ADDR: FALSE USE_NAT_PROBE: FALSE ESP_UDP_PORT: 0 NAT_KEEPALIVE: 60 USE_XAUTH: TRUE USE_MODE_CFG: TRUE REKEYING_THRESHOLD: 90 PROPOSALS: 1 ENC_ALG: AES256-CBC AUTH_METHOD: PRE-SHARED HASH_ALG: SHA1 GROUP_DESCRIPTION: MODP_1536 GROUP_TYPE: DEFAULT LIFETIME_KBYTES: 0 LIFETIME_SECONDS: 28800 PRF: NONE PRESHARED_KEYS: FORMAT: STRING_FORMAT KEY: 3 foo
三个 Windows 可执行文件用于创建签名的 SIS 文件。DevCertRequest.exe 用于一次创建用于签名 SIS 文件的证书;然后使用 makesis.exe 和 signsis.exe 创建软件包并对其进行签名。最后两个命令是诺基亚网站免费提供的 S60 SDK 的一部分。所有这些 Windows 可执行文件都可以在 Wine 中运行,尽管您需要安装 MFC42.DLL 和 MSVCP60.dll 才能运行 DevCertRequest。
最好先获得证书;在 symbiansigned.com 免费注册,并下载 DevCertRequest 可执行文件。注册需要您的姓名、电子邮件地址、组织、地址和电话号码。
DevCertRequest 仅用于输入一些设置并生成密钥和证书签名请求(.csr 文件)。不幸的是,DevCertRequest 可执行文件实际上是一个安装程序,因此您必须安装此应用程序,然后执行它(图 1)。对于本文,使用了 DevCertRequest_30_10_2006_v2.0.exe。
在经历了安装 DevCertRequest 的所有痛苦之后,使用它包括五个简单的步骤,之后不再需要它。您给出新 csr 文件 (monkeyiq.csr) 的位置;新私钥 (monkeyiq-private-key.key) 的位置及其密码;您的国家、州和公司;手机的 IMEI(正如 DevCertRequest 告诉您的那样,在手机上按 *#06# 将显示它)以及您希望证书具有哪些功能;以及确认信息是否正确。
要创建证书本身,您必须返回 symbiansigned.com 并上传 csr 文件。首先登录,然后选择“我的 Symbian 签名”选项卡。在侧面板中,“开发者证书”选项具有“请求”子选项。在此页面的底部,您可以上传 csr 文件(图 2)。下一页允许您下载您的证书(图 3)。
makesis.exe 和 signsis.exe 文件可以从“Symbian OS 的 S60 平台”SDK 中提取,如列表 4 所示。
列表 4. 提取 makesis 和 signsis 可执行文件
$ mkdir /tmp/e61-sdk $ cd /tmp/e61-sdk $ unzip /tmp/S30_3rded_f0___S60-SDK-0548-3.0.zip $ unshield x data2.cab $ cd Epoc32/tools $ mkdir -p ~/e61tools $ cp makesis.exe signsis.exe ~/e61tools
有了证书 (monkeyiq.csr) 文件,您现在可以使用列表 5 中显示的代码滚动 sisx 文件。确保构成软件包的三个文件使用回车符加换行符组合来终止每行,而不是标准的 Linux 仅换行符;请参阅 unix2dos(1)。这三个文件分别是列表 3、2 和 1 中显示的 pol、pkg 和 pin 文件。
列表 5. 滚动签名的软件包文件
wine makesis.exe VPN.pkg VPN.sis wine signsis VPN.sis VPN.sisx monkeyiq.cer \ monkeyiq-private-key.key my-certificate-password
可以使用任何方法将 sisx 文件传输到 e61。我使用了蓝牙推送,在这种情况下,它可以直接从传入消息列表中安装到 e61 上。由于此 sisx 文件包含密码,因此最好使用有线方法将其传输到手机。
在 e61 中使用 mini-SD 卡并将 USB 连接线插入手机和 Linux 机器可能会在 e61 上为已安装的 SD 卡启动文件浏览器。将文件复制到方便的位置,例如 e61 上的 Documents/vpn,然后弹出或卸载 SD 卡以强制磁盘同步,然后再移除电缆(图 4)。
将 sisx 文件复制到 e61 存储卡后,e61 上的“菜单/办公/文件管理器”允许您导航到存储卡上的 VPN 目录。当您单击 VPN sisx 文件上的操纵杆时,手机会询问您是否要安装它。单击 sisx 文件后,您应该会看到如图 5 所示的内容。在检查了一些元数据后,您将看到如图 6 所示的不祥屏幕。由于您刚刚从一堆文本文件创建了软件包,并且您已经检查过它们是否有恶意内容,因此此安全警告实际上不应该成为一个大问题而忽略。
可以通过转到“菜单”→“工具”→“设置”→“连接”→“VPN”来准备 VPN sisx 文件以供使用。选择“VPN 接入点”和“选项”→“新建接入点”。将连接名称设置为易于记忆的名称,并设置策略名称和接入点。一个方便的接入点是 EasyWLAN。您可能还需要设置代理服务器地址和端口。能够通过 VPN 浏览 Internet 并访问 Intranet 服务器真是太好了。将所有 Web 流量定向到 VPN 还有一个额外的好处,即您正在使用的 Wi-Fi 热点无法记录您访问的网站。最后阶段如图 7 所示。
如果您已经使用 WEP 进行本地连接并希望继续这样做并能够在本地测试 VPN,请定义另一个 VPN 接入点,将其 Internet 接入点设置为您的 WEP 接入点。拥有第二个 VPN 配置意味着在本地连接时不会提示您输入 WEP 密钥。除了不必降低无线接入点的安全性之外,通过 WEP 进行 VPN 几乎没有什么好处。
软件包在 rpmseek.com 上针对 Fedora、Mandriva 和 SUSE Linux 显示。Debian.org 也列出了 Openswan 软件包。在 Fedora Linux 机器上,只需使用以下命令即可安装 Openswanyum install openswan。如前所述,我在本文中使用了 Fedora Linux 机器;其他发行版可能存在细微差别。
配置 Openswan 的两个主要区域是 /etc/ipsec.conf 文件和 /etc/ipsec.d 中的一些文件。主配置文件可以保持原样。一些可能感兴趣的设置是forwardcontrol=yes在 Openswan 启动和停止时打开和关闭数据包转发。另一个有趣的选项是 interfaces 设置,允许您控制哪个 IPSec 接口绑定到哪个网络接口——例如,interfaces="%defaultroute ipsec2=eth1 ipsec3=ppp1"。如果未指定 interfaces 参数,则 Openswan 在具有默认路由的网络接口上工作。对于 Internet VPN 连接,这很好。
ipsec.conf 文件中另一个可能派上用场的参数是设置plutodebug=all,如果您无法连接,请阅读您的 syslog 文件。
要描述 e61 的 Openswan 连接,请创建一个配置文件 /etc/ipsec.d/e61.conf,如列表 6 所示。pfs 设置用于完美前向保密。不幸的是,我一直未能成功使用此选项并从 e61 连接。如 e61 的 VPN 配置所示,我已将左值列为%defaultroute,因此 Openswan 将替换默认路由指向的网络接口的 IP 地址。由于默认路由指向 Internet,因此效果很好。我还使用了 vserv 的 DNS 名称作为 leftid;这应该是可选的。您需要在配置文件中将您的 DNS 名称替换为 monkeyiq.example.org。rightsourceip 是 e61 在通过 VPN 通信时将使用的虚拟 IP 地址。对于防火墙规则(稍后显示),我在 /etc/hosts 中为 e61 的主机名分配了 192.168.6.252。
列表 6. 允许 e61 连接的 Openswan 配置文件
conn e61 # Key exchange ike=aes256-sha1-modp1536 # Data exchange esp=aes256-sha1 # Authentication method PSK authby=secret auto=add keyingtries=3 # Modeconfig setting modecfgpull=yes pfs=no rekey=no leftid=@monkeyiq.example.org left=%defaultroute leftsubnet=192.168.0.1/0 leftrsasigkey=none leftmodecfgserver=yes leftxauthserver=yes rightrsasigkey=none right=%any rightxauthclient=yes rightmodecfgclient=yes rightsourceip=192.168.6.252 rightsubnet=192.168.6.252/32
在 VPN 策略的 KEY 字段中指定的相同私钥应放置在 /etc/ipsec.d/e61.secrets 文件中,如列表 7 所示。
列表 7. VPN 的私钥
: PSK "foo"
最后,VPN 策略中的 USE_XAUTH 选项需要 Openswan 为此连接查找用户名和密码。Openswan README.XAUTH 文件建议不要为此使用 PAM。可以使用 Apache 软件包中的 htpasswd 创建密码文件,如列表 8 所示。密码文件的示例如列表 9 所示。
列表 8. 使用 htpasswd 创建初始密码文件。-c 选项创建密码文件(如果它不存在)或替换它(如果它存在)。仅使用 -c 一次。确保首先设置您的 umask,因为某些发行版具有宽松的默认值。
umask 0027 htpasswd -b -c passwd ben your-password-here htpasswd -b passwd chidori her-password-here
在充当 IPSec 服务器的机器上尝试调试数据包日志可能有点困难。到达的加密数据包被解密并放置到网络接口上,使其看起来像是未经任何加密就到达了。数据包日志的一部分如列表 10 所示,显示了一个数据包,该数据包看起来像是来自 e61 的 IP 地址,但没有任何加密。日志进一步复杂化,因为 WEP 设置为 e61 提供与 VPN 相同的 IP 地址。对于来自 Internet 的流量,顶部两个数据包将具有随机 IP 地址,而不是 e61。为了更清楚地了解数据包数据,通过笔记本电脑将 e61 连接到 vserv 允许在笔记本电脑上进行适当的数据包侦听。笔记本电脑看不到列表 10 中的 imaps 数据包——只能看到 ESP 数据包的双向流。
列表 10. IPSec 服务器上 eth0 的部分流量日志
15:58:07.n IP ipsecserv > e61: ESP(spi=...), len... 15:58:07.n IP e61 > ipsecserv: ESP(spi=...), len... 15:58:07.n IP e61.57397 > ipsecserv.imaps: . ack...
列表 11 中显示的 iptables 命令提供了一个基本框架,允许 e61 从 Internet 连接到 IPSec 服务器。
数据包过滤规则非常简单。允许 Internet 安全关联和密钥管理协议 (ISAKMP) 数据包进入和退出服务器,并允许任何封装安全有效载荷 (ESP) 流量,假设 IPSec 服务器将负责筛选欺诈性数据包。VPN 流量本身通过 ESP 数据包发送;ISAKMP 在 VPN 会话启动时使用,这些数据包也被记录,以便 syslog 监视器可以提醒您注意奇怪的连接尝试或敲门。
由于非加密流量在 Openswan 完成处理后被放置在网络接口上,因此规则必须允许来自 e61 IP 地址的电子邮件和 squid 连接。我需要在这里添加这些规则,因为通常无法在连接到 Internet 的网络接口上发起任何连接。如果您也过滤了向外流量,则必须允许来自这些服务的发送到 e61 的数据包被发送到 Internet 网络接口(以便在发送到正确的 Internet 地址之前由 Openswan 加密)。
防火墙规则旨在与默认丢弃策略一起使用。可以添加或删除日志记录命令以帮助调试,方法是在 /var/log/messages 中搜索相关的日志前缀,以查看哪些数据包在防火墙可能丢弃它们之前正在移动。列表 12 中显示的脚本撤消了列表 11 所做的操作,以再次禁用远程访问。
您可能还想考虑在 e61 上使用单数据包授权 (SPA) 客户端,并将服务器设置为仅在 SPA 成功后才打开防火墙 ISAKMP 端口。有关 SPA 的更多信息,请参阅 Michael Rash 在 2007 年 4 月号 Linux Journal 中的“单数据包授权”文章。
列表 11. 在防火墙上打一个小洞。请注意,e61 在 /etc/hosts 中设置为 192.168.6.252。
iptables -X REMOTEVPN_INPUT 2>/dev/null iptables -X REMOTEVPN_OUTPUT 2>/dev/null iptables -N REMOTEVPN_INPUT iptables -N REMOTEVPN_OUTPUT iptables -I INPUT -j REMOTEVPN_INPUT iptables -I OUTPUT -j REMOTEVPN_OUTPUT iptables -A REMOTEVPN_INPUT -p esp -j ACCEPT iptables -A REMOTEVPN_INPUT -m udp -p udp \ --dport isakmp -j LOG \ --log-prefix "incoming-ipsec-key " iptables -A REMOTEVPN_INPUT --src e61 \ -p tcp --dport imaps -j LOG \ --log-prefix "incoming-imaps " iptables -A REMOTEVPN_INPUT -m udp -p udp \ --dport isakmp -j ACCEPT iptables -A REMOTEVPN_INPUT --src e61 -p tcp \ --dport imaps -j ACCEPT iptables -A REMOTEVPN_INPUT --src e61 -p tcp \ --dport smtp -j ACCEPT iptables -A REMOTEVPN_INPUT --src e61 -p tcp \ --dport squid -j ACCEPT iptables -A REMOTEVPN_INPUT --src e61 \ -j LOG --log-prefix "e61-strange " iptables -A REMOTEVPN_OUTPUT -p esp -j ACCEPT iptables -A REMOTEVPN_OUTPUT -m udp -p udp \ --sport isakmp -j LOG \ --log-prefix "outgoing-ipsec-key " iptables -A REMOTEVPN_OUTPUT -m udp -p udp \ --sport isakmp -j ACCEPT
对于使用一些公开可用的 Wi-Fi 热点,还存在一个复杂情况。根据您所在的全球位置,许多这些热点都遵循以下模式:当您尝试打开网站时,它们会将您重定向到其 Wi-Fi 登录页面,您向它们进行身份验证,然后您可以使用 Internet。如果您只是在 e61 上打开设置为使用 EasyWLAN 作为其 Internet 接入点的 VPN 接入点,则事情将无法正常工作。e61 将启动 Wi-Fi 连接并立即尝试发送数据以设置 VPN 连接。由于您必须先通过 Wi-Fi 热点进行身份验证,然后才能让流量通过,但随后事情将会崩溃。
解决此问题的一种方法是打开 Web 浏览器,并仅使用 EasyWLAN 进行直接连接,而无需任何 VPN。一旦您通过热点进行身份验证,请保持浏览器运行,并使用菜单键返回主菜单,然后打开电子邮件客户端。对于这次的接入点,请使用将其 Internet 接入点设置为 EasyWLAN 的 VPN。现有的 Wi-Fi 连接将被重用,VPN 将叠加在顶部。为了获得安全的 Web 浏览,您可以按住菜单键并返回浏览器来离开电子邮件程序。退出浏览器,仍在运行的电子邮件程序将保持 VPN 打开。再次启动浏览器,然后选择 VPN 作为您的接入点。
当然,如果您连接到的 Wi-Fi 网络允许无需此序言即可连接,则打开任何需要数据连接的应用程序都应该允许您选择新的 VPN 作为您的接入点。此外,如果 Wi-Fi 热点记住您的 MAC 地址并允许在后续连接中无需显式登录即可重新连接,则您可以直接在后续连接上启动 VPN。
一旦 VPN 连接到 vserv,e61 会提示您输入用户名和密码以用于 XAUTH 验证(图 8)。
在 XAUTH 验证之后,您应该能够使用 VPN 而不会注意到它。在这种情况下,我可以浏览 Internet,使用我的 LAN 代理服务器来获取数据(图 9)。
能够在 e61 VPN 策略中使用 DNS 名称对于那些无法廉价访问静态 IP 地址的人来说将是美好的。我仍在研究如何使用公钥密码学而不是本文中显示的预共享密钥进行连接。对于将单个 e61 连接到网络,使用足够大的预共享密钥仍然应该非常安全。
本文中的信息不保证正确、安全或适用于任何用途;请自行承担风险并酌情使用。
资源
Symbian 签名:symbiansigned.com
Unix HOWTO 上的 Symbian SDK:www.koeniglich.de/sdk2unix/symbian_sdk_on_unix.html
Symbian SDK:www.forum.nokia.com/main/resources/tools_and_sdks/index.html
诺基亚 VPN 客户端操作指南:pipip.de/index.php?section=other&sub=nokia_vpn_en
Wine 和 MFC42.DLL:bugs.winehq.org/show_bug.cgi?id=4461
Michael Rash 的“单数据包授权”(Linux Journal,2007 年 4 月):www.linuxjournal.com/article/9565
Ben Martin 从事文件系统工作已有十多年。他目前正在攻读博士学位,将语义文件系统与形式概念分析相结合,以改善人与文件系统之间的交互。