2024-12-09 openstack ssh连接

DevStack 网络 #

DevStack 体验的一个重要部分是默认为创建的来宾提供网络连接。这可能不是您特定测试环境的最佳选择,因此本文档尽力解释发生了什么。

默认值 #

如果您不指定任何配置,您将获得以下内容:

  • neutron(包括带有 openvswitch 的 l3)
  • 每个 openstack 项目的私有项目网络
  • 浮动 IP 范围为 172.24.4.0/24,网关为 172.24.4.1
  • 演示项目在从 10.0.0.0/22 范围分配的子网上配置了固定 IP
  • 由 neutron 控制的所有网络的接口br-ex(不连接到任何物理接口)。
  • 根据主机的 resolv.conf 为访客提供 DNS 解析
  • 允许创建的访客路由出去的 IP masq 规则

这将创建一个与单个主机隔离的环境。访客可以访问外部网络以获取软件包更新。Tempest 测试将在此环境中进行。

笔记

默认情况下,所有 OpenStack 环境都有安全组规则,阻止所有发往客户的入站数据包。如果您希望能够 ssh/ping 您创建的客户,则应运行以下命令。

ubuntu@openstack-vm:~$ openstack security group list

+--------------------------------------+---------+------------------------+----------------------------------+------+
| ID                                   | Name    | Description            | Project                          | Tags |
+--------------------------------------+---------+------------------------+----------------------------------+------+
| 109ac0cd-daf6-481c-9594-867dbbdb129b | default | Default security group | 14278ce7bc604abd91e85b82e78ea45e | []   |
| 73b1a108-a0db-49a3-973f-dc91c030d4dd | default | Default security group | 6175cac8870541d1973a0f1010981180 | []   |
| 75e4b266-40bf-4bd8-a7d5-b2f0b0d6e84d | default | Default security group | a942dd11388440a6b8b9922fb405ad55 | []   |
| 9f07480a-fded-4172-852b-c997653324dc | t1      |                        | 6175cac8870541d1973a0f1010981180 | []   |
+--------------------------------------+---------+------------------------+----------------------------------+------+
ubuntu@openstack-vm:~$

你可以使用以下命令删除指定的安全组:

openstack security group delete 109ac0cd-daf6-481c-9594-867dbbdb129b
openstack security group delete 75e4b266-40bf-4bd8-a7d5-b2f0b0d6e84d

确保该安全组没有被任何实例使用,否则删除可能会失败。如果安全组被实例使用,你需要先将其从实例中移除,或者选择一个新的安全组。

如果你遇到问题,随时告诉我!

openstack security group rule create --proto icmp --dst-port 0 default
openstack security group rule create --proto tcp --dst-port 22 default


openstack security group rule create --proto icmp --dst-port 0 73b1a108-a0db-49a3-973f-dc91c030d4dd
openstack security group rule create --proto tcp --dst-port 22 73b1a108-a0db-49a3-973f-dc91c030d4dd

openstack security group rule create --proto icmp --dst-port 0  9f07480a-fded-4172-852b-c997653324dc
openstack security group rule create --proto icmp --dst-port 22  9f07480a-fded-4172-852b-c997653324dc

本地可访问的访客 #

如果您想让您的客人可以从网络上的其他机器访问,我们必须连接br-ex到物理接口。

专用客户机界面 #

如果您的 devstack 服务器上有 2 个或更多接口,您可以分配一个接口给 neutron 进行全面管理。这不应该 与您用于 ssh 进入 devstack 服务器本身的接口相同。

这是通过设置PUBLIC_INTERFACE属性来完成的。

[[local|localrc]]
PUBLIC_INTERFACE=eth1

这会将来自您的客户机的所有第 2 层流量放到主网络上。在此模式下运行时,ip masq 规则不会添加到您的 devstack 中,您负责确保本地网络上的路由工作。

共享客户机接口 #

警告

这不是推荐的配置。由于 OVS 和桥接之间的相互作用,如果您在启用网络的情况下重新启动设备,则可能会丢失系统的网络连接。

如果您需要访客在网络上可访问,但只有 1 个接口(使用 NUC 之类的设备),您可以共享一个网络。但为了实现这一点,您需要手动设置大量地址,并确保所有地址都完全正确。

[[local|localrc]]
PUBLIC_INTERFACE=eth0
HOST_IP=10.42.0.52
FLOATING_RANGE=10.42.0.0/24
PUBLIC_NETWORK_GATEWAY=10.42.0.1
Q_FLOATING_ALLOCATION_POOL=start=10.42.0.250,end=10.42.0.254

