云上的网络

探索 IBM SmartCloud Enterprise 上用于网络的工具和概念

随作者一起,了解 IBM® SmartCloud Enterprise 网络的重要概念,包括 VLAN(虚拟局域网)、VPN(虚拟专网)以及各种协议层。作者还解释了如何使用 OpenSSH、OpenVPN 和代理服务器等工具建立不同的网络拓扑,并解决常见组织场景内的连接问题,介绍了一些安全问题和实践。

Alex Amies, 高级软件工程师, IBM

/developerworks/i/p-aamies.jpgAlex Amies 是 IBM GTS 中国开发实验室的一名高级软件工程师。他目前是致力于设计 IBM Smart Business Development and Test on the IBM Cloud 的一名架构师。此前他在 IBM 其他部门担任过云计算和安全性产品方面的架构师和开发人员。



Chun Feng Wu, 软件工程师, IBM

Chun Feng Wu 在云计算领域是一位 IBM Certified Solution Advisor 和一位 IBM Certified Solution Architect。他致力于 IBM 公共云 SmartCloud Enterprise,并且现在正专注于 IBM 托管云 SmartCloud Enterprise Plus。



Guang Cai Wang, 咨询软件工程师, IBM

Guang Cai Wang 是 IBM 的一名咨询软件工程师,而且还是 IBM SmartCloud Enterprise 团队的首席开发员。



Mihai Criveti, IT 架构师, IBM

/developerworks/i/p-mcriveti.jpgMihai Criveti 是一名主要关注云计算和虚拟化的 IT 架构师。他的兴趣包括云计算、虚拟化、企业架构、SOA、中间件、数字取证以及 UNIX 系统。



2012 年 8 月 06 日

云上的网络代表着两极性方面的问题:云上的网络是实现云计算的基本元素之一,但也是导致云计算用户受威胁的因素之一。

网络性能的下降和网络不稳定性都可能极大地影响云资源的使用;因此,相对孤立或专为处理网络中断而设计的应用程序在云中运行会有一些优势。

从不同的角度来看,可以将网络资源虚拟化,并像其他资源一样在云计算中使用它们。

云提供商或云使用者会负责不同层次的网络系统,具体情况取决于云的类型。下表总结了一些典型场景:

表 1. 管理网络层
OSI 层协议IaaSPaaSSaaS
7 应用层HTTP、FTP、NFS 和 SMTP使用者使用者提供商
6 表示层SSL 和 TLS使用者提供商提供商
5 会话层TCP使用者提供商提供商
4 传输层TCP使用者提供商提供商
3 网络层IP 和 IPSec使用者提供商提供商
2 数据链路层以太网和光纤通道提供商提供商提供商
1 物理层铜线、光纤提供商提供商提供商

上表是实践中所存在的多种模型的简化。然而,从表中可明显看出,与 PaaS 和 SaaS 云相比,IaaS 在网络拓扑和服务方面为云使用者提供的灵活性要多得多,但可能要以管理那些提供灵活性的工具为代价。

让我们通过具有不同要求的不同业务场景,查看一些网络工具的优点和缺点。

网络工具如何在各种场景中提供帮助

图 1 描述了一个复合 Web 应用程序的典型网络拓扑。它包含防火墙配置、VLAN 设置、用于负载平衡的公共/私有 IP 配置,并访问业务合作伙伴的内网络。

图 1. 复合 Web 应用程序的网络拓扑
复合 Web 应用程序的网络拓扑

让我们来看一下可以如何在各种业务云组织场景中使用网络工具。

在生产系统中(使用防火墙):

  • 也可以使用代理,但目的通常是实现负载均衡,而不是保障安全性。
  • 管理员可以通过 SSH 通道或 SOCKS 代理访问后端服务器。
  • 需要使用防火墙规则,以便允许防火墙内的服务器访问 Internet 完成安全更新、许可证激活和其他任务,不需要通过 Internet 看见内部构件 。

对于开发场景(涉及 VPN 的使用):

  • 可能需要提供对企业的反向访问。
  • 轻量级的设置是必需的,因为可能没有网络专家提供帮助。
  • 可以在笔记本电脑上使用一个提供 DHCP 的 VPN 服务器,以便允许从云进行访问。

在企业级:

  • 可能必须通过站点到站点的 VPN 实现对企业的一般访问。

编者按:参考资料 部分包含了介绍企业级云网络及工具的其他资源,其中包括 向用户交付云计算网络控制


工具以及它们所解决的任务

以下是用于通过网络管理云服务交付的有用工具的列表。


通过 IP 地址连接到 VM

在云计算中,面临的首要任务之一就是如何连接到虚拟机。在创建一个虚拟机时有几个选项:系统生成的、保留的和虚拟局域网 (VLAN)。

系统生成的 IP 地址类似于动态主机控制协议 (DHCP) 分配的地址。它们实际上是静态 IP 地址,但由 IaaS 云分配。如果您只需要一个可以登录并使用的虚拟机,那么这是最简单的选项。

保留的 IP 地址是为虚拟机单独配置和管理的地址。如果您想为一个虚拟机分配多个 IP 地址,保留的 IP 地址就很有用。

我们会在本文稍后介绍 VLAN。


管理虚拟网络

