21.3. 프로젝트에 대한 송신 방화벽 구성
클러스터 관리자는 OpenShift Container Platform 클러스터에서 나가는 송신 트래픽을 제한하는 프로젝트에 대한 송신 방화벽을 생성할 수 있습니다.
21.3.1. 프로젝트에서 송신 방화벽이 작동하는 방식
클러스터 관리자는 송신 방화벽을 사용하여 일부 또는 모든 Pod가 클러스터 내에서 액세스할 수 있는 외부 호스트를 제한할 수 있습니다. 송신 방화벽은 다음 시나리오를 지원합니다.
- Pod는 내부 호스트에만 연결할 수 있으며 공용 인터넷 연결을 시작할 수 없습니다.
- Pod는 공용 인터넷에만 연결할 수 있으며 OpenShift Container Platform 클러스터 외부에 있는 내부 호스트에 대한 연결을 시작할 수 없습니다.
- Pod는 지정된 내부 서브넷이나 OpenShift Container Platform 클러스터 외부의 호스트에 연결할 수 없습니다.
- Pod는 특정 외부 호스트에만 연결할 수 있습니다.
예를 들어, 한 프로젝트가 지정된 IP 범위에 액세스하도록 허용하지만 다른 프로젝트에 대한 동일한 액세스는 거부할 수 있습니다. 또는 애플리케이션 개발자가 Python pip 미러에서 업데이트하지 못하도록 하고 승인된 소스에서만 업데이트를 수행하도록 할 수 있습니다.
송신 방화벽은 호스트 네트워크 네임스페이스에 적용되지 않습니다. 호스트 네트워킹이 활성화된 Pod는 송신 방화벽 규칙의 영향을 받지 않습니다.
EgressNetworkPolicy CR(사용자 정의 리소스) 오브젝트를 만들어 송신 방화벽 정책을 구성합니다. 송신 방화벽은 다음 기준 중 하나를 충족하는 네트워크 트래픽과 일치합니다.
- CIDR 형식의 IP 주소 범위
- IP 주소로 확인되는 DNS 이름
송신 방화벽에 0.0.0.0/0
에 대한 거부 규칙이 포함된 경우 OpenShift Container Platform API 서버에 대한 액세스 권한이 차단됩니다. Pod가 OpenShift Container Platform API 서버에 액세스할 수 있도록 하려면 EgressFirewall과 함께 노드 포트를 사용할 때 액세스할 수 있도록 OVN(Open Virtual Network)의 기본 연결 네트워크 100.64.0.0/16
을 포함해야 합니다. 다음 예와 같이 송신 방화벽 규칙에서 API 서버가 청취하는 IP 주소 범위도 포함해야 합니다.
apiVersion: network.openshift.io/v1 kind: EgressNetworkPolicy metadata: name: default namespace: <namespace> 1 spec: egress: - to: cidrSelector: <api_server_address_range> 2 type: Allow # ... - to: cidrSelector: 0.0.0.0/0 3 type: Deny
API 서버의 IP 주소를 찾으려면 oc get ep kubernetes -n default
를 실행합니다.
자세한 내용은 BZ#1988324에서 참조하십시오.
송신 방화벽을 구성하려면 네트워크 정책 또는 다중 테넌트 모드를 사용하도록 OpenShift SDN을 구성해야 합니다.
네트워크 정책 모드를 사용하는 경우 송신 방화벽은 네임스페이스당 하나의 정책과만 호환되며 글로벌 프로젝트와 같이 네트워크를 공유하는 프로젝트에서는 작동하지 않습니다.
송신 방화벽 규칙은 라우터를 통과하는 트래픽에는 적용되지 않습니다. Route CR 오브젝트를 생성할 권한이 있는 모든 사용자는 허용되지 않은 대상을 가리키는 경로를 생성하여 송신 방화벽 정책 규칙을 바이패스할 수 있습니다.
21.3.1.1. 송신 방화벽의 제한
송신 방화벽에는 다음과 같은 제한이 있습니다.
- EgressNetworkPolicy 오브젝트를 두 개 이상 보유할 수 있는 프로젝트는 없습니다.
- 프로젝트당 최대 1000개의 규칙이 있는 최대 하나의 EgressNetworkPolicy 오브젝트를 정의할 수 있습니다.
-
기본
프로젝트는 송신 방화벽을 사용할 수 없습니다. 다중 테넌트 모드에서 OpenShift SDN 기본 컨테이너 네트워크 인터페이스(CNI) 네트워크 공급자를 사용하는 경우 다음 제한 사항이 적용됩니다.
-
글로벌 프로젝트는 송신 방화벽을 사용할 수 없습니다.
oc adm pod-network make-projects-global
명령을 사용하여 프로젝트를 글로벌로 만들 수 있습니다. -
oc adm pod-network join-projects
명령을 사용하여 병합된 프로젝트는 결합된 프로젝트에서 송신 방화벽을 사용할 수 없습니다.
-
글로벌 프로젝트는 송신 방화벽을 사용할 수 없습니다.
이러한 제한 사항을 위반하면 프로젝트의 송신 방화벽이 손상되고 모든 외부 네트워크 트래픽이 삭제될 수 있습니다.
Egress 방화벽 리소스는 kube-node-lease
,kube-public
,kube-system
,openshift
및 openshift-
프로젝트에서 생성할 수 있습니다.
21.3.1.2. 송신 방화벽 정책 규칙에 대한 일치 순서
송신 방화벽 정책 규칙은 정의된 순서대로 처음부터 마지막까지 평가됩니다. Pod의 송신 연결과 일치하는 첫 번째 규칙이 적용됩니다. 해당 연결에 대한 모든 후속 규칙은 무시됩니다.
21.3.1.3. DNS(Domain Name Server) 확인 작동 방식
송신 방화벽 정책 규칙에서 DNS 이름을 사용하는 경우 도메인 이름의 적절한 확인에는 다음 제한 사항이 적용됩니다.
- 도메인 이름 업데이트는 TTL(Time To- Live) 기간에 따라 폴링됩니다. 기본적으로 기간은 30초입니다. 송신 방화벽 컨트롤러가 도메인 이름을 위해 로컬 이름 서버를 쿼리할 때 응답에 30초 미만 TTL이 포함된 경우 컨트롤러는 반환된 값으로 기간을 설정합니다. 응답의 TTL이 30분보다 크면 컨트롤러에서 기간을 30분으로 설정합니다. TTL이 30초에서 30분 사이인 경우 컨트롤러는 값을 무시하고 기간을 30초로 설정합니다.
- Pod는 필요한 경우 동일한 로컬 이름 서버에서 도메인을 확인해야 합니다. 확인하지 않으면 송신 방화벽 컨트롤러와 Pod에 의해 알려진 도메인의 IP 주소가 다를 수 있습니다. 호스트 이름의 IP 주소가 다르면 송신 방화벽이 일관되게 적용되지 않을 수 있습니다.
- 송신 방화벽 컨트롤러와 Pod는 동일한 로컬 이름 서버를 비동기적으로 폴링하기 때문에 Pod가 송신 컨트롤러보다 먼저 업데이트된 IP 주소를 얻을 수 있으며 이로 인해 경쟁 조건이 발생합니다. 현재 이런 제한으로 인해 EgressNetworkPolicy 오브젝트의 도메인 이름 사용은 IP 주소가 자주 변경되지 않는 도메인에만 권장됩니다.
송신 방화벽은 Pod가 DNS 확인을 위해 Pod가 있는 노드의 외부 인터페이스에 항상 액세스할 수 있도록 합니다.
송신 방화벽 정책에서 도메인 이름을 사용하고 로컬 노드의 DNS 서버에서 DNS 확인을 처리하지 않으면 Pod에서 도메인 이름을 사용하는 경우, DNS 서버의 IP 주소에 대한 액세스를 허용하는 송신 방화벽 규칙을 추가해야 합니다.
21.3.2. EgressNetworkPolicy CR(사용자 정의 리소스) 오브젝트
송신 방화벽에 대해 하나 이상의 규칙을 정의할 수 있습니다. 규칙이 적용되는 트래픽에 대한 사양을 담은 허용
규칙 또는 거부
규칙입니다.
다음 YAML은 EgressNetworkPolicy CR 오브젝트를 설명합니다.
EgressNetworkPolicy 오브젝트
apiVersion: network.openshift.io/v1 kind: EgressNetworkPolicy metadata: name: <name> 1 spec: egress: 2 ...
21.3.2.1. EgressNetworkPolicy 규칙
다음 YAML은 송신 방화벽 규칙 오브젝트를 설명합니다. 송신
스탠자는 하나 이상의 오브젝트 배열을 예상합니다.
송신 정책 규칙 스탠자
egress: - type: <type> 1 to: 2 cidrSelector: <cidr> 3 dnsName: <dns_name> 4
21.3.2.2. EgressNetworkPolicy CR 오브젝트의 예
다음 예는 여러 가지 송신 방화벽 정책 규칙을 정의합니다.
apiVersion: network.openshift.io/v1
kind: EgressNetworkPolicy
metadata:
name: default
spec:
egress: 1
- type: Allow
to:
cidrSelector: 1.2.3.0/24
- type: Allow
to:
dnsName: www.example.com
- type: Deny
to:
cidrSelector: 0.0.0.0/0
- 1
- 송신 방화벽 정책 규칙 오브젝트의 컬렉션입니다.
21.3.3. 송신 방화벽 정책 오브젝트 생성
클러스터 관리자는 프로젝트에 대한 송신 방화벽 정책 오브젝트를 만들 수 있습니다.
프로젝트에 이미 EgressNetworkPolicy 오브젝트가 정의되어 있으면 기존 정책을 편집하여 송신 방화벽 규칙을 변경해야 합니다.
사전 요구 사항
- OpenShift SDN 기본 CNI(Container Network Interface) 네트워크 공급자 플러그인을 사용하는 클러스터입니다.
-
OpenShift CLI(
oc
)를 설치합니다. - 클러스터 관리자로 클러스터에 로그인해야 합니다.
프로세스
다음과 같이 정책 규칙을 생성합니다.
-
<policy_name>
이 송신 정책 규칙을 설명하는<policy_name>.yaml
파일을 만듭니다. - 생성한 파일에서 송신 정책 오브젝트를 정의합니다.
-
다음 명령을 입력하여 정책 오브젝트를 생성합니다.
<policy_name>
을 정책 이름으로 바꾸고<project>
를 규칙이 적용되는 프로젝트로 바꿉니다.$ oc create -f <policy_name>.yaml -n <project>
다음 예제에서는
project1
이라는 프로젝트에 새 EgressNetworkPolicy 오브젝트를 생성합니다.$ oc create -f default.yaml -n project1
출력 예
egressnetworkpolicy.network.openshift.io/v1 created
-
선택사항: 나중에 변경할 수 있도록
<policy_name>.yaml
파일을 저장합니다.