在AWS上通过pfSense搭建VPN

Netgate pfSense是亚马逊认证的的EC2防火墙和VPN设备之一。 一些人会遵循互联网上的几个流行指南来配置硬件pfSense设备,以便直接与AWS VPC(虚拟私有云)建立vpn连接。

本指南将介绍如何启动,管理和使用设备实例。对于只希望使用默认配置的OpenVPN或IPsec VPN的用户,在初始设置之后,对实例的修改和管理工作量会很少。

  • 启动一个实例
  • 实例配置
  • 使用远程访问IPsecVPN
  • 使用远程访问OpenVPN VPN
  • 常用平台/OpenVPN客户端上配置说明
  • 高级用法
  • 保护VPC中的专用网络
  • IPv6
  • 将本地pfSense设备连接至Netgate pfSense认证的防火墙和VPN设备

启动实例

在Amazon EC2管理控制台中,启动Netgate pfSense认证防火墙和VPN设备。

    1. 使用页面右上角的选项卡选择希望实例运行的区域。

      aws-***-appliance-1.jpg

    2. 通过单击EC2仪表板Create Instance 部分下的Launch Instance 按钮启动一个新实例。

      aws-***-appliance-2.jpg

    3. 在创建新实例菜单上选择 AWS Marketplace 。在搜索框中键入 Netgate pfSense certified,然后按回车键。

      aws-***-appliance-3.jpg

    4. 在搜索结果中的Netgate pfSense列表旁边单击 Select按钮。

      aws-***-appliance-4.jpg

    5. 通过单击所需类型旁边的复选框来选择要运行的实例类型。 单击Next: Configure Instance Details

      aws-***-appliance-10.jpg

    6. 进入Configure Instance Details 页面,选择网络和子网。 你可以选择展开 Advanced Details 部分,并在 User Data 字段中将参数设置为文本。可用的选项是:

      • 密码 – 通过像password = abcdefg这样的指令设置一个值,将管理帐户的密码设置为您在本例中指定的值 – abcdefg。 如果此处未设置任何值,则会分配一个随机密码,以使管理访问权限以避免使默认密码暴露于互联网。
      • mgmtnet – 通过像mgmtnet = 10.0.1.0 / 24这样的指令设置一个值,限制管理访问(http,https,ssh)。 这将导致实例上的防火墙规则(不是在亚马逊访问列表上,而是在Netgate设备自己的防火墙上)将实例的管理流量限制到指定的源网络。 默认行为是允许来自任何主机的管理。

这些指令可以通过将它们放在用户数据字段中的一行中并使用冒号分开来设置。 如果你想指定两个参数,你可以通过键入一个类似于下面的语句来做到这一点:

password=abcdefg:mgmtnet=10.0.1.0/24

在设置完这些参数后,单击 Next: Add Storage 。

注意

如果使用上面列出的密码参数设置密码,则当系统第一次引导时配置系统时,密码将通过未加密的HTTP请求由实例检索。 请求由本地局域网上的亚马逊网络服务运行的服务器完成,该服务器存储有关每个正在运行的实例的元数据。 实例的数据仅供该实例使用,但可用于从实例查询而不提供任何身份验证凭证。 建议您在实例出现后通过pfSense Web GUI更改管理员密码,如果您认为这是不可接受的安全风险。 或者您可以选择不设置密码,并设置随机密码。

aws-***-appliance-11.jpg

    1. 存储设备配置完成后,单击 Next: Tag Instance 。

      aws-***-appliance-12.jpg

    2. 可以在实例上设置一个标记,以便通过为 Name 标记输入一个值来区分此实例与您已启动的其他VM。设置任何所需的标签后,单击 Next: Configure Security Group 。

      aws-***-appliance-13.jpg

    3. 选择一个安全组以启动实例。推荐的安全组设置应至少允许以下流量:

      • TCP port 443 from 0.0.0.0/0 – HTTPS – 这是管理Web GUI侦听的端口。
      • TCP port 22 from 0.0.0.0/0 – SSH – 此端口可用于通过ssh客户端连接到命令提示符。
      • UDP port 1194 from 0.0.0.0/0 – OpenVPN – 默认配置的OpenVPN服务器绑定到此端口。
      • UDP port 500 from 0.0.0.0/0 – IPSec VPN的IKE
      • UDP port 4500 from 0.0.0.0/0 – 用于IPsec VPN的IPsec / NAT-T。