在处理虚拟机系统和考虑网络安全时,您需要管理网络。网络资源可能是虚拟化的,就像其他云资源一样。为了做到这一点,云计算使用虚拟交换机将物理网络划分成逻辑分区。这个概念如图 2 所示。

图 2. 云中的物理和虚拟网络
云中的物理和虚拟网络

虚拟局域网 (VLAN) 可以用作企业专网的延伸。在云中的 VLAN 使用私有 IP 地址来限制连接到它的虚拟机的网络可见性。Internet Assigned Numbers Authority (IANA) 为专用网络保留了以下三块 IP 地址空间:

  • 10.0.0.0 - 10.255.255.255(10/8 前缀)
  • 172.16.0.0 - 172.31.255.255(172.16/12 前缀)
  • 192.168.0.0 - 192.168.255.255(192.168/16 前缀)

连接到一个 VLAN 有两种方式,您既可以通过一个加密的虚拟专网 (VPN) 进行连接,也可以在连接到另一个网络(包括 Internet)双宿主虚拟机上进行路由。

虚拟机管理程序可以与多个虚拟机共享一个物理网络接口。每个虚拟机都有一个或多个虚拟网络接口。虚拟机管理程序可以通过三种方式做到这一点:

  • 桥接
  • 路由
  • 网络地址转换 (NAT)

桥接通常是默认的模式。在这种模式下,虚拟机管理程序在数据链路层(OSI 第 2 层;表 1)上工作,使虚拟网络接口在以太网级别上对外部可见。

