关于网络 ACL
您可以使用访问控制表 (ACL) 来控制 IBM Cloud® Virtual Private Cloud中的所有传入和传出流量。 ACL 是与安全组类似的内置虚拟防火墙。 与安全组不同,ACL 规则控制的是进出_子网_的流量,而不是进出_实例_的流量。
有关安全组与 ACL 特征的比较,请参阅比较表。
本文档中提供的示例显示了如何使用 CLI 在 VPC 中创建网络 ACL。 有关如何在 IBM Cloud 控制台中设置 ACL 的更多信息,请参阅 在控制台中配置 ACL。
使用 ACL 和 ACL 规则
要使 ACL 有效,需要创建规则来决定如何处理入站和出站网络流量。 您可以创建多个入站和出站规则。 有关规则配额的更多信息,请参阅 配额。
- 通过入站规则,可以使用指定的协议和端口来允许或拒绝从源 IP 范围流出的流量。
- 通过出站规则,可以使用指定的协议和端口来允许或拒绝进入目标 IP 范围的流量。
- ACL 规则按优先顺序排列并依次审议。 将首先评估优先级较高的规则,并覆盖优先级较低的规则。
- 入站规则独立于出站规则。
- 如果未指定任何规则,那么缺省行为为 隐式拒绝。
有关在 ACL 规则中使用 ICMP、TCP 和 UDP 协议的更多信息,请参阅 了解互联网通信协议。
更新VPC的默认ACL规则
默认 ACL 与其他 ACL 类似,但不能删除。
当您创建一个VPC时,系统会为该VPC创建一个默认ACL,其中包含两条规则:
- 名为
allow-inbound
的规则允许来自任何来源的入站ICMP、TCP和UDP流量 - 一条名为
allow-outbound
的规则允许ICMP、TCP和UDP流量流向任何目的地
您可以使用控制台、CLI 或 API 修改默认 ACL 的规则。
如果编辑了默认 ACL 的规则,这些编辑过的规则就会应用到 ACL 连接的所有当前和未来子网。
将 ACL 连接到子网
创建新子网时,您可以指定要附加的访问控制列表。 如果未指定 ACL,则会附加 VPC 的默认网络 ACL。
每个子网都只连接一个访问控制列表。 您可以用另一个访问控制列表替换子网的访问控制列表。
ACL 示例
在下面的示例中,您将创建两个 ACL,并使用命令行界面 (CLI) 将它们与两个子网相关联。 图 1 说明了此场景的情况。
如图 1 所示,您有两个网络服务器负责处理来自互联网的请求,还有两个后端服务器,您希望将它们隐藏起来,不对公众开放。 在本例中,您将服务器放置在两个独立的子网 10.10.10.0/24
和 10.10.20.0/24
中,并需要允许网络服务器与后端服务器交换数据。 此外,您还希望允许来自后端服务器的有限出站流量。
示例规则
下面的示例规则展示了如何为基本方案设置 ACL 规则。
作为最佳实践,细粒度规则的优先级要高于粗粒度规则。 例如,您有一条阻止来自子网 10.10.30.0/24
的所有流量的规则。 如果为其分配了更高的优先级,那么不会应用任何具有较低优先级的允许来自 10.10.30.5
的流量的细颗粒度规则。
ACL-1 示例规则
入站/出站 | 允许/拒绝 | 源 IP | 目标 IP | 协议 | 端口 | 描述 |
---|---|---|---|---|---|---|
入站 | 允许 | 0.0.0.0/0 | 0.0.0.0/0 | TCP | 80 | 允许来自因特网的 HTTP 流量 |
入站 | 允许 | 0.0.0.0/0 | 0.0.0.0/0 | TCP | 443 | 允许来自因特网的 HTTPS 流量 |
入站 | 允许 | 10.10.20.0/24 | 0.0.0.0/0 | 全部 | 全部 | 允许所有来自后端服务器所在子网 10.10.20.0/24 的入站流量 |
入站 | 拒绝 | 0.0.0.0/0 | 0.0.0.0/0 | 全部 | 全部 | 拒绝其他所有入站流量 |
出站 | 允许 | 0.0.0.0/0 | 0.0.0.0/0 | TCP | 80 | 允许 HTTP 流量流至因特网 |
出站 | 允许 | 0.0.0.0/0 | 0.0.0.0/0 | TCP | 443 | 允许流至因特网的 HTTPS 流量 |
出站 | 允许 | 0.0.0.0/0 | 10.10.20.0/24 | 全部 | 全部 | 允许所有向后端服务器所在子网 10.10.20.0/24 的出站流量 |
出站 | 拒绝 | 0.0.0.0/0 | 0.0.0.0/0 | 全部 | 全部 | 拒绝其他所有出站流量 |
ACL-2 示例规则
入站/出站 | 允许/拒绝 | 源 IP | 目标 IP | 协议 | 端口 | 描述 |
---|---|---|---|---|---|---|
入站 | 允许 | 10.10.10.0/24 |
0.0.0.0/0 | 全部 | 全部 | 允许所有来自子网 10.10.10.0/24 的入站流量,网络服务器放置在该子网中 |
入站 | 拒绝 | 0.0.0.0/0 | 0.0.0.0/0 | 全部 | 全部 | 拒绝其他所有入站流量 |
出站 | 允许 | 0.0.0.0/0 | 0.0.0.0/0 | TCP | 80 | 允许 HTTP 流量流至因特网 |
出站 | 允许 | 0.0.0.0/0 | 0.0.0.0/0 | TCP | 443 | 允许流至因特网的 HTTPS 流量 |
出站 | 允许 | 0.0.0.0/0 | 10.10.10.0/24 |
全部 | 全部 | 允许所有向子网 10.10.10.0/24 发送的出站流量,网络服务器放置在该子网中 |
出站 | 拒绝 | 0.0.0.0/0 | 0.0.0.0/0 | 全部 | 全部 | 拒绝其他所有出站流量 |
此示例仅说明的是一般情况。 在您的应用场景中,您可能希望对流量进行更精细的控制:
- 网络管理员可能需要从远程网络访问 10.10.10.0/24 子网进行操作。 在这种情况下,需要允许 SSH 流量从互联网进入该子网。
- 您可能希望缩小两个子网之间允许的协议作用域。
示例步骤
以下示例步骤跳过了使用 CLI 创建 VPC 的先决条件步骤,后者是必须先执行的步骤。 有关更多信息,请参阅 使用 CLI 创建 VPC 资源。
步骤 1. 创建 ACL
使用以下 CLI 命令来创建两个名为 my_web_subnet_acl
和 my_backend_subnet_acl
的 ACL:
ibmcloud is network-acl-create my-web-subnet-acl $vpc_id --source-acl-id $old_acl_id
ibmcloud is network-acl-create my-backend-subnet-acl $vpc_id --source-acl-id $old_acl_id
响应包含新创建的 ACL 标识。 请保存这两个 ACL 的标识,以便在稍后的命令中使用。 您可以使用名为 webacl
和 bkacl
的变量,就像这样:
webacl="0738-ba9e785a-3e10-418a-811c-56cfe5669676"
bkacl="0738-a4e28308-8ee7-46ab-8108-9f881f22bdbf"
步骤 2. 检索缺省 ACL 规则
添加规则前,请检索默认的入站和出站 ACL 规则,以便在它们之前插入新规则。
ibmcloud is network-acl-rules $webacl
ibmcloud is network-acl-rules $bkacl
响应显示允许所有协议中所有 IPv4 流量的缺省入站和出站规则。
Getting rules of network acl ba9e785a-3e10-418a-811c-56cfe5669676 under account Demo Account as user demouser...
inbound
ID Name Action IPv* Protocol Source Destination Created
0738-e2b30627-1a1d-447b-859f-ac9431986b6f allow-all-inbound-rule-2d86bc3f-58e4-436a-8c1a-9b0a710556d6 allow ipv4 all 0.0.0.0/0 0.0.0.0/0 2 months ago
outbound
ID Name Action IPv* Protocol Source Destination Created
0738-173a3492-0544-472e-91c0-7828cbcb62d4 allow-all-outbound-rule-2d86bc3f-58e4-436a-8c1a-9b0a710556d6 allow ipv4 all 0.0.0.0/0 0.0.0.0/0 2 months ago
将这两个 ACL 规则的标识保存为变量,以便您可以在以后的命令中使用这些值。 例如,可以将标识保存在变量 inrule
和 outrule
中:
inrule="0738-e2b30627-1a1d-447b-859f-ac9431986b6f"
outrule="0738-173a3492-0544-472e-91c0-7828cbcb62d4"
步骤 3. 按照说明添加新的 ACL 规则
在此示例中,首先添加入站规则,然后添加出站规则。
在缺省入站规则之前插入新的入站规则。
ibmcloud is network-acl-rule-add my_web_acl_rule200 $webacl deny inbound all 0.0.0.0/0 0.0.0.0/0 \
--before-rule-id $in-rule
在每一步中,将 ACL 规则的 ID 保存在变量中,以便在以后的命令中使用该 ID。 例如,您可以使用变量 acl200
:
acl200="0738-90930627-1a1d-447b-859f-ac9431986b6f"
现在,将规则添加到 acl200
:
ibmcloud is network-acl-rule-add my_web_acl_rule100 $webacl allow inbound all 10.10.20.0/24 0.0.0.0/0 \
--before-rule-id $acl200
添加更多规则,直到 ACL 设置完成,并将每个标识都保存为一个变量。
acl100="0738-78340627-1a1d-447b-859f-ac9431986b6f"
ibmcloud is network-acl-rule-add my_web_acl_rule20 $webacl allow inbound tcp 0.0.0.0/0 0.0.0.0/0 \
--source-port-min 443 --source-port-max 443 --before-rule-id $acl100
acl20="32450627-1a1d-447b-859f-ac9431986b6f"
ibmcloud is network-acl-rule-add my_web_acl_rule10 $webacl allow inbound tcp 0.0.0.0/0 0.0.0.0/0 \
--source-port-max 80 --source-port-min 80 --before-rule-id $acl20
在缺省出站规则之前插入新的出站规则。
ibmcloud is network-acl-rule-add my_web_acl_rule200e $webacl deny outbound all 0.0.0.0/0 0.0.0.0/0 \
--before-rule-id $outrule
acl200e="11110627-1a1d-447b-859f-ac9431986b6f"
ibmcloud is network-acl-rule-add my_web_acl_rule100e $webacl allow outbound all 0.0.0.0/0 10.10.20.0/24 \
--before-rule-id $acl200e
acl100e="22220627-1a1d-447b-859f-ac9431986b6f"
ibmcloud is network-acl-rule-add my_web_acl_rule20e $webacl allow outbound tcp 0.0.0.0/0 0.0.0.0/0 \
--source-port-max 443 --source-port-min 443 --before-rule-id $acl100e
acl20e="33330627-1a1d-447b-859f-ac9431986b6f"
ibmcloud is network-acl-rule-add my_web_acl_rule10e $webacl allow outbound tcp 0.0.0.0/0 0.0.0.0/0 \
--source-port-max 80 --source-port-min 80 --before-rule-id $acl20e
步骤 4. 使用新创建的 ACL 创建两个子网
创建两个子网,使每个 ACL 都与其中一个新子网相关联。
ibmcloud is subnet-create my-web-subnet $vpc_id $zone --ipv4_cidr_block 10.10.10.0/24 \
--network-acl-id $webacl
ibmcloud is subnet-create my-backend-subnet$vpc_id $zone --ipv4_cidr_block 10.10.20.0/24 \
--network-acl-id $bkacl
命令列表备忘单
显示 ACL 的可用 VPC CLI 命令的完整列表:
ibmcloud is network-acls
查看 ACL 及其元数据,包括规则:
ibmcloud is network-acl $webacl
要列出所有 ACL 规则:
ibmcloud is network-acl-rules $webacl
示例入站 ping
规则
要添加 ACL 规则,下面是在缺省入站规则之前添加 ping
入站规则的示例命令:
语法:
ibmcloud is network-acl-rule-add ACL ACTION DIRECTION PROTOCOL SOURCE DESTINATION [--name NAME] [--icmp-type ICMP_TYPE] [--icmp-code ICMP_CODE] [--source-port-min PORT_MIN] [--source-port-max PORT_MAX] [--destination-port-min PORT_MIN] [--destination-port-max PORT_MAX] [--before-rule-id RULE_ID] [--output JSON] [-q, --quiet]
示例:
ibmcloud is network-acl-rule-add 72b27b5c-f4b0-48bb-b954-5becc7c1dcb3 allow inbound icmp 10.2.2.2 10.2.2.3 --icmp-type 8 --icmp-code 0