aws-***-appliance-14.jpg

如果您有一个包含此访问权限的现有安全组, 选择Select an existing security group, 然后选择要使用的组并单击 Continue(继续)。 否则,请选择Create a new security group, 并为此访问添加规则,方法是填写每个规则的表单并单击Add Rule 按钮。当所有规则都被添加后, 单击Review and Launch。

  1. 验证实例的详细信息并单击Launch

    aws-***-appliance-15.jpg

  2. 选择一个现有的密钥对或创建一个新的密钥对以连接到实例。不要选择Proceed Without a Key Pair。 点击复选框,表示您确认您有权访问所选私钥文件,然后单击Launch Instance

    aws-***-appliance-16.jpg

实例配置

实例启动后,您可以在EC2管理控制台的Instances页面上监视其状态。 EC2管理控制台将显示实例是否已启动并且可以访问,并且还将显示其当前公共IP地址和解析为公共IP地址的主机名。 您可以在EC2控制台中找到主机名和公共IP地址,方法是单击左侧的Instances标题,查找实例并检查其旁边的复选框,然后查看页面底部的详细信息。

aws-***-appliance-17.jpg

在上面的例子中,实例的主机名是 ec2-23-20-204-54.compute-1.amazonaws.com。主机名中包含的4个号码是公共IP地址 – 23.20.204.54。 您还可以使用流行的DNS查找工具(例如host,dig或nslookup)将主机名解析为其IP地址来获取IP地址。

注意

本指南例子和其他例子中使用的主机名和IP地址在编写时与一个测试实例相关联。 这个地址/主机名将不会与你用于访问实例的值相同,并且在本指南向公众公开时甚至不会与同一测试实例关联。

为了管理实例的配置,你也可以通过https或ssh进行连接。 要通过ssh连接,可以使用你在创建实例时选择的密钥对来连接到管理员帐户。 从Unix / Linux主机上的命令行,您可以使用类似的命令:ssh -i my_key_file admin@public_IP, 替换私钥文件和公共IP或主机名就可以。 在下面的示例中,密钥文件my_ec2_key用于连接到IP地址23.20.204.54。 请注意,当第一次登录你的实例时,实例的ssh密钥将不会缓存在本地计算机上,并且在询问你是否要继续连接时需要输入yes, 后续连接就不会再询问了。

aws-***-appliance-18.jpg

通过ssh接口可以实现一组有限的配置。 管理大部分配置或查看Netgate pfSense实例状态数据的首选方法是通过https web GUI。 要通过https连接,您需要在Web浏览器中输入https://包含您的实例的公有IP地址或主机名的URL。 例如,https://23.20.204.54。 很可能会收到浏览器警告,指出该网站的安全证书不可信。 这是因为实例为https通信使用自签名证书,点击该选项继续进入该网站。 应出现带有Netgate徽标的登录屏幕。

aws-***-appliance-19.jpg

用于登录的用户名是admin。 要使用的密码是在创建实例期间在用户数据中设置的值或随机密码。 如果你没有设置特定的密码,你可以通过两种不同的方式找出随机密码设置的值。 首先是使用您在创建实例时选择的密钥对通过ssh登录,并检查位于/etc/motd的文件的内容。 您可以通过从控制台菜单中选择选项8(Shell)来执行此操作,该选项在您登录并从shell执行cat /etc/motd时显示。 或者,您可以在EC2管理控制台中查看实例的系统日志。 在显示引导过程状态的消息之后,应该会显示一条消息,指出管理密码已更改为什么。