在路由模式中,虚拟机管理程序在网络层 (#3) 工作,使得虚拟网络接口在 IP 层上对外部可见。

在网络地址转换中,虚拟网络接口对外部是不可见的。相反,它使虚拟机能够将网络数据向外发送到 Internet,但虚拟机在 Internet 上是不可见的。

网络地址转换通常将配置了私有 IP 地址的虚拟网络接口隐藏在使用公共 IP 地址的主机或路由器后面。网络地址转换软件可以根据路由表中的信息来修改网络数据包中的 IP 地址信息。数据包中的校验值也必须修改。

网络地址转换可以用于将比虚拟机数量更多的服务器放在网络上。它可以通过端口转换做到这一点。这是 IPv6 仍然未被在广泛使用的原因之一:即使计算机数量超过了 IP 地址的数量,也可以通过一些操作来共享这些 IP 地址。

例如,假设您有一个路由器和分别负责 HTTP、FTP 和电子邮件的三台服务器。您可以向路由器分配一个公共 IP 地址,并将私有 IP 地址分配给 HTTP、FTP 和电子邮件服务器,然后转发传入流量,如表 2 所示。

表 2. 网络地址转换 (NAT) 示例
公共 IP端口私有 IP
9.0.0.1(路由器)9.0.0.1(路由器)9.0.0.1(路由器)
80, 4432125
192.168.0.1(HTTP 服务器)192.168.0.2(FTP 服务器)192.168.0.3(电子邮件服务器)

使用多个 IP 地址

IBM SmartCloud Enterprise 允许您独立管理 IP 地址,并将它们分配给虚拟机,其中可能包括将多个 IP 地址分配给一个虚拟机。

为什么要这么做?您可能需要更高的可用性,或者希望将不同的网络区域连接到防火墙或 VPN。developerWorks 技巧 Span virtual local area networks 中介绍了这些步骤。


使用一个防火墙保护多个虚拟机

个人防火墙是与要保护的资源安装在同一台服务器上的防火墙。这是云计算的一个必不可少的工具。大多数现代操作系统,包括 IBM SmartCloud Enterprise 上的所有镜像,都打包了个人防火墙。在 Linux® 虚拟机上,个人防火墙是 iptables;在 Windows® 上,个人防火墙是一个 Microsoft® 解决方案。

在 IBM SmartCloud Enterprise 上,在虚拟机管理程序和它所管理的虚拟机之间也有一个防火墙。

防火墙规则为网络数据包和目标指定了一套标准。当传入一个网络数据包时,就会检查每个规则。如果数据包不符合某条规则标准,则检查下一条规则。

在 SUSE 计算机上,可以使用 YAST 管理实用工具来添加防火墙规则。例如,可以允许任何外部地址访问端口 50030:

  1. 从命令行启动 YAST,以 root 用户身份输入 yast,使用 Tab 键并按下 Enter 键导航至 Security and Users > Firewall。类似于图 3 的一个屏幕会打开。
    图 3. YAST 防火墙管理实用工具
    YAST 防火墙管理实用工具
  2. 导航至 Custom Rules 并单击 Enter
  3. 导航至 Add 并单击 Enter
  4. 在 Source Network 输入 0/0,这表示任意源计算机,在 port 输入 50030,即您感兴趣的端口。参见图 4。
    图 4. 在 YAST 中的自定义防火墙规则
    在 YAST 中的自定义防火墙规则
  5. 单击 AddNextFinish。不需要手动重启。YAST 会负责重启。

在 Red Hat 镜像上,可以使用 iptables 命令来管理防火墙规则。基本形式的 iptables 命令如下:

# iptables [-t table] -[AD] chain rule-specification [options]

与防火墙规则相关的操作包括 ACCEPT, DROP, QUEUERETURN。如果您不想接受网络数据包,那么您应该指定一个 DROP 操作。在 iptables 命令中,A 追加了一条规则,而 D 则删除了一条规则。

有三个防火墙表。默认表的名称是 filter。该表包含三条链:inputforwardoutputinput 链用于传入本地套接字的数据包,forward 链用于被路由的数据包,而 output 链则用于本地生成的数据包。

例如,要允许任意源的端口 80(默认 HTTP 端口)上的网络数据包,可以使用命令 # /sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT

这会向 filter 表的 input 链添加一条规则,允许对端口 80 上的 TCP 数据包使用 ACCEPT 操作。-p 参数指定了协议,在本例中是 tcp--dport 80 选项是目标端口,在本例中是 80。-j (jump) 选项是目标,在本例中是 ACCEPT

只在需要防火墙规则时才保留它们,这可能是一个很好的实践。命令行形式是该实践的理想选择。但是,通常您希望永久保留规则,包括在下一次重新启动实例后仍然保留。可以编辑文件 /etc/sysconfig/iptables 来实现该要求。一个典型的 iptables 文件看起来如下所示:

*filter
:INPUT DROP [67:14849]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [346:34696]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
COMMIT

该代码为 filter 表指定了规则。所有从端口 67 到 14849 传入的数据包都被丢弃。不允许转发,端口 346 到 34696 上的所有传出数据包允许转发,而端口 22 (SSH) 上传入的数据包也允许转发。在编辑并保存该文件后,使用命令 # /sbin/service iptables restart 启动或重新启动 iptables 服务。

如果使用 iptables 命令对文件进行了修改,请使用命令 # /sbin/service iptables save 保存修改。

使用以下命令检查防火墙的状态:

# /sbin/service iptables status

使用虚拟机管理程序防火墙规则可以获得一些性能优势。然而,您可以不能像管理本地防火墙规则那样动态地管理它们,您只能对您个人或社区级的可见性镜像执行管理。

您可以在创建实例时使用 IBM SmartCloud Enterprise 上的 parameters.xml 文件来设置虚拟机管理程序的防火墙规则。您可以在镜像的资产目录条目中找到这个 XML 文件。

除了防火墙所驻留的服务器以外,Linux 还可以使用防火墙来保护其他服务器。其实,这是首选的配置,因为它提供了另外一层隔离。

为了保护服务器,您首先需要将避免受到来自 Internet 的攻击的服务器放在某个 VLAN 上,以便隔离它们。在防火墙虚拟机上添加两个 IP 地址。最后,在 iptables 中配置 Internet 和 VLAN 之间的转发规则。参见图 5。

图 5. 防火墙保护 VLAN 的示意图
防火墙保护 VLAN 的示意图

在图 5 中,虚拟机 VM1 直接连接到 Internet。防火墙 VM2 有两个 IP 地址:

  • 一个可以访问 Internet
  • 一个在私有 VLAN 上

虚拟机 VM3 只有一个 IP 地址,只能在 VLAN 上访问。防火墙规则允许来自 Internet 的入站访问,并将防火墙的 IP 地址映射到 VM3 的 IP 的特定端口,只允许该端口上的来自 Internet 的入站访问。

例如,如果这是一个 Web 服务器,用户试图在端口 80 上访问防火墙的 IP 地址,则会将请求转发到 VM3 上的 Web 服务器。VM3 上的其他端口不开放。

另一个防火墙规则允许进行 VM4 的出站访问。这可以通过针对一个单独的 TCP 连接动态地使用端口来实现。例如,如果 VM4 试图打开一个连接到 Internet 的 TCP 连接,那么防火墙可以找到一个可用的端口并修改 TCP 数据包,以包含此端口和防火墙的自己的 IP 地址。当它接收到从 Internet 返回的响应 VM4 请求的数据包时,它会执行反向映射。这样,虚拟机 VM4 就能够打开 Internet 连接,而且在 Internet 上是不可见的。


使用 SSH 或 PuTTY 对用户和服务器进行身份验证

如前所述,SSH 是云计算中的基本工具;为了解决云计算中的许多实际问题,有必要了解它。SSH 旨在成为 telnet 的一个安全替代方案,但现在许多应用程序中也以编程方式普遍使用它。

SSH 的两个主要版本是 SSH-1 和 SSH-2。原始版本 SSH-1 已被 SSH-2 取代。SSH-2 是由 Internet Engineering Task Force 作为一个标准开发的,在 2006 年发布。最流行的 SSH 实现是 OpenSSH 开源项目。在 Windows 上,PuTTY 是最流行的客户端。有关 PuTTY 的基本使用的信息,请参阅 参考资料 部分。

SSH 在必要时会使用公共密钥加密对远程计算机和用户进行身份验证。除了远程登录之外,SSH 还可以用于通道、转发、X11 连接,以及文件传输。可以使用 SCP(安全复制)协议和 SFTP 复制文件,两者都使用 SSH。

试想一下以下这个常见场景:在云上创建两个实例,server1 和 server2,您希望打开一个从 server1 到 server2 的 SSH 会话。在您的本地 PC 上应该已经有您的私钥,所以您需要把它复制到 server1。您可以用 WinSCP 完成这项操作。Server2 上已经被配置为接受这一密钥,因为它是使用在授权密钥列表中的公共密钥创建的。请使用以下这些命令:

> chmod 0700 mykey
> ssh -i mykey server2

其中 mykey 是私钥的名称。您应该生成自己的私钥,该私钥对其他用户是不可见的。chmod 命令可以完成这项操作。如果不这样做,ssh 就会报错,并且可能会忽略密钥。-i 选项使用刚刚复制到 SSH 会话中的密钥。默认选项是 ~/.ssh/id_rsaserver2 参数是主机名称或 server2 的 IP 地址。请确保您在目录 .ssh 上有适当的权限。如果有些文件是 root 用户所拥有的,那么请使用 chown 命令将它们修改为 idcuser。

为了生成一个新的 SSH 密钥,可以使用 ssh-keygen 命令。例如,> ssh-keygen -t rsa -P 'My Passphrase' -f ~/.ssh/mykey

这会生成一个 RSA 类型(-t 标志),其密码为 'My Passphrase'-P 标志),将私钥放在文件 ~/.ssh/mykey(-f 标志)中,并将公钥放在文件 ~/.ssh/mykey.pub 中。如果您没有使用 -f 选项,则会将私钥写入 ~/.ssh/identity。授权的密钥包含在文件 ~/.ssh/authorized_keys 中。要将新的公钥添加到授权密钥文件,请使用以下命令追加它:

> cat mykey.pub >> ~/.ssh/authorized_keys

IBM SmartCloud Enterprise 生成的 SSH 密钥的格式与 OpenSSH 是兼容的。您也可以使用 PuTTYgen 将这些格式转换为 PuTTY 格式。如果丢失了原始密钥,还可以将 PuTTYgen 转换回 OpenSSH 格式。为此,请转到 Conversions > Export OpenSSH Key 菜单并保存文件。

PuTTYgen 也可以生成密钥。如果您选择不使用云生成的密钥,也可以将已生成的公共 SSH 密钥上传到 SmartCloud Enterprise。

在 Linux 系统上,IBM SmartCloud Enterprise 上的 SSH 配置文件是 /etc/ssh/ssh_config and /etc/ssh/sshd_config。AllowedUsers 设置是可能需要修改的一个设置。该参数的值是以空格隔开的用户名模式列表。例如,AllowUsers idcuser webadmin

要启动 SSH 服务器 (sshd),请使用命令 # /etc/init.d/sshd start;要重新启动,请使用命令 # /etc/init.d/sshd restart

在某些情况下,您可能想在 SSH 命令中包含用户名,尤其是在脚本中。为了做到这一点,请使用 $ ssh -i .ssh/key-file idcuser@host 形式:

  • @ 符号通过主机名称或 IP 地址来界定用户名。
  • -v 选项(详细)打印出额外的信息,这些信息在调试问题时会很有用。

对于 IBM SmartCloud Enterprise 中的大多数镜像,默认情况下,SSH 服务器会将信息和错误消息发送到文件 /var/log/secure。

为 SSH 密钥添加一个密码,以便保护它们,这是一个很好的实践。这种实践的问题是,需要访问密钥的脚本和程序没有密码。ssh-agent 工具是 OpenSSH 分布的一部分,旨在解决这个问题。它能够以类似的方式自动输入密码,存储文件 (stash file) 可以让 Web 服务器打开 X.509 证书。

有一些工具通过 SSH 建立通道。例如,NX 远程桌面技术通过 SSH 建立通道。还有几个文件传输工具也可以通过 SSH 建立通道。

Secure Copy 也称为 SCP,是一个协议,也是一个安全传输文件的程序。它基于通过 SSH 建立通道的 BSD 远程复制 (RCP) 命令。由于使用了 SSH,默认情况下它在端口 22 上运行。要在 Linux 上使用 SCP,请使用该命令:

# scp -i identity_file host:sourcefile destinationfile

该命令使用私钥文件 identity_file 从计算机主机将 sourcefile 文件复制到本地计算机上的文件 destinationfile。

Windows WinSCP 程序默认情况下实际上在 SFTP(安全的 FTP)上工作,但也可以使用 SCP。

使用 SSH 进行端口转发

使用 SSH 进行端口转发是一个进程,其中:

  1. 数据包的地址和端口被转换为一个新的目标。
  2. 数据包通过 SSH 连接进行传输,在 SSH 连接中,目标是可访问的。

它允许用户通过 SSH 连接用通道封装另一个协议。若使用 OpenSSH,可以通过 sshd 做到这一点。如果被通道封装的协议是不安全的,或目标地址和端口的组合对源是不可见的,这可能很有用。

使用被通道封装的协议的客户端必须能够为此指定一个非标准端口才能工作。这个概念是,建立一个 SSH 会话连接到您的服务器,然后在客户机上指定从哪个端口转发连接。

SSH 也可以转发到其他服务器。端口转发对于解决云、工作站与公司内部的 IT 资源之间的连接问题来说很重要。若您需要灵活而又安全地访问少量管理任务(如将文件移动到安全的地点),端口转发尤为重要。

很好地了解工具,可以让您避免编写和维护这些管理任务的自定义代码。本节提供了一个 VNC 示例。

在云应用程序中,经常需要连接到远程 Linux 桌面。由于远程计算机在 Internet 上,所以您应该避免将不安全的网络流量发送给它们,同时避免在 Internet 上开放不安全的服务,如 VNC。

图 6 显示了一个涉及的网络连接的示意图。

图 6. VNC 流量的 SSH 转发的示意图
VNC 流量的 SSH 转发的示意图