为了使此方案有效,浮动 IP 网络必须与您服务器上的默认网络相匹配。这会破坏 HOST_IP 检测,因为我们默认排除浮动范围,因此您必须手动指定。

PUBLIC_NETWORK_GATEWAY是服务器通常用来脱离网络的网关。Q_FLOATING_ALLOCATION_POOL控制将要分配的浮动 IP 范围。由于我们正在共享您现有的网络,因此您需要为其分配本地 dhcp 服务器未分配的片段。否则,您很容易出现 IP 地址冲突,并对您的本地网络造成严重破坏。

私有网络寻址 #

IPV4_ADDRS_SAFE_TO_USE 私有网络地址由和变量控制IPV6_ADDRS_SAFE_TO_USE。这允许用户指定一个要使用的安全内部 IP 变量,无论是否使用子网池,都会引用该变量。

对于IPv4,FIXED_RANGESUBNETPOOL_PREFIX_V4将直接默认为的值IPV4_ADDRS_SAFE_TO_USE

对于 IPv6,FIXED_RANGE_V6将默认为 的值的前 /64 IPV6_ADDRS_SAFE_TO_USE。如果IPV6_ADDRS_SAFE_TO_USE为 /64 或更小, FIXED_RANGE_V6将直接使用该值。 SUBNETPOOL_PREFIX_V6将直接默认为 的值 IPV6_ADDRS_SAFE_TO_USE

SSH 访问实例 #

为了验证连接性,您可以使用网络创建一个实例 $PRIVATE_NETWORK_NAME(默认值:)private,使用$PUBLIC_NETWORK_NAME网络创建一个浮动 IP(默认值:)public,然后将此浮动 IP 附加到该实例:

openstack keypair create --public-key ~/.ssh/id_rsa.pub test-keypair
openstack server create --network private --key-name test-keypair ... test-server
fip_id=$(openstack floating ip create public -f value -c id)
openstack server add floating ip test-server ${fip_id}

完成后,请确保已为用于实例的安全组启用 SSH 和 ICMP(ping)访问。您可以创建自定义安全组并在创建实例时指定它,也可以在创建后添加它,或者您可以修改default每个项目默认创建的安全组。让我们做后者:

openstack security group rule create --proto icmp --dst-port 0 default
openstack security group rule create --proto tcp --dst-port 22 default

最后,通过 SSH 进入实例。如果你使用了默认上传的 Cirros 实例,那么你可以运行以下命令:

openstack server ssh test-server -- -l cirros

这将使用cirros您在创建实例时配置的用户和密钥对进行连接。

远程 SSH 访问实例 #

您还可以从其他主机通过 SSH 连接到 DevStack 主机上创建的实例。如果您正在现有云上的 VM 中部署 DevStack 并希望在本地计算机上进行开发,这将非常有用。有几种方法可以做到这一点。

配置实例可供本地访问

最明显的方法是将客户机配置为本地可访问,如上所述这样做的好处是不需要在客户端上做进一步的工作。但是,这更复杂,需要云的支持或一些不明智的解决方法。

使用 DevStack 主机作为跳转主机

您可以选择使用 DevStack 主机作为跳转主机。要通过这种方式通过 SSH 连接到实例,请将标准-J选项传递给/ 命令。例如:openstack ssh``ssh

openstack server ssh test-server -- -l cirros -J username@devstack-host

(其中test-server是现有实例的名称,如前所述 usernamedevstack-host您的 DevStack 主机的用户名和主机名)。

这也可以通过您的文件进行配置~/.ssh/config,因此非常轻松。但是,它仅允许 SSH 访问。如果您想要访问实例上的 Web 应用程序,则需要配置 SSH 隧道并使用选项转发选定端口-L。例如,要转发 HTTP 流量:

openstack server ssh test-server -- -l cirros -L 8080:username@devstack-host:80

(其中test-server是现有实例的名称,如前所述 usernamedevstack-host您的 DevStack 主机的用户名和主机名)。

你可以想象,这很快就会失控,特别是对于具有多个端口的更复杂的客户应用程序而言。

使用代理或 VPN 工具

$PUBLIC_NETWORK_NAME您可以使用代理或 VPN 工具为由 (默认值:public) 定义的网络浮动 IP 地址范围($FLOATING_RANGE默认值:172.24.4.0/24) 启用隧道。有许多此类工具可用于执行此操作。例如,我们可以使用一个名为shuttle的实用实用程序。要使用 启用隧道shuttle,首先确保您已允许 SSH 和 HTTP(S) 流量到您的 DevStack 主机。允许 HTTP(S) 流量是必要的,这样您就可以远程使用 OpenStack API。如何执行此操作取决于您的 DevStack 主机的运行位置。完成后,sshuttle在您的本地主机上安装:

sudo apt-get install sshuttle || yum install sshuttle

最后,sshuttle使用浮动 IP 地址范围在本地主机上启动。例如,假设您使用 的默认值 $FLOATING_RANGE,您可以执行以下操作:

sshuttle -r username@devstack-host 172.24.4.0/24

(其中usernamedevstack-host是您的 DevStack 主机的用户名和主机名)。

您现在应该能够创建一个实例并通过 SSH 进入它:

openstack server ssh test-server -- -l cirros

(其中test-server是现有实例的名称, 如前所述


你可以使用 openstack server start 命令来启动一个已经存在的虚拟机实例。

根据你提供的实例列表,虚拟机名称为 t2,它的状态是 SHUTOFF。你可以通过以下命令来启动它:

openstack server start t2

如果你想启动多个实例,可以用空格分隔多个实例名称或 ID。例如:

openstack server start t2 another_instance

另外,如果你想查看实例启动状态,可以使用:

openstack server show t2

如果有任何问题或需要进一步的帮助,随时告诉我!

要在外部连接 OpenStack 创建的实例,需要完成几个网络配置步骤:

  1. 确保安全组配置正确:
# 创建安全组规则,允许 SSH 访问(如果是 Linux 实例)
openstack security group rule create --protocol tcp --dst-port 22:22 --remote-ip 0.0.0.0/0 default

# 如果是 Windows 实例,需要开放 RDP 端口
openstack security group rule create --protocol tcp --dst-port 3389:3389 --remote-ip 0.0.0.0/0 default
  1. 分配浮动 IP:
# 创建浮动 IP
openstack floating ip create external-network

# 将浮动 IP 绑定到实例
openstack server add floating ip INSTANCE_NAME FLOATING_IP
  1. 检查网络配置:
# 查看实例的网络详情
openstack server show INSTANCE_NAME

# 查看网络列表
openstack network list

# 查看子网列表
openstack subnet list

主要配置步骤:

  1. 网络配置:
  • 确保有外部网络(external network)
  • 创建路由器连接内部网络和外部网络
  • 配置正确的 CIDR 和网关
  1. 路由器配置:
# 创建路由器
openstack router create ROUTER_NAME

# 设置路由器的外部网关
openstack router set ROUTER_NAME --external-gateway external-network

# 将路由器连接到内部网络
openstack router add subnet ROUTER_NAME INTERNAL_SUBNET
  1. 验证连接:
# Linux 实例
ssh -i private_key.pem user@FLOATING_IP

# Windows 实例
# 使用远程桌面连接 FLOATING_IP

常见问题检查:

  1. 确保安全组规则正确配置
  2. 验证网络拓扑是否正确
  3. 检查路由器配置
  4. 确认浮动 IP 是否正确绑定
  5. 检查实例的网络接口配置

如果仍然无法连接:

  1. 检查实例内部的网络配置
  2. 验证防火墙规则
  3. 查看 OpenStack 网络服务日志
  4. 确认 IP 转发是否启用
  5. 检查 DNS 配置

浮动IP(Floating IP)可以理解为公网IP,它允许OpenStack内部的实例能够被外网访问。让我用一个简单的类比来解释:

想象一个小区(OpenStack环境):

  • 内部网络(Private IP)就像小区内部的房间号,只能在小区内部使用
  • 浮动IP(Floating IP)就像小区的对外门牌号,外部人员可以通过这个找到你

具体工作原理:

  1. 默认情况下,OpenStack实例只有内部IP:
实例A: 192.168.1.10 (内部IP,只能在OpenStack内部访问)
  1. 分配浮动IP后:
实例A: 
- 内部IP: 192.168.1.10
- 浮动IP: 203.0.113.101 (可以从外网访问)

配置步骤:

  1. 创建浮动IP:
# 从外部网络池中创建一个浮动IP
openstack floating ip create external-network
  1. 查看可用的浮动IP:
openstack floating ip list
  1. 分配给实例:
# 方式1:通过命令行
openstack server add floating ip 实例名称 浮动IP地址

# 方式2:通过Web界面
# Instances -> Actions -> Associate Floating IP

使用场景:

  1. 需要从外网SSH连接到实例
  2. 实例需要提供对外服务(如网站)
  3. 实例需要访问外网资源

注意事项:

  1. 浮动IP是有限资源,用完后需要及时释放
  2. 一个实例可以有多个浮动IP
  3. 浮动IP可以在实例之间迁移
  4. 需要配置正确的安全组规则才能访问