使用上面提到的任何一种方法寻找的信息如下所示:

***
***
*** Admin password changed to: abcdefg
***
***

在此示例中,密码已更改为abcdefg。

请注意,EC2管理控制台中的系统日志输出没有实时更新,可能需要几分钟才能显示。 最好通过在用户数据字段中传入值来显示设置密码,以便事先知道密码。 如果你想允许设置一个随机密码,你应该通过ssh进行连接,并在实例启动后找出密码更改的内容,而不会有任何延迟。

确定密码并将其输入登录表单后,就进入了pfSense Web GUI菜单。

使用远程访问IPsec VPN

当实例运行时,将为远程用户预先配置一个IPsec VPN。 为了使用它,你将需要在你的设备上配置IPsec VPN客户端。 手动配置Android或iOS(iPhone / iPod / iPad)移动客户端以建立IPsec VPN。

https://doc.pfsense.org/index.php/Mobile_IPsec_on_2.0

对于iOS客户端,可下载并安装一个配置文件,该配置文件将自动为该实例配置一个IPsec VPN。 可以通过访问实例上的/iphone_ipsec_profile.php页面来下载配置文件。 如果实例IP地址为23.20.204.54,则访问的正确URL将为https://23.20.204.54/iphone_ipsec_profile.php.。 在能够下载配置文件之前,您需要输入用户名(admin)和密码,才能通过Web界面进行身份验证。

应在打开页面时自动下载并保存配置文件。 如果在iOS设备上的网络浏览器中访问该页面,设备应自动启动设置应用程序并尝试安装新的配置文件。 如果配置文件被下载到另一个非iOS设备,它可以通过电子邮件作为附件发送。 如果在iOS电子邮件客户端中打开附件,则也会打开设置应用程序新配置文件安装。

aws-***-appliance-20.jpg

将显示正在安装的配置文件的名称和说明。点击安装按钮。将显示警告消息,指示配置文件未签名。点击立即安装以继续。

aws-***-appliance-21.jpg

输入您的iOS设备密码(当你将设备从睡眠中唤醒时输入的密码)和访问IPsec VPN密码(您为访问Web GUI而输入的密码),并提示安装配置文件。 当屏幕显示配置文件已安装时,点击完成。

aws-***-appliance-22.jpg

安装配置文件后,可以在“设置”应用程序中启用VPN。 主设置页面下会有一个名为VPN的标题。 如果设备上配置了多个VPN,请点击VPN标题,选择新安装的配置文件。 它旁边会有一个复选标记。 在页面顶部会有一个开/关开关来启用VPN。 如果这是唯一配置的VPN,则启用VPN的开关将位于主设置页面上的VPN标题旁边。 点击开关启用VPN。 应该提示您输入用户名和密码。 用户名(admin)应该已经填入。输入密码并点击确定。 显示欢迎消息。 点击确定,你就可以使用VPN了。

使用远程访问OpenVPN VPN

首次启动实例时,将自动配置用于远程用户的OpenVPN VPN。 为了使用它,您需要在设备上安装OpenVPN客户端应用程序,并且您需要导入指定如何连接到实例的配置。

OpenVPN配置可以通过访问实例上的/openVPN_connect_profile.php页面来下载。 如果实例IP地址为23.30.204.54,则访问的正确URL将为https://23.20.204.54/iphone_ipsec_profile.php.。 在被允许下载配置之前,您需要输入用户名(admin)和密码来验证Web界面。

应在打开页面时自动下载并保存配置文件。它保存的文件应该被导入到你希望连接的设备上的OpenVPN客户端。

在一些常用平台/客户端上配置OpenVPN的提示

iOS上的OpenVPN 连接 App(iPhone / iPad / iPod)

