ホストベースのファイアウォール
このトピックでは、Contrail Networking リリース 2003 で導入されたホストベースのファイアウォール機能について説明します。
ホストベースファイアウォールの概要
Contrail Networking リリース 2003 は、cSRX デバイスを使用した次世代ファイアウォールの作成を可能にするホストベース ファイアウォール機能の ベータ サポートを提供します。次世代ファイアウォールは、アプリケーションに基づいてパケットをフィルタリングする機能を提供します。アプリケーションレベルで侵入検出および防止機能を備えたディープパケットインスペクションを提供します。
これまで、vRouter は通常のレイヤー 4 ファイアウォール ポリシーの作成をサポートしてきました。Contrail Networkingは、レイヤー7のアプリケーションレベルのファイアウォールポリシーを作成するために、サービスチェイニングを使用します。ただし、サービスチェイニングは仮想ネットワークトラフィックの場合にのみ機能し、仮想ネットワーク内トラフィックには機能しません。ホストベースのファイアウォール機能は、同じ仮想ネットワークだけでなく、異なるネットワークで発生するトラフィックにも終わるトラフィックに次世代ファイアウォール機能を提供します。ファイアウォール インスタンスがパケット形式やレイヤー 2 ヘッダーを変更せず、レイヤー 7 ポリシーをパケットに適用するワイヤー モードで bump を使用します。
さらに、ホストベースのファイアウォール機能は、タグベースのポリシーを使用してトラフィックを誘導します。タグは、ファイアウォールインテントを適用するシンプルで直感的な方法であり、複数のVNにまたがる機能を備え、拡張性を高め、サービスチェーンとは対照的にVMIレベルでアタッチできます。タグベースのポリシーを使用して、トラフィックをホストベースのファイアウォールインスタンスに誘導できます。ホストベースのファイアウォールインスタンスにはかなりのコンピューティングリソースが必要なため、ポリシーを使用して特定のトラフィックのみを誘導します。
また、ホストベースのファイアウォールは、ワークロードに近い次世代ファイアウォール機能を提供し、サードパーティー製ファイアウォール機能と統合できます。
ホストベースファイアウォールの導入
ホストベースのファイアウォールを導入するには、次の手順を実行します。この例では、Kubernetes をオーケストレーション プラットフォームとして使用しています。Kubernetes は、選択したコンピューティング ノードでホストベースのファイアウォール インスタンスを柔軟にインスタンス化できるからです。ステップの大まかなリストは次のとおりです。
前提 条件
Contrail-ansible deployer または Contrail Command のいずれかを使用して、Contrail-Kubernetes セットアップをインストールします。Contrail コマンド UI を使用した Kubernetes クラスタのプロビジョニング または スタンドアロン Kubernetes Contrail クラスタのインストールを参照してください。
トポロジ
次のサンプル Contrail-Kubernetes トポロジーと instances.yml ファイルを 検討してください。
サンプル instances.yaml ファイル
deployment: orchestrator: kubernetes deployer: contrail-ansible-deployer provider_config: bms: ssh_pwd: <password> ssh_user: username ntpserver: <IP NTP server> domainsuffix: <domain-suffix> instances: server1: provider: bms ip: 10.xx.xx.52 roles: config_database: config: control: analytics_database: analytics: webui: k8s_master: kubemanager: server2: provider: bms ip: 10.xx.xx.53 roles: k8s_node: vrouter: VROUTER_GATEWAY: 77.xx.x.100 global_configuration: CONTAINER_REGISTRY: 50.xx.xx.50:5000 REGISTRY_PRIVATE_INSECURE: True contrail_configuration: CONTRAIL_VERSION: <contrail-version> CLOUD_ORCHESTRATOR: kubernetes CONTROLLER_NODES: 10.xx.xx.52 CONTROL_NODES: 77.xx.xx.20 KUBERNETES_API_NODES: 77.xx.xx.20 KUBERNETES_API_SERVER: 77.xx.xx.20 CONTAINER_REGISTRY: 50.xx.xx.50:5000 REGISTRY_PRIVATE_INSECURE: True VROUTER_GATEWAY: 77.xx.x.100
導入手順
手順
手順
ホストベースのファイアウォールを導入します。
Kubernetes で名前空間を作成します。名前空間が Contrail で同等のプロジェクトを作成します。
手順
名前空間を作成します。
kubectl create namespace hbf
名前空間の分離を有効にします。
kubectl annotate namespace hbf "opencontrail.org/isolation"="true"
名前空間の作成を検証します。
kubectl get ns hbf NAME STATUS AGE hbf Active 2d5h
ホストベースファイアウォール機能のコンピューティングノードにラベルを付けます。
手順
コンピューティング ノードのリストを取得します。
kubectl get nodes NAME STATUS ROLES AGE VERSION Server2 Ready <none> 16d v1.12.9 server1 NotReady master 16d v1.12.9
ホストベースファイアウォール機能のノードを選択し、ラベル付けします。
kubectl label node server type=hbf
Kubernetesノード名はどこに server あり、 hbf はラベルです。
cSRXイメージをプルするために前に作成した名前空間にKubernetesシークレットオブジェクトを作成します。
kubectl create secret docker-registry hbf --docker-server=hub.juniper.net/security --docker-username=testuser --docker-password=testpassword -n hbf
以前に作成した hbs 名前空間にオブジェクトを作成します。
手順
以下のコンテンツを含む python ファイルを作成し、config_api Docker コンテナで次のコマンドを使用します。
docker exec -it config_api_1 bash (config-api)[root@server /]$ python hbs.py
-
cat hbs.py ---------------- from vnc_api import * from vnc_api.vnc_api import VncApi from vnc_api.vnc_api import Project from vnc_api.vnc_api import HostBasedService from vnc_api.exceptions import NoIdError from vnc_api.gen.resource_xsd import QuotaType hbs_name = ‘hbs’ # any other user defined name can be given project_name = ‘k8s-hbf’ # k8s is the default cluster name # user can change according to their admin_user = 'admin' admin_password = '<admin-password>' admin_project = 'admin' api_node_ip = '10.xx.xx.52' # change according to your topology api_node_port = '8082' # config api port default_domain = 'default-domain' if __name__ == "__main__": api = VncApi( username=admin_user, password=admin_password, tenant_name=admin_project, api_server_host=api_node_ip, api_server_port=api_node_port) '''Creates a project using vnc apis if it doesn’t exist already and enable hbf, if it’s not enabled already''' try: project = api.project_read(fq_name=[default_domain, project_name]) except NoIdError: project = Project(name=project_name) puuid = api.project_create(project) project = api.project_read(fq_name=[default_domain, project_name]) project.set_quota(QuotaType(host_based_service=1)) api.project_update(project) try: hbs = api.host_based_service_read(fq_name=project.fq_name + [hbs_name]) hbs_created = False except NoIdError: hbs = HostBasedService(hbs_name, parent_obj=project) hbs_created = True if hbs_created: api.host_based_service_create(hbs) else: api.host_based_service_update(hbs)
ホストベースファイアウォールインスタンスのデーモンセットを作成します。デフォルトでは、ホストベースのファイアウォールインスタンスは、すべてのコンピューティングノードで実行されます。 2.bに示すように、特定のコンピューティングノード上でのみホストベースのファイアウォールインスタンスを実行するように選択できます。ホストベースのファイアウォールインスタンスには、3つのインターフェイスがあります。トラフィックは左のインターフェイスに流れ、ファイアウォール機能はパケットで実行され、トラフィックは正しいインターフェイスから流れ出ます。管理インターフェイスは、デフォルトのポッドネットワークです。
手順
次の例に示すように 、ds.yaml ファイルを生成して、cSRXコンテナイメージでデーモンセットを作成します。左右のインターフェイスが自動的に作成され、オブジェクトに hbs 「左」と「右」でリンクされるため、ホストベースのファイアウォール用にマークされたトラフィック フローが cSRX デバイスを経由します。Kubernetes オブジェクトの名前と値は、要件に従って変更できます。
cat ds.yaml ----------- apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: annotations: opencontrail.org/network: '{"domain":"default-domain", "project":"k8s-hbf", "name":"__hbs-hbf-left__"}' name: left namespace: hbf spec: config: '{"cniVersion":"0.3.0", "type": "contrail-k8s-cni" }' --- apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: annotations: opencontrail.org/network: '{"domain":"default-domain", "project":"k8s-hbf", "name":"__hbs-hbf-right__"}' name: right namespace: hbf spec: config: '{"cniVersion":"0.3.0", "type": "contrail-k8s-cni" }' --- apiVersion: apps/v1 kind: DaemonSet metadata: labels: type: hbf name: hbf namespace: hbf spec: selector: matchLabels: type: hbf template: metadata: annotations: k8s.v1.cni.cncf.io/networks: '[{"name":"left"}, {"name":"right"}]' labels: type: hbf spec: containers: - env: - name: CSRX_FORWARD_MODE value: wire image: hub.juniper.net/security/csrx:19.2R1.8 name: csrx securityContext: privileged: true stdin: true tty: false imagePullSecrets: - name: hbf nodeSelector: type: hbf restartPolicy: Always
Kubernetesオブジェクトを作成すると、各名前空間の各コンピューティングノード上に左右のインターフェイスを備えたcSRXポッドが作成されます。
kubectl create -f ds.yaml
オブジェクト、デーモンセット、ネットワーク添付ファイルの定義、およびcSRXポッドを確認します。
kubectl get ds -n hbf NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE hbf 1 1 1 1 1 type=hbf 34h kubectl get network-attachment-definitions -n hbf NAME AGE left 34h right 34h [root@nodeg12 ~]# kubectl get pods -n hbf NAME READY STATUS RESTARTS AGE csrx-75ncs 1/1 Running 0 34h csrx-9qxl7 1/1 Running 0 34h
各コンピューティングノードでデーモンセットのcSRXポッドを以下の設定で設定します。
set interfaces ge-0/0/0 unit 0 set interfaces ge-0/0/1 unit 0 set security policies default-policy permit-all set security zones security-zone trust interfaces ge-0/0/0.0 set security zones security-zone untrust interfaces ge-0/0/1.0 commit
vnc API または Contrail Command を使用して、左右のインターフェイス間にネットワーク ポリシーを作成します。
ネットワークポリシーは、仮想ネットワーク間のトラフィックにのみ必要であり、仮想ネットワーク内トラフィックには必要ありません。
docker exec -it config_api_1 bash (config-api)[root@server /]$ python nwp.py cat nwp.py ========== from vnc_api import * from vnc_api import vnc_api from vnc_api.vnc_api import VncApi from vnc_api.vnc_api import Project from vnc_api.exceptions import NoIdError policy_name = 'allow-left-right'. # any policy name if __name__ == "__main__": vn_left = api.virtual_network_read(fq_name= \ [default_domain, project_name, 'k8s-left-pod-network']) vn_right = api.virtual_network_read(fq_name= \ [default_domain, project_name, 'k8s-right-pod-network']) policy_obj = vnc_api.NetworkPolicy(policy_name, network_policy_entries= \ vnc_api.PolicyEntriesType([vnc_api.PolicyRuleType(direction='<>', \ action_list=vnc_api.ActionListType(simple_action='pass'), \ protocol='any', \ src_addresses=[vnc_api.AddressType( virtual_network=vn_left.get_fq_name_str())], \ src_ports=[vnc_api.PortType(-1, -1)], \ dst_addresses=[vnc_api.AddressType( virtual_network=vn_right.get_fq_name_str())], \ dst_ports=[vnc_api.PortType(-1, -1)])]), \ parent_obj=project) api.network_policy_create(policy_obj) vn_left.add_network_policy(policy_obj, \ vnc_api.VirtualNetworkPolicyType(sequence=vnc_api.SequenceType(0, 0))) vn_right.add_network_policy(policy_obj, \ vnc_api.VirtualNetworkPolicyType(sequence=vnc_api.SequenceType(0, 0))) api.virtual_network_update(vn_left) api.virtual_network_update(vn_right)
ファイアウォールポリシーを作成し、ファイアウォールルールに対してホストベースのファイアウォールを有効にします。
プロジェクトスコープのルールの下に、タグ、アプリケーションポリシーセット(APS)を作成し、ファイアウォールポリシーとファイアウォールルールを作成します。ファイアウォール ルールに基づいてホストベースのファイアウォールを有効にし、host_based_service = True に設定します。
cat add_hbs_fr.py ------------------ from vnc_api import * from vnc_api import vnc_api from vnc_api.vnc_api import VncApi from vnc_api.vnc_api import Project from vnc_api.vnc_api import HostBasedService from vnc_api.vnc_api import FirewallRule, FirewallServiceType, PortType, FirewallRuleEndpointType from vnc_api.exceptions import NoIdError from vnc_api.vnc_api import ActionListType if __name__ == "__main__": try : rule = api.firewall_rule_read(fq_name=fr_fq_name) #fr_fq_name = [default_domain,project_name,<firewall rule> except NoIdError: rule = api.firewall_rule_create(rule_obj) rule = api.firewall_rule_read(rule_obj) rule.set_action_list( ActionListType(host_based_service=True,simple_action="pass")) api.firewall_rule_update(rule) fwp.add_firewall_rule(rule)
トラフィックがホストベースのファイアウォールを通過すると、対応するコンピューティングノード上のcSRXが、ホストベースのファイアウォールフローとそれぞれのセッションを作成します。
vrouter-agent)[root@nodec61 /]$ flow -l --match 1.xx.xx.251 Flow table(size 161218560, entries 629760) Listing flows matching ([1.xx.xx.251]:*) Index Source:Port/Destination:Port Proto(V) ------------------------------------------------------------------------------------------------------------------- 320632<=>327760 1.xx.xx.251:407 1 (8->12) 2.xx.xx.251:0 (Gen: 4, K(nh):95, Action:F, Flags:, QOS:-1, S(nh):95, Stats:21/2058,SPort 49640, TTL 0, HbsLeft, Sinfo 12.0.0.0) 327760<=>320632 2.xx.xx.251:407 1 (8->12) 1.xx.xx.251:0 (Gen: 3, K(nh):95, Action:F, Flags:, QOS:-1, S(nh):24, Stats:20/1680, SPort 61330, TTL 0, HbsRight, Sinfo 77.xx.xx.21) On csrx ======== root@csrx-7vhn6> show security flow session Session ID: 76342, Policy name: default-policy-logical-system-00/2, Timeout: 4, Valid In: 2.xx.xx.251/407 --> 1.xx.xx.251/128;icmp, Conn Tag: 0x0, If: ge-0/0/1.0, Pkts: 1, Bytes: 98, Out: 1.xx.xx.251/128 --> 2.xx.xx.251/407;icmp, Conn Tag: 0x0, If: ge-0/0/0.0, Pkts: 0, Bytes: 0, Total sessions: 1