在虚拟机的端口 5901 上运行的 VNC 服务器连接到 X11 Windows 服务,而这个 X11 服务又连接 Linux 桌面。笔记本电脑或工作站使用 SSH 客户端创建一个带通道的连接,连接到在虚拟机上运行的 SSH 服务器。在虚拟机上运行的防火墙阻止在端口 22 上运行除 SSH 流量以外的任何流量访问虚拟机。通道允许在笔记本电脑上运行的 VNC 客户端通过端口 22 上的防火墙连接到 VNC 服务器。

创建并使用 SSH 通道

  1. 切换到 root 目录并转到目录 /etc/ssh and edit file sshd_config:
    AllowTcpForwarding yes
  2. 以 root 用户身份重新启动 ssh 服务器:
    # /etc/init.d/sshd restart
    Stopping sshd:                            [  OK  ]
    Starting sshd:                            [  OK  ]
  3. 如果 VNC 尚未运行,请将 VNC 启动为 idcuser:
    $ /usr/bin/vncserver
    ...
    New 'vhost0270:1 (idcuser)' desktop is vhost0270:1
    
    Creating default startup script /home/idcuser/.vnc/xstartup
    Starting applications specified in /home/idcuser/.vnc/xstartup
    Log file is /home/idcuser/.vnc/vhost0270:1.log
  4. 在看到提示时输入密码,对于 “仅查看” 密码,可以回答 no 。该命令打印出所显示的信息,包括日志文件的名称。
  5. 第一次运行 vncserver 时,它会创建配置文件 ~idcuser/.vnc/xstartup。您需要修改该文件中的两个设置,以便能够使用普通桌面进行登录。在文件 ~idcuser/.vnc/xstartup 中取消以下两行的注释:
    unset SESSION_MANAGER
    exec /etc/X11/xinit/xinitrc
  6. 如果您使用 SUSE,那么有可能不会在 xstartup 中发现这两行。停止并再次启动 VNC 会话:
    $ /usr/bin/vncserver -kill :1
    $ /usr/bin/vncserver

    在本例中,在第一个命令中的显示 :1 必须与之前启动 vncserver 时创建的显示相匹配。

  7. 检查 VNC 日志,找出运行它时所使用的端口。您应该看到与下面代码类似的内容:
    tail -f /home/idcuser/.vnc/vhost0270:1.log
    Copyright (C) 2002-2005 RealVNC Ltd.
    See http://www.realvnc.com for information on VNC.
    Underlying X server release 70101000, The X.Org Foundation
    
    Sun Oct 16 03:54:31 2011
     vncext:      VNC extension running!
     vncext:      Listening for VNC connections on port 5901
     vncext:      Listening for HTTP connections on port 5801
     vncext:      created VNC server for screen 0

    在本例中,您可以看到 VNC 在侦听端口 5901 上的连接。

使用 SSH 客户端来连接到虚拟机。下一节会介绍 2 个客户端:OpenSSH 和 PuTTY。

使用 OpenSSH 命令建立通道

您可以在 Linux 或 Windows 上通过 Cygwin 命令行使用 OpenSSH。如果您的系统还没有提供该工具,请使用 Cygwin,首先需要安装 cygwin openssh 包。

在端口 5901 上启动一个从 SSH 客户端到虚拟机的通道:

$ ssh -i ~/.ssh/key_name -L 5901:localhost:5901 idcuser@${SCE_VM}

-i 选项指定了要使用的密钥,-L 选项可指定通道。使用的端口 (5901) 必须与在虚拟机上运行的 VNC 服务器所使用的端口匹配。

使用 PuTTY 建立通道

使用 PuTTY 创建一个等效的通道:

  1. 单击 Connection > SSH > Tunnels 打开 PuTTY Configuration 窗口,如图 7 所示。
    图 7. 使用 PuTTY 建立通道
    使用 PuTTY 建立通道
  2. 在源端口输入目标端口 5901,并在 Destination 字段中以 ip:port 的形式输入目标端口。
  3. 单击 Add
  4. 单击 Open
  5. 在看到登录提示时输入 idcuser。通道已被建立,并且您登录到一个交互式 shell 中。
  6. 启动 VNC 客户端。输入地址 localhost:5901,如图 8 所示。
    图 8. VNC 客户端
    VNC 客户端
  7. 单击 OK。您会看到 Linux 桌面。

使用虚拟专网

虚拟专网 (VPN) 依靠加密在 Internet 上创建专用网络的扩展。VPN 支持若干个对企业很有价值的网络场景。

传统的 VPN 用法是将企业不同办事处的局域网连接为一个广域网。这些类型的连接是站点到站点的连接。若出于该目的而引入 VPN,那么可以使用它们取代租用线路的使用,这会大大降低企业成本。

VPN 的另一个传统用途是,使员工能够远程访问企业的专用网络;例如,在家工作。在该场景中,企业提供可以从 Internet 访问的 VPN 网关,员工在他的笔记本电脑中安装 VPN 客户端,并使用该客户端访问应用程序,如电子邮件。这就是所谓的移动虚拟专网,因为其中一个端点(员工)没有固定的 IP 地址。

当客户端通过 VPN 网关发送一个数据包时,会添加一个身份验证标头,数据被加密,并且将数据放置在一个 Encapsulating Security Payload 中。接收数据的 VPN 服务器会根据标头的信息来解密数据,并将数据包路由到目的地。