iOS版本的OpenVPN 连接 App允许您通过打开电子邮件附件来导入OpenVPN配置文件。 将该配置保存到名为remote-access-VPN.ovpn的文件中,并将其发送到iOS设备配置为检索邮件的电子邮件帐户。 打开电子邮件并触摸附件打开它。 作为可用选项之一,您将在OpenVPN中获得Open。 触摸OpenVPN图标以选择该选项。 然后,OpenVPN 连接应用程序应该打开并列出一个标题下的新配置文件可用….单击带有+号的绿色球来导入配置文件。 输入用户名(admin)和密码,并将On / Off开关改为On。

Android上的OpenVPN 连接 App

Android版本的OpenVPN 连接 App允许您从SD卡导入OpenVPN配置文件。 将配置文件保存到SD卡。 启动OpenVPN 连接应用程序。 从菜单中选择导入,然后从SD卡导入配置文件。 浏览到配置文件的位置并选择它。 输入用户名(admin)和密码以连接到VPN。

Windows 上的OpenVPN 连接客户端

Windows上的OpenVPN 连接客户端允许您从本地磁盘导入OpenVPN配置文件。 将文件保存在您的系统上。 单击连接配置文件右侧的+符号。 选择本地文件,然后单击导入按钮。 在文件浏览器窗口中找到要导入的配置文件,然后单击打开。 具有新配置文件名称的框现在应该出现在“连接配置文件”下。 点击该框并输入用户名(admin)和密码以连接到VPN。

高级用法

保护VPC中的专用网络

Netgate设备可以用作VPC子网的防火墙。 但这需要比使用实例来托管远程访问***更多的手动配置。

IPv6

Amazon EC2不支持本地IPv6连接。 因此,如果不进行额外的手动配置,就无法通过使用Netgate pfSense认证的防火墙和VPN设备实例建立的VPN隧道从客户端设备向IPv6 Internet发送流量。 应该可以手动在实例和IPv6隧道代理(Hurricane Electric,Sixxs等)之间配置隧道。 此配置尚未经过测试,并且没有技术支持。 未来版本中可能提供受支持的自动IPv6隧道配置。

注意:关于VPN客户端和IPv6的重要说明

如果您使用VPN的主要原因是在无线和不可信网络上加密流量,则在连接到支持IPv6路由的局域网时应该格外小心。这里有一些更详细的原因…

  • 在使用Netgate pfSense认证的防火墙和VPN设备测试不同的VPN配置期间,有人注意到,当客户端连接到提供本机的网络时,测试的一些VPN客户端直接向VPN隧道外的Internet发送IPv6流量IPv6连接。每个经过测试的IPsec客户端和某些版本的OpenVPN客户端都会观察到这种情况。使用IPsec客户端的这种行为的原因很可能是IPsec客户端似乎不支持通过单个隧道发送混合的IPv4和IPv6流量。因此,如果通过IPv4建立到远程端点的IPsec隧道,则IPv4通信将通过隧道发送,而IPv6不会。如果隧道是通过IPv6建立的,则会发生相反的行为。对于OpenVPN隧道来说,一些客户端支持发送混合流量,但不是全部。这是否与给定的客户端一起工作将取决于客户端的特定实现,平台和版本。
  • 许多客户端应用程序(例如Web浏览器)使用DNS来检查主机名是否具有IPv4或IPv6地址(或与之相关联)。 一旦确定存在哪些IP地址类型,应用可以决定尝试连接到哪个地址类型。 例如,它可能会尝试同时连接到这两个设备,并继续先取得任何一个成功,或者它可能会首先尝试通过IPv4进行连接,并且只会尝试IPv6,如果该设备失败,或者它可能首先尝试通过IPv6进行连接,并且仅尝试IPv4 失败了。 在特定应用决定在连接到VPN时连接到IPv6主机的情况下,IPv6流量很可能会直接进入互联网而不是通过隧道。
  • 应用程序决定发送流量的IP版本以及VPN客户端如何管理该流量的路由的行为取决于应用程序和设备上的VPN客户端的行为。 此行为受应用程序和VPN客户端开发人员的控制。 对VPN端点的这一点没有太多的控制。 对于IPsec,没有配置可以消除此问题。 对于OpenVPN,自动配置的OpenVPN远程访问VPN会尝试推送一个配置,以使IPv6流量通过OpenVPN隧道进行路由(最终流量会被黑掉,IPv6将无法工作,但它可以确保流量不会直接未加密地发送到互联网)。 并不是所有的OpenVPN客户端都能接受或正确地使用这种配置,所以它不能被认为是每种情况下的有效保护措施。
  • 目前大多数公共局域网中不支持IPv6路由,因此这种情况所带来的风险对大多数用户来说可能是可以容忍的。 建议在连接到任何网络时,特别是在支持IPv6的情况下,意识到存在问题的可能性并小心处理。 如果你想确定你当前连接的网络是否支持IPv6路由,则可以尝试导航到可用于测试IPv6连接的热门站点之一,例如http://test-ipv6.com,同时连接到VPN。 如果测试显示具有IPv6连接,则意味着你的IPv6流量正在直接路由到Internet。 在确定是否是这种情况后,你就可以评估是否希望保持以IPv6方式连接到网络。

