Network/LBaaS/docs/how-to-create-tls-loadbalancer
目录
如何创建一个启用 TLS 的负载均衡器
以下文章将介绍设置负载均衡器以提供 TLS 终止流量所需的步骤。本文面向项目的当前状态,并将随着项目本身的发展而演变。
将讨论的一些内容是
- Barbican devstack 设置
- 证书和密钥生成
- Barbican 密钥和容器操作
- 负载均衡器创建
- 验证设置
Neutron-LBaaS 使用 Barbican 作为其密钥存储库,需要进行一些设置,让我们开始吧。
首先,本文假设读者熟悉 Git、Openstack、Devstack 和其他相关工具和技术,以便开始使用。本文将不会介绍设置 Devstack、Openstack、Git 或任何相关内容。
Barbican Devstack
在 localrc 中的 lbaas 插件正上方添加 'enable_plugin barbican https://review.openstack.org/openstack/barbican',然后运行 stack.sh
./<devstack_dir>/stack.sh
创建证书链和密钥。
- 以下内容可能比实际需要的更详细,请根据需要自由创建/检索证书/密钥/中间证书。
openssl genrsa -des3 -out ca.key 1024 openssl req -new -x509 -days 3650 -key ca.key -out ca.crt openssl x509 -in ca.crt -out ca.pem openssl genrsa -des3 -out ca-int_encrypted.key 1024 openssl rsa -in ca-int_encrypted.key -out ca-int.key openssl req -new -key ca-int.key -out ca-int.csr -subj "/CN=ca-int@acme.com" openssl x509 -req -days 3650 -in ca-int.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out ca-int.crt openssl genrsa -des3 -out server_encrypted.key 1024 openssl rsa -in server_encrypted.key -out server.key openssl req -new -key server.key -out server.csr -subj "/CN=server@acme.com" openssl x509 -req -days 3650 -in server.csr -CA ca-int.crt -CAkey ca-int.key -set_serial 01 -out server.crt
如果您还想测试 SNI,请创建至少另一个具有不同 CN 的证书链
openssl genrsa -des3 -out ca2.key 1024 openssl req -new -x509 -days 3650 -key ca2.key -out ca2.crt openssl x509 -in ca2.crt -out ca2.pem openssl genrsa -des3 -out ca-int_encrypted2.key 1024 openssl rsa -in ca-int_encrypted2.key -out ca-int2.key openssl req -new -key ca-int2.key -out ca-int2.csr -subj "/CN=ca-int-test2@stacme.com" openssl x509 -req -days 3650 -in ca-int2.csr -CA ca2.crt -CAkey ca2.key -set_serial 01 -out ca-int2.crt openssl genrsa -des3 -out server_encrypted2.key 1024 openssl rsa -in server_encrypted2.key -out server2.key openssl req -new -key server2.key -out server2.csr -subj "/CN=test2@stacme.com" openssl x509 -req -days 3650 -in server2.csr --CA ca-int2.crt -CAkey ca-int2.key -set_serial 01 -out server2.crt
- 记下两个链的 CN,稍后用于验证 SNI
Barbican 密钥和容器
barbican secret store --payload-content-type='text/plain' --name='certificate' --payload="$(cat server.crt)"
barbican secret store --payload-content-type='text/plain' --name='private_key' --payload="$(cat server.key)"
barbican secret container create --name='tls_container' --type='certificate' --secret="certificate=$(barbican secret list | awk '/ certificate / {print $2}')" --secret="private_key=$(barbican secret list | awk '/ private_key / {print $2}')"
添加第二个证书链以测试 SNI
barbican secret store --payload-content-type='text/plain' --name='certificate2' --payload="$(cat server2.crt)"
barbican secret store --payload-content-type='text/plain' --name='private_key2' --payload="$(cat server2.key)"
barbican secret container create --name='tls_container2' --type='certificate' --secret="certificate=$(barbican secret list | awk '/ certificate2 / {print $2}')" --secret="private_key=$(barbican secret list | awk '/ private_key2 / {print $2}')"
更新 neutron 配置
在 /etc/neutron/neutron_lbaas.conf 中添加或更新 'service_auth' 组
auth_uri = https://:35357/v2.0 admin_tenant_name = admin admin_user = admin admin_password = password auth_version = 2
- 所需的值可能与您的特定 devstack 安装不同,请确保使用这些值。
- 需要重新启动 neutron-server 和 neutron-lbaasv2-agent 以获取更改
- 注意:在撰写本文时,devstack 插件无法正确加载此配置,因此您必须在重新启动服务时添加命令行参数以加载它。
更新 octavia 配置。
在 'certificates' 组中更改 cert_manager
cert_manager=barbican_cert_manager
- 所需的值可能与您的特定 devstack 安装不同,请确保使用这些值。
- 需要重新启动 Octavia 控制器工作器 ('o-cw') 以获取更改
创建 nova 实例
创建成员以进行简单测试(基本的 devstack cirros 实例)
nova keypair-add default --pub-key ~/.ssh/id_rsa.pub
nova secgroup-add-rule default tcp 22 22 0.0.0.0/0
nova secgroup-add-rule default tcp 80 80 0.0.0.0/0
nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0
nova boot --image $(nova image-list | grep -o cirros.*-disk) --flavor 2 --nic net-id=$(neutron net-list | awk '/ private / {print $2}') member1 --security-groups default --key-name default
添加另一个成员以进行负载均衡测试(基本的 devstack cirros 实例)
nova boot --image $(nova image-list | grep -o cirros.*-disk) --flavor 2 --nic net-id=$(neutron net-list | awk '/ private / {print $2}') member2 --security-groups default --key-name default
创建启用 TLS 的负载均衡器
neutron lbaas-loadbalancer-create $(neutron subnet-list | awk '/ private-subnet / {print $2}') --name lb1
创建不使用 SNI 的 TLS 监听器
neutron lbaas-listener-create --loadbalancer lb1 --protocol-port 443 --protocol TERMINATED_HTTPS --name listener1 --default-tls-container=$(barbican secret container list | awk '/ tls_container / {print $2}')
创建使用 TLS 和 SNI 的监听器
neutron lbaas-listener-create --loadbalancer lb1 --protocol-port 443 --protocol TERMINATED_HTTPS --name listener1 --default-tls-container=$(barbican secret container list | awk '/ tls_container / {print $2}') --sni-container $(barbican secret container list | awk '/ tls_container2 / {print $2}')
创建池
neutron lbaas-pool-create --name pool1 --protocol HTTP --listener listener1 --lb-algorithm ROUND_ROBIN
创建成员
neutron lbaas-member-create pool1 --address $(nova show member1 | awk '/private network/ {a = substr($5, 0, length($5)-1); if (a ~ "\\.") print a; else print $6}') --protocol-port 80 --subnet $(neutron subnet-list | awk '/ private-subnet / {print $2}')
neutron lbaas-member-create pool1 --address $(nova show member2 | awk '/private network/ {a = substr($5, 0, length($5)-1); if (a ~ "\\.") print a; else print $6}') --protocol-port 80 --subnet $(neutron subnet-list | awk '/ private-subnet / {print $2}')
测试
- 对于一个简单的示例,我们的成员可以运行一个简单的 Web 服务器
while true; do echo -e 'HTTP/1.0 200 OK\r\n\r\nIt Works member<N>!' | sudo nc -l -p 80 ; done
验证响应
curl -k https://$(neutron lbaas-loadbalancer-list | awk '/ lb1 / {print $6}')
应该得到
It Works member<N>!
验证 SNI
openssl s_client -servername test2@stacme.com -connect $(neutron lbaas-loadbalancer-list | awk '/ lb1 / {print $6}'):443
证书信息应打印到屏幕上,验证 CN 是否与传递给 '-servername' 的 CN 匹配