VPN 提供的加密是一个较低层次的加密,加密了与企业的所有通信。这可能发生在 OSI 的第 2 层(数据链路层)或第 3 层(网络层),并且可能包含以下任一方法:

  • IPsec
  • SSL /TLS
  • 数据报传输层安全 (Cisco)
  • Microsoft 点对点加密
  • SSH 通道

VPN 可以使用桥接来创建一个虚拟的广域 Ethernet LAN。与使用路由相比,这种做法有一些优势,因为它可以使用在以太网上可用的任何协议。如果您正在使用非 IP 协议或 Windows 文件共享,就需要使用桥接。但是,通过路由建立 VPN 可能会更容易一些,并允许对特定主机和端口的访问有更精细的控制。

许多企业可能希望使用云计算来扩展其 IT 基础架构的能力。为了支持这种场景,需要配置一个 VPN,通过企业网络中的网关来访问云中的专用 VLAN。这被称为一个站点到站点的连接。云专用网络上的虚拟机对 Internet 是不可见的,只能通过 VPN 或通过 VLAN 上的另一个虚拟机进行访问。图 9 说明了这个场景。

图 9. 使用 VPN 扩展企业网络
使用 VPN 扩展企业网络

在该场景中,云被用作企业网络的扩展。在云中的扩展,与 Internet 和在云中的 VLAN 之外的虚拟机隔离。IBM SmartCloud Enterprise 将该场景作为一项基本产品来提供支持。与在家里工作的场景不同,员工不必特意安装任何 VPN 客户端。

您还可以支持使用云来支持 VPN 的网络场景,企业无需拥有内部 VPN 网关。例如,在 IBM SmartCloud Enterprise 目录中的 CohesiveFT VPN-Cubed 镜像可以提供一个 VPN 网关。这可以支持员工使用一个 VPN 客户端(如 OpenVPN 客户端)在家里工作。参见图 10。

图 10. 在云中使用 VPN 网关访问 VLAN
在云中使用 VPN 网关访问 VLAN

OpenVPN 是一个开源的 VPN 客户端和服务器解决方案,可以管理点对点和站点到站点的连接。它使用 OpenSSL 加密库。可以从 OpenVPN 网站下载 OpenVPN 的安装镜像。它包括客户端和服务器软件,客户机和服务器上都必须安装这些软件。您可以在 RHEL 计算机上使用 RPM 包,在 SUSE 或其他基于 Debian 的系统上使用 apt-get 命令进行安装。也可以从 tarball 使用 make 在其他 Linux 系统上进行安装。还有针对 Windows 的一个自解压安装程序和仅包含客户端的安装镜像,您可以直接将它们提供给终端用户。

VPN-Cubed 解决方案是 Cohesive FT 提供的商用软件包,IBM SmartCloud Enterprise 中已提供 Cohesive FT。它可以支持许多网络配置,帮助在云中创建更复杂的虚拟网络配置,并利用 VPN 通过多个云连接计算资源。VPN-Cubed 可以作为一个虚拟路由器、虚拟网桥、VPN 集中器和防火墙。


设置 OpenVPN

使用 OpenVPN 建立 VPN 涉及建立一个公钥基础架构,包括含有每个服务器和客户端使用的一个公钥和一个私钥的证书,以及签署所有这些证书的一个证书颁发机构 (CA) 证书。默认情况下,VPN 使用这些证书执行服务器和客户端的相互认证。但是,您可以配置备用的身份验证方法。也可以在动态的 IP 地址上设置一个 Open VPN 服务器。