将本地pfSense设备连接至Netgate pfSense认证的防火墙和VPN设备

除了将远程设备连接为客户端,运行pfSense作为防火墙/路由器的设备可以作为对等连接到Netgate设备。详见:http://doc.pfsense.org/index.php/OpenVPN_Site-to-Site_(Shared_Key,_2.0)。

在实施文档中详述的配置修改时,应将AWS上的Netgate设备实例用作连接的“服务器”端,将本地pfSense设备当作“客户端”。 你还需要确保你使用的是独特的端口。 默认的远程访问OpenVPN服务器配置为使用UDP端口1194。建议如果要添加站点到站点隧道,则应使用1195到2000之间的端口。无论决定使用哪个端口,都需要确保端口在Netgate设备实例的防火墙规则和EC2管理控制台的安全组中均处于打开状态。

如果你希望将来自家庭/办公网络的所有流量通过OpenVPN隧道路由到你的Netgate设备实例,则需要将此语句添加到家庭/办公室pfSense设备上的OpenVPN客户端高级选项:

redirect-gateway def1;

这会更改默认路由设置,当它建立时,将通过OpenVPN隧道发送家庭/办公网络上的所有本地始发流量。 如果你使用此配置通过OpenVPN隧道从本地网络发送所有流量,则还需要在AWS上的Netgate设备实例上建立NAT,以处理从家庭/办公网络到Internet的流量。 这可以通过将家庭/办公网络的CIDR掩码添加到名为Networks_to_NAT的预配置别名来完成。 别名在防火墙>别名下进行设置,然后单击Networks_to_NAT右侧的编辑图标进行添加。 将新的网络地址和掩码添加到网络列表中,然后单击保存按钮。 然后点击应用更改按钮。 你还需要使用与用于添加家庭/办公网络相同的过程将用于隧道端点(IPv4隧道网络)的网络添加到Networks_to_NAT别名中。

将多个pfSense网关连接到Netgate设备

多个家庭/办公网络可以连接到单个Netgate设备实例。 这可以用来允许不同办公地点的客户进行通信,而不需要在每个单独位置之间建立隧道。 它也可以用作在一个地方对来往互联网的流量应用策略,并使它们在多个地点生效。

每个站点都需要具备上述说明,用于连接重复的单个设备,以在Netgate设备实例上添加OpenVPN服务器,并在本地pfSense设备上添加OpenVPN客户端。 每个配置的OpenVPN服务器都必须使用唯一的端口和唯一的IPv4隧道网络。 建议在为Netgate设备中的站点添加OpenVPN服务器时,在描述字段中使用唯一标识来说明以此方式连接的每个位置的名称。