在 RHEL5 上安装和配置 OpenVPN 服务器

  1. 使用 yum 安装 OpenVPN 服务器:
    1. RHEL5 的 OpenVPN 包不在标准存储库中。以 root 用户的身份下载 Fedora EPEL (Extra Packages for Enterprise Linux) 存储库的说明,然后键入 yum install openvpn
      # rpm -ivh http://download.fedora.redhat.com/pub/epel/5/x86_64/ 
        epel-release-5-4.noarch.rpm

      输出:

      Retrieving http://download.fedora.redhat.com/pub/epel/5/x86_64/
       epel-release-5-4.noarch.rpm
      warning: /var/tmp/rpm-xfer.wmJlYz: Header V3 DSA signature: 
       NOKEY, key ID 217521  f6
      Preparing...                ########################################### [100%]
         1:epel-release           ########################################### [100%]
      [root@vhost0508 ~]#
    2. 使用命令 # yum install openvpn 安装 OpenVPN 包。

      输出:

      Loaded plugins: security
      Repository rhel-server is listed more than once in the configuration
      Setting up Install Process
      Resolving Dependencies
      --> Running transaction check
      ...

    您应该在输出中能够看到,EPEL 存储库提供的最新的(但对外宣称仍然是不稳定的)Release Candidate 9 of OpenVPN (Version 2.1) 已成功安装。Yum 还安装从属的 LZO 库。

  2. 配置 OpenVPN 服务器。以 root 用户的身份执行以下命令。
    # mkdir -p /etc/openvpn
    # cp -R /usr/share/openvpn/easy-rsa/ /etc/openvpn/
    # cd /etc/openvpn/easy-rsa/2.0/

    显示了有助于配置 VPN 的脚本列表。关键脚本归纳如下:

    • vars:创建环境变量,并设置必要的脚本变量
    • build-ca:创建 CA 证书(交互式)
    • build-dh:创建 Diffie-Hellman 文件
    • build-key-server:创建服务器私钥
    • build-key:创建客户端私钥
  3. 生成一下主 CA 证书/密钥、一个服务器证书/密钥,以及客户端的证书/密钥。
    1. 根据您的环境编辑 vars 脚本。示例如下:
      export KEY_COUNTRY="CN"
      export KEY_PROVINCE="Shanghai"
      export KEY_CITY="Shanghai"
      export KEY_ORG="IBM"
      export KEY_EMAIL="a.user@example.com"
    2. 生成 CA 证书:
      # ./clean-all
      # source ./vars
      # ./build-ca

      输出:

      Generating a 1024 bit RSA private key
      .........................++++++
      ...................++++++
      writing new private key to 'ca.key'
      -----
      You are about to be asked to enter information that will be incorporated
      into your certificate request.
      What you are about to enter is what is called a Distinguished Name or a DN.
      There are quite a few fields but you can leave some blank
      For some fields there will be a default value,
      If you enter '.', the field will be left blank.
      -----
      Country Name (2 letter code) [CN]:
      State or Province Name (full name) [Shanghai]:
      Locality Name (eg, city) [Shanghai]:
      Organization Name (eg, company) [IBM]:
      Organizational Unit Name (eg, section) []:
      Common Name (eg, your name or your server's hostname) [IBM CA]:
      Name []:
      Email Address [a.user@example.com]:
      #
    3. 生成服务器私钥:
      # ./build-key-server server

      输出:

      Generating a 1024 bit RSA private key
      .................................++++++
      ....++++++
      writing new private key to 'server.key'
      -----
      You are about to be asked to enter information that will be incorporated
      into your certificate request.
      ...
      Certificate is to be certified until Sep 23 13:15:05 2021 GMT (3650 days)
      Sign the certificate? [y/n]:y
      1 out of 1 certificate requests certified, commit? [y/n]y
      Write out database with 1 new entries
      Data Base Updated
    4. 生成客户端私钥:
      # ./build-key client1

      输出:

      Generating a 1024 bit RSA private key
      ....................++++++
      .............++++++
      writing new private key to 'client1.key'
      -----
      ...
      Certificate is to be certified until Sep 23 13:16:57 2021 GMT (3650 days)
      Sign the certificate? [y/n]:y
      
      1 out of 1 certificate requests certified, commit? [y/n]y
      Write out database with 1 new entries
      Data Base Updated
    5. 生成 Diffie-Hellman 参数:
      # ./build-dh

      输出:

      Generating DH parameters, 1024 bit long safe prime, generator 2
      This is going to take a long time
      .........+........................................................+.........
    6. 将服务器证书复制到 /etc/openvpn:
      # cd keys
      # cp server.crt server.csr server.key ca.crt 
        ca.key dh1024.pem /etc/openvpn/
    7. 压缩客户端证书:
      tar zcvf client1.vpn.key.tar ca.crt ca.key 
       client1.crt client1.csr client1.key
    8. 配置服务器。最好参考 openvpn sample-config 文件来创建 OpenVPN 配置文件。示例如下:
      # cp /usr/share/doc/openvpn-2.1.4/sample-config-files/server.conf
       /etc/openvpn/
      # cd /etc/openvpn/
      # vi server.conf

      输出:

      local 129.35.209.162 # Which local IP address should OpenVPN listen on
      port 1194 #
      proto udp
      
      dev tun
      ca ca.crt
      cert server.crt
      key server.key  # This file should be kept secret
      dh dh1024.pem
      
      server 10.8.0.0 255.255.255.0
      
      client-to-client
      keepalive 10 120
      
      comp-lzo
      
      persist-key
      persist-tun
      status openvpn-status.log
      log         openvpn.log
      log-append  openvpn.log
      
      verb 3
      
      push "dhcp-option DNS 10.8.0.1"
      push "dhcp-option DNS 170.225.111.10"  # see h) to get name server,
      push "dhcp-option DNS 170.225.111.10"  # see h) to get name server
      push "dhcp-option DNS 170.224.55.203"  # see h) to get name server
    9. 检查 DNS 名称解析是否正确配置:
      # vi /etc/resolv.conf

      输出:

      domain site2.compute.ihost.com
      nameserver 170.225.111.10
      nameserver 170.225.111.11
      nameserver 170.224.55.203
    10. 确保端口 1194 已打开。确认防火墙允许端口 1194 上的流量通过,或者使用以下命令打开它:
      /sbin/iptables -A INPUT -i eth0 -p udp --dport 1194 -j ACCEPT
      /sbin/iptables -A OUTPUT -o eth0 -p udp --dport 1194 -j ACCEPT
      /sbin/service iptables save
      /sbin/service iptables restart
    11. 启动/停止/重新启动 openvpn 服务。

      启动 openvpn 服务:

      # service openvpn start

      输出:

      Starting openvpn:                                          [  OK  ]

      停止 openvpn 服务:

      # service openvpn stop

      输出:

      Shutting down openvpn:                                     [  OK  ]

      重新启动 openvpn 服务:

      # service openvpn restart

      输出:

      Shutting down openvpn:                                     [  OK  ]
      Starting openvpn:                                          [  OK  ]

此时 OpenVPN 服务器已安装、配置并运行。现在,您需要配置一个客户端与它进行通信。

在 RHEL5 上安装和配置 OpenVPN 客户端

  1. 安装 openvpn 包。重复前面说明中的 步骤 1 和步骤 2
  2. 将 client1.key、client1.crt 和 ca.crt 从服务器复制到 client1 计算机:
    #cp /usr/share/doc/openvpn-2.1.4/sample-config-files/client.conf
     /etc/openvpn
  3. 找到 sample-config-files/client.conf 并编辑它。编辑 "remote" 指令,该指令指向 OpenVPN 服务器的主机名/IP 地址和端口号。

    输出:

    remote 129.35.209.162  1194
    ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt
    cert /etc/openvpn/easy-rsa/2.0/keys/client1.crt
    key /etc/openvpn/easy-rsa/2.0/keys/client1.key
  4. 从源目录启动 openvpn:
    ./openvpn sample-config-files/client.conf

在启动结束时,它应该显示 "Initialization Sequence Completed" 。

在 Windows 上安装和配置 OpenVPN 客户端 GUI

  1. OpenVPN 网站下载 OpenVPN GUI。注:OpenVPN GUI 和 OpenVPN 服务器的版本应该一致。
  2. 安装 OpenVPN GUI。在下载文件时请遵循说明。
  3. 配置 OpenVPN:
    1. 从服务器复制客户端证书:
      ca.crt
      ca.key
      client1.crt
      client1.csr
      client1.key
    2. 将 sample-config-files/client.conf 复制到安装目录下的 config 目录,编辑它并将它重命名为 client.ovpn (C:\Program Files\OpenVPN\config):
      129.35.209.162  1194
      ca ca.crt
      cert client1.crt
      key client1.key
  4. 通过 GUI 重新启动 OpenVPN

设置代理服务器

在 Red Hat 上设置一个代理服务器:

  1. 在 RTP Data Center 配置一个 Red Hat 5.6 实例。该实例有一个公共 IP 和一个私有 IP;默认情况下,私有 IP 在配置后是无效的。
    图 11. 设置一个代理服务器
    设置一个代理服务器
  2. 运行以下命令,检查当前网关信息;当前网关是 170.224.160.1。
    # /sbin/route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    170.224.160.0   0.0.0.0         255.255.240.0   U     0      0        0 eth0
    169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
    0.0.0.0         170.224.160.1   0.0.0.0         UG    0      0        0 eth0
  3. 激活私有 IP 地址:
    # /sbin/ifup eth1
  4. 再次运行以下命令,检查当前网关信息。当前网关现在是 10.216.1.1。
    # /sbin/route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    10.216.1.0      0.0.0.0         255.255.255.0   U     0      0        0 eth1
    170.224.160.0   0.0.0.0         255.255.240.0   U     0      0        0 eth0
    169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth1
    0.0.0.0         10.216.1.1      0.0.0.0         UG    0      0        0 eth1
  5. 再次检查,看到私有 IP 现在是 "Active"。
    图 12. 私有 IP 现在已激活
    私有 IP 现在已激活
  6. 如果您启用私有 IP,则会修改默认网关,并且您无法再访问 Internet。为了解决这个问题,可以将公共 IP 网关设置为从 Internet 到达的第一优先网关:
    [root@vhost0513 ~]# /sbin/route del default
    [root@vhost0513 ~]# /sbin/route add default gw 170.224.160.1
    [root@vhost0513 ~]# /sbin/route add default gw 10.216.1.1 metric 1

现在,您可以成功 ping 通 Internet IP。

以下步骤会帮助您将私有 IP 设置为代理服务器,在同一子网内访问使用私有 IP 的实例。

  1. 运行 yum 安装代理服务器 squid。对于 SUSE,请运行 zypper install squid
    [root@vhost0513 ~]# yum install squid
    Loaded plugins: security
    Setting up Install Process
    Resolving Dependencies
    ...
    Complete!
  2. 在 /etc/squid/squid.conf 上配置 squid,添加粗体字的代码行:
    http_access allow localhost
    acl lan_users src 10.216.1.0/24
    http_access allow lan_users
    http_access deny all
  3. 启动 squid,如下所示:
    # /sbin/service squid start

    现在,您可以使用 openssh 从前一个实例访问另一个配置了私有 IP 地址的实例。

  4. 最后一步是导出代理,如下:
    # export http_proxy=http://10.216.1.144:3128

您已完成代理的配置。


结束语

在本文中,我们总结了在不同的云场景中对多个网络层的管理,并向您介绍了云中的网络管理工具如何使不同的业务场景受益。我们还详细介绍了以下工具,它们将帮助您管理通过网络进行的云服务交付:

  • 连接到 VM(IP 地址)
  • 管理虚拟网络
  • 管理多个独立的 IP 地址
  • 使用防火墙保护多个虚拟机
  • 通过 SSH 或 PuTTY 对用户和服务器进行身份验证
    • 端口转发
    • 创建和使用 SSH 通道
    • 使用 OpenSSH 在命令行建立通道
    • 使用 PuTTY 建立通道
  • 使用虚拟专网
  • 设置 OpenVPN
  • 设置代理服务器

参考资料

学习

获得产品和技术

  • 查看 IBM SmartCloud Enterprise 提供的 产品镜像

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Cloud computing, Open source
ArticleID=829300
ArticleTitle=云上的网络
publish-date=08062012