8.6. 송신 방화벽을 사용하여 외부 리소스에 대한 액세스 제한


OpenShift Container Platform 클러스터 관리자는 송신 방화벽 정책을 사용하여 일부 또는 모든 Pod가 클러스터 내에서 액세스할 수 있는 외부 IP 주소를 제한할 수 있습니다. 송신 방화벽 정책에서는 다음 시나리오를 지원합니다.

  • 포드는 내부 호스트에만 연결할 수 있으며 공용 인터넷에 대한 연결을 시작할 수 없습니다.
  • Pod는 공용 인터넷에만 연결할 수 있으며 OpenShift Container Platform 클러스터 외부에 있는 내부 호스트에 대한 연결을 시작할 수 없습니다.
  • Pod는 지정된 내부 서브넷 또는 연결할 수 없는 호스트에 연결할 수 없습니다.

송신 정책은 CIDR 형식으로 IP 주소 범위를 지정하거나 DNS 이름을 지정하여 설정할 수 있습니다. 예를 들어 <project_A> 가 지정된 IP 범위에 액세스할 수 있지만 <project_B> 에 대한 동일한 액세스를 거부할 수 있습니다. 또는 애플리케이션 개발자가 (Python) pip 미러에서 업데이트하지 못하도록 제한하고 승인된 소스에서만 업데이트를 강제로 제공할 수 있습니다.

경고

송신 정책을 통해 Pod 액세스를 제한하려면 ovs-multitenant 또는 ovs-networkpolicy 플러그인을 활성화해야 합니다.

ovs-multitenant 플러그인을 사용하는 경우 송신 정책은 프로젝트당 하나의 정책과만 호환되며 글로벌 프로젝트와 같은 네트워크를 공유하는 프로젝트에서는 작동하지 않습니다.

프로젝트 관리자는 EgressNetworkPolicy 오브젝트 를 생성하거나 프로젝트에서 생성한 개체를 편집할 수 없습니다. 또한 EgressNetworkPolicy 를 생성할 수 있는 몇 가지 제한 사항이 있습니다.

  • 기본 프로젝트(및 oc adm pod-network make-projects-global를 통해 전역적으로 수행된 다른 프로젝트)에는 송신 정책이 없습니다.
  • oc adm pod-network join-projects를 통해 두 개의 프로젝트를 함께 병합하면 결합된 프로젝트에서 송신 정책을 사용할 수 없습니다.
  • 송신 정책 오브젝트가 두 개 이상일 수 있는 프로젝트는 없습니다.

이러한 제한 사항을 위반하면 프로젝트의 송신 정책이 손상되고 모든 외부 네트워크 트래픽이 삭제될 수 있습니다.

oc 명령 또는 REST API를 사용하여 송신 정책을 구성합니다. oc [create|replace|delete] 를 사용하여 EgressNetworkPolicy 오브젝트 를 조작할 수 있습니다. api/swagger-spec/oapi-v1.json 파일에는 오브젝트의 실제 작동 방식에 대한 API 수준의 세부 정보가 있습니다.

송신 정책을 구성하려면 다음을 수행합니다.

  1. 영향을 미칠 프로젝트로 이동합니다.
  2. 다음 예와 같이 사용할 정책 구성을 사용하여 JSON 파일을 생성합니다.

    {
        "kind": "EgressNetworkPolicy",
        "apiVersion": "v1",
        "metadata": {
            "name": "default"
        },
        "spec": {
            "egress": [
                {
                    "type": "Allow",
                    "to": {
                        "cidrSelector": "1.2.3.0/24"
                    }
                },
                {
                    "type": "Allow",
                    "to": {
                        "dnsName": "www.foo.com"
                    }
                },
                {
                    "type": "Deny",
                    "to": {
                        "cidrSelector": "0.0.0.0/0"
                    }
                }
            ]
        }
    }

    위의 예가 프로젝트에 추가되면 IP 범위 1.2.3.0/24 및 도메인 이름 www.foo.com 에 대한 트래픽을 허용하지만 다른 모든 외부 IP 주소에 대한 액세스를 거부합니다. 정책이 외부 트래픽에만 적용되므로 다른 포드에 대한 트래픽은 영향을 받지 않습니다.

    EgressNetworkPolicy 의 규칙이 순서대로 확인되고 일치하는 첫 번째 규칙이 적용됩니다. 위 예제의 세 규칙이 되돌리면 0.0.0.0/0 규칙이 먼저 확인되므로 트래픽이 1.2.3.0/24www.foo.com 에 허용되지 않으며 모든 트래픽과 일치하고 거부됩니다.

    도메인 이름 업데이트는 로컬 권한이 없는 서버가 반환한 도메인의 TTL(Time to Live) 값을 기준으로 폴링됩니다. 또한 Pod는 필요한 경우 동일한 로컬 이름 서버에서 도메인을 확인해야 합니다. 그렇지 않으면 송신 네트워크 정책 컨트롤러에서 인식하는 도메인의 IP 주소가 다르며 Pod는 다르며 송신 네트워크 정책은 예상대로 적용되지 않을 수 있습니다. 송신 네트워크 정책 컨트롤러와 Pod는 동일한 로컬 이름 서버를 비동기적으로 폴링하므로 Pod에서 송신 컨트롤러 전에 업데이트된 IP를 가져올 수 있는 경쟁 조건이 있을 수 있습니다. 이러한 현재 제한으로 인해 EgressNetworkPolicy 의 도메인 이름 사용은 IP 주소가 자주 변경되지 않는 도메인에만 권장됩니다.

    참고

    송신 방화벽을 사용하면 Pod가 DNS 확인을 위해 Pod가 있는 노드의 외부 인터페이스에 항상 액세스할 수 있습니다. 로컬 노드에서 DNS 확인을 처리하지 않으면 Pod에서 도메인 이름을 사용하는 경우 DNS 서버의 IP 주소에 대한 액세스를 허용하는 송신 방화벽 규칙을 추가해야 합니다.

  3. JSON 파일을 사용하여 EgressNetworkPolicy 오브젝트를 생성합니다.

    $ oc create -f <policy>.json
경고

경로를 생성하여 서비스를 노출하면 EgressNetworkPolicy 가 무시됩니다. 송신 네트워크 정책 서비스 끝점 필터링은 노드 kubeproxy 에서 수행됩니다. 라우터가 연결되어 있으면 kubeproxy 를 우회하고 송신 네트워크 정책 시행이 적용되지 않습니다. 관리자는 경로를 생성하도록 액세스를 제한하여 이 바이패스를 방지할 수 있습니다.

8.6.1. 송신 라우터를 사용하여 외부 리소스를 허용하여 포드 트래픽 파악

OpenShift Container Platform 송신 라우터는 다른 업무에 사용되지 않는 프라이빗 소스 IP 주소를 사용하여 지정된 원격 서버로 트래픽을 리디렉션하는 서비스를 실행합니다. 서비스를 사용하면 포드가 허용된 IP 주소에서만 액세스할 수 있도록 설정된 서버와 통신할 수 있습니다.

중요

출력 라우터는 나가는 모든 연결을 위한 것이 아닙니다. 다수의 송신 라우터를 생성하면 네트워크 하드웨어의 제한을 푸시할 수 있습니다. 예를 들어 모든 프로젝트 또는 애플리케이션에 대해 송신 라우터를 생성하면 소프트웨어에서 MAC 주소 필터링으로 대체하기 전에 네트워크 인터페이스에서 처리할 수 있는 로컬 MAC 주소 수를 초과할 수 있습니다.

중요

현재 송신 라우터는 Amazon AWS, Azure Cloud 또는 macvlan 트래픽과의 비호환성으로 인해 계층 2 조작을 지원하지 않는 기타 클라우드 플랫폼과 호환되지 않습니다.

배포 고려 사항

Egress 라우터는 노드의 기본 네트워크 인터페이스에 두 번째 IP 주소와 MAC 주소를 추가합니다. 베어 메탈에서 OpenShift Container Platform을 실행하지 않는 경우 추가 주소를 허용하도록 하이퍼바이저 또는 클라우드 공급자를 구성해야 할 수 있습니다.

Red Hat OpenStack Platform

Red Hat OpenStack Platform에 OpenShift Container Platform을 배포하는 경우 OpenStack 환경에서 IP 및 MAC 주소를 허용 목록에 추가해야 합니다. 그렇지 않으면 통신에 실패합니다.

neutron port-update $neutron_port_uuid \
  --allowed_address_pairs list=true \
  type=dict mac_address=<mac_address>,ip_address=<ip_address>
Red Hat Enterprise Virtualization
Red Hat Enterprise Virtualization을 사용하는 경우 EnableMACAntiSpoofingFilterRulesfalse 로 설정해야 합니다.
VMware vSphere
VMware vSphere를 사용하는 경우 vSphere 표준 스위치 보안을 위한 VMWare 설명서를 참조하십시오. vSphere Web Client에서 호스트의 가상 스위치를 선택하여 VMWare vSphere 기본 설정을 보고 변경합니다.

특히 다음이 활성화되어 있는지 확인하십시오.

송신 라우터 모드

송신 라우터는 리디렉션 모드,HTTP 프록시 모드 및 DNS 프록시 모드의 세 가지 모드로 실행될 수 있습니다. 리디렉션 모드는 HTTP 및 HTTPS를 제외한 모든 서비스에서 작동합니다. HTTP 및 HTTPS 서비스의 경우 HTTP 프록시 모드를 사용하십시오. IP 주소 또는 도메인 이름이 있는 TCP 기반 서비스는 DNS 프록시 모드를 사용하십시오.

8.6.1.1. 리디렉션 모드에서 송신 라우터 Pod 배포

리디렉션 모드에서 송신 라우터는 자체 IP 주소에서 하나 이상의 대상 IP 주소로 트래픽을 리디렉션하도록 iptables 규칙을 설정합니다. 예약된 소스 IP 주소를 사용하려는 클라이언트 Pod는 대상 IP에 직접 연결하는 대신 송신 라우터에 연결하도록 수정해야 합니다.

  1. 다음을 사용하여 Pod 구성을 생성합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: egress-1
      labels:
        name: egress-1
      annotations:
        pod.network.openshift.io/assign-macvlan: "true" 1
    spec:
      initContainers:
      - name: egress-router
        image: registry.redhat.io/openshift3/ose-egress-router
        securityContext:
          privileged: true
        env:
        - name: EGRESS_SOURCE 2
          value: 192.168.12.99/24
        - name: EGRESS_GATEWAY 3
          value: 192.168.12.1
        - name: EGRESS_DESTINATION 4
          value: 203.0.113.25
        - name: EGRESS_ROUTER_MODE 5
          value: init
      containers:
      - name: egress-router-wait
        image: registry.redhat.io/openshift3/ose-pod
      nodeSelector:
        site: springfield-1 6
    1
    기본 네트워크 인터페이스에서 Macvlan 네트워크 인터페이스를 만들고 egress-router 컨테이너를 시작하기 전에 Pod의 네트워크 프로젝트로 이동합니다. "true" 로 따옴표를 보존합니다. 생략하면 오류가 발생합니다. 기본 인터페이스가 아닌 네트워크 인터페이스에서 Macvlan 인터페이스를 생성하려면 주석 값을 해당 인터페이스 이름으로 설정합니다. 예를 들면 eth1입니다.
    2
    노드가 있고 이 포드에서 사용하도록 클러스터 관리자가 예약한 실제 네트워크의 IP 주소입니다. 선택적으로 서브넷 길이 /24 접미사를 포함하여 로컬 서브넷 경로를 설정할 수 있습니다. 서브넷 길이를 지정하지 않으면 송신 라우터에서 EGRESS_GATEWAY 변수로 지정된 호스트에만 액세스하고 서브넷의 다른 호스트에는 액세스할 수 없습니다.
    3
    노드에서 사용하는 기본 게이트웨이와 동일한 값입니다.
    4
    트래픽을 전달할 외부 서버입니다. 이 예제를 사용하면 포드에 대한 연결이 소스 IP 주소가 192.168.12.99인 203.0.113.25로 리디렉션됩니다.
    5
    이는 송신 라우터 이미지가 "init 컨테이너"로 배포됨을 알려줍니다. 이전 버전의 OpenShift Container Platform(및 송신 라우터 이미지)은 이 모드를 지원하지 않으며 일반 컨테이너로 실행해야 했습니다.
    6
    포드는 레이블이 site=springfield-1 인 노드에만 배포됩니다.
  2. 위의 정의를 사용하여 Pod를 생성합니다.

    $ oc create -f <pod_name>.json

    Pod가 생성되었는지 확인하려면 다음을 수행합니다.

    $ oc get pod <pod_name>
  3. 송신 라우터를 가리키도록 서비스를 생성하여 다른 Pod에서 Pod의 IP 주소를 찾을 수 있는지 확인합니다.

    apiVersion: v1
    kind: Service
    metadata:
      name: egress-1
    spec:
      ports:
      - name: http
        port: 80
      - name: https
        port: 443
      type: ClusterIP
      selector:
        name: egress-1

    이제 Pod에서 이 서비스에 연결할 수 있습니다. 이러한 연결은 예약된 송신 IP 주소를 사용하여 외부 서버의 해당 포트로 리디렉션됩니다.

송신 라우터 설정은 openshift3/ose-egress-router 이미지에서 생성된 "init 컨테이너"에서 수행되며, 해당 컨테이너는 Macvlan 인터페이스를 구성하고 iptables 규칙을 설정할 수 있도록 권한이 부여됩니다. iptables 규칙 설정이 완료되면 종료되고 pod가 종료될 때까지 openshift3/ose-pod 컨테이너가 실행(아무 것도 수행하지 않음)됩니다.

환경 변수는 사용할 주소를 송신 라우터 이미지에 알립니다. EGRESS_ GATEWAY 를 게이트웨이로 사용하여 EGRESS_SOURCE 를 IP 주소로 사용하도록 Macvlan 인터페이스를 구성합니다.

NAT 규칙은 Pod의 클러스터 IP 주소의 TCP 또는 UDP 포트에 대한 연결이 EGRESS_DESTINATION 의 동일한 포트로 리디렉션되도록 설정됩니다.

클러스터의 일부 노드만 지정된 소스 IP 주소를 요청하고 지정된 게이트웨이를 사용할 수 있는 경우 허용 가능한 노드를 나타내는 nodeName 또는 nodeSelector를 지정할 수 있습니다.

8.6.1.2. 여러 대상으로 리디렉션

이전 예에서 모든 포트의 송신 포드(또는 해당 서비스)에 대한 연결은 단일 대상 IP로 리디렉션됩니다. 포트에 따라 다양한 대상 IP를 구성할 수도 있습니다.

apiVersion: v1
kind: Pod
metadata:
  name: egress-multi
  labels:
    name: egress-multi
  annotations:
    pod.network.openshift.io/assign-macvlan: "true"
spec:
  initContainers:
  - name: egress-router
    image: registry.redhat.io/openshift3/ose-egress-router
    securityContext:
      privileged: true
    env:
    - name: EGRESS_SOURCE 1
      value: 192.168.12.99/24
    - name: EGRESS_GATEWAY
      value: 192.168.12.1
    - name: EGRESS_DESTINATION 2
      value: |
        80   tcp 203.0.113.25
        8080 tcp 203.0.113.26 80
        8443 tcp 203.0.113.26 443
        203.0.113.27
    - name: EGRESS_ROUTER_MODE
      value: init
  containers:
  - name: egress-router-wait
    image: registry.redhat.io/openshift3/ose-pod
1
노드가 있고 이 포드에서 사용하도록 클러스터 관리자가 예약한 실제 네트워크의 IP 주소입니다. 선택적으로 서브넷 길이 /24 접미사를 포함하여 로컬 서브넷 경로를 설정할 수 있습니다. 서브넷 길이를 지정하지 않으면 송신 라우터에서 EGRESS_GATEWAY 변수로 지정된 호스트에만 액세스하고 서브넷의 다른 호스트에는 액세스할 수 없습니다.
2
EGRESS_DESTINATION 은 해당 값에 YAML 구문을 사용하며 여러 줄 문자열일 수 있습니다. 자세한 내용은 다음을 참조하십시오.

EGRESS_DESTINATION 의 각 줄은 다음 세 가지 유형 중 하나일 수 있습니다.

  • <port> <protocol> <IP_address> - 지정된 <port> 에 대한 수신되는 연결을 지정된 <IP_address>의 동일한 포트로 리디렉션해야 합니다. <protocol>tcp 또는 udp 입니다. 위의 예에서 첫 번째 줄은 트래픽을 로컬 포트 80에서 203.0.113.25의 포트 80으로 리디렉션합니다.
  • <port> <protocol> <IP_address> <remote_port> - 연결이 < IP_address>의 다른 <remote_port> 로 리디렉션된다는 점을 제외하고는 위와 같습니다. 위의 예에서 두 번째 및 세 번째 줄은 로컬 포트 8080 및 8443을 203.0.113.26의 원격 포트 80 및 443으로 리디렉션합니다.
  • <fallback_IP_address> - EGRESS_DESTINATION 의 마지막 줄이 단일 IP 주소인 경우 다른 포트의 모든 연결이 해당 IP 주소의 해당 포트(예: 위의 예에서 203.0.113.27)로 리디렉션됩니다. 대체 IP 주소가 없으면 다른 포트의 연결이 단순히 거부됩니다.)

8.6.1.3. ConfigMap을 사용하여 EGRESS_DESTINATION 지정

대규모 또는 자주 변경되는 대상 매핑 세트의 경우 ConfigMap을 사용하여 목록을 외부적으로 유지 관리하고 송신 라우터 Pod에서 해당 매핑을 읽도록 할 수 있습니다. 이는 프로젝트 관리자가 ConfigMap을 편집할 수 있는 장점이 있지만 권한 있는 컨테이너가 포함되어 있기 때문에 Pod 정의를 직접 편집하지 못할 수 있습니다.

  1. EGRESS_DESTINATION 데이터가 포함된 파일을 생성합니다.

    $ cat my-egress-destination.txt
    # Egress routes for Project "Test", version 3
    
    80   tcp 203.0.113.25
    
    8080 tcp 203.0.113.26 80
    8443 tcp 203.0.113.26 443
    
    # Fallback
    203.0.113.27

    빈 줄과 주석을 이 파일에 넣을 수 있습니다.

  2. 파일에서 ConfigMap 오브젝트를 생성합니다.

    $ oc delete configmap egress-routes --ignore-not-found
    $ oc create configmap egress-routes \
      --from-file=destination=my-egress-destination.txt

    여기서 egress-routes 는 생성되는 ConfigMap 오브젝트의 이름이고 my-egress-destination.txt 는 데이터를 읽을 파일의 이름입니다.

  3. 위와 같이 송신 라우터 Pod 정의를 생성하되 환경 섹션에서 EGRESS_DESTINATION 에 대한 ConfigMap을 지정합니다.

        ...
        env:
        - name: EGRESS_SOURCE 1
          value: 192.168.12.99/24
        - name: EGRESS_GATEWAY
          value: 192.168.12.1
        - name: EGRESS_DESTINATION
          valueFrom:
            configMapKeyRef:
              name: egress-routes
              key: destination
        - name: EGRESS_ROUTER_MODE
          value: init
        ...
    1
    노드가 있고 이 포드에서 사용하도록 클러스터 관리자가 예약한 실제 네트워크의 IP 주소입니다. 선택적으로 서브넷 길이 /24 접미사를 포함하여 로컬 서브넷 경로를 설정할 수 있습니다. 서브넷 길이를 지정하지 않으면 송신 라우터에서 EGRESS_GATEWAY 변수로 지정된 호스트에만 액세스하고 서브넷의 다른 호스트에는 액세스할 수 없습니다.
참고

출력 라우터는 ConfigMap이 변경되면 자동으로 업데이트되지 않습니다. 포드를 다시 시작하여 업데이트를 가져옵니다.

8.6.1.4. 송신 라우터 HTTP 프록시 Pod 배포

HTTP 프록시 모드에서는 송신 라우터가 포트 8080 에서 HTTP 프록시로 실행됩니다. 이 방법은 HTTP 또는 HTTPS 기반 서비스에 대한 통신 클라이언트에서만 작동하지만 일반적으로 클라이언트 포드를 덜 변경하여 작동하도록 해야 합니다. 환경 변수를 설정하여 HTTP 프록시를 사용하도록 프로그램을 지정할 수 있습니다.

  1. 예를 들어 다음을 사용하여 Pod를 생성합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: egress-http-proxy
      labels:
        name: egress-http-proxy
      annotations:
        pod.network.openshift.io/assign-macvlan: "true" 1
    spec:
      initContainers:
      - name: egress-router-setup
        image: registry.redhat.io/openshift3/ose-egress-router
        securityContext:
          privileged: true
        env:
        - name: EGRESS_SOURCE 2
          value: 192.168.12.99/24
        - name: EGRESS_GATEWAY 3
          value: 192.168.12.1
        - name: EGRESS_ROUTER_MODE 4
          value: http-proxy
      containers:
      - name: egress-router-proxy
        image: registry.redhat.io/openshift3/ose-egress-http-proxy
        env:
        - name: EGRESS_HTTP_PROXY_DESTINATION 5
          value: |
            !*.example.com
            !192.168.1.0/24
            *
    1
    기본 네트워크 인터페이스에서 Macvlan 네트워크 인터페이스를 만든 다음 egress-router 컨테이너를 시작하기 전에 Pod의 네트워크 프로젝트로 이동합니다. "true" 로 따옴표를 보존합니다. 생략하면 오류가 발생합니다.
    2
    노드가 있고 이 포드에서 사용하도록 클러스터 관리자가 예약한 실제 네트워크의 IP 주소입니다. 선택적으로 서브넷 길이 /24 접미사를 포함하여 로컬 서브넷 경로를 설정할 수 있습니다. 서브넷 길이를 지정하지 않으면 송신 라우터에서 EGRESS_GATEWAY 변수로 지정된 호스트에만 액세스하고 서브넷의 다른 호스트에는 액세스할 수 없습니다.
    3
    노드 자체에서 사용하는 기본 게이트웨이와 동일한 값입니다.
    4
    이는 송신 라우터 이미지가 HTTP 프록시의 일부로 배포 중임을 나타내므로 iptables 리디렉션 규칙을 설정하지 않아야 합니다.
    5
    프록시 구성 방법을 지정하는 문자열 또는 여러 줄로 된 YAML 문자열입니다. 이 문자열은 init 컨테이너의 다른 환경 변수가 아닌 HTTP 프록시 컨테이너의 환경 변수로 지정됩니다.

    EGRESS_HTTP_PROXY_DESTINATION 값에 대해 다음 중 하나를 지정할 수 있습니다. * 를 사용할 수도 있습니다. 즉, "모든 원격 대상에 대한 연결을 허용"할 수 있습니다. 구성의 각 줄은 허용 또는 거부할 하나의 연결 그룹을 지정합니다.

    • IP 주소(예: 192.168.1.1)는 해당 IP 주소에 대한 연결을 허용합니다.
    • CIDR 범위(예: 192.168.1.0/24)는 해당 CIDR 범위에 대한 연결을 허용합니다.
    • 호스트 이름(예: www.example.com)은 해당 호스트에 대한 프록시를 허용합니다.
    • *(예: *. example.com) 앞에 있는 도메인 이름은 해당 도메인 및 모든 하위 도메인에 대한 프록시를 허용합니다.
    • 그만큼 ! 위의 모든 연결을 거부합니다. 허용하지 않고
    • 마지막 줄이 * 이면 거부되지 않은 모든 사항이 허용됩니다. 그렇지 않으면 허용되지 않은 모든 것이 거부됩니다.
  2. 송신 라우터를 가리키도록 서비스를 생성하여 다른 Pod에서 Pod의 IP 주소를 찾을 수 있는지 확인합니다.

    apiVersion: v1
    kind: Service
    metadata:
      name: egress-1
    spec:
      ports:
      - name: http-proxy
        port: 8080 1
      type: ClusterIP
      selector:
        name: egress-1
    1
    http 포트가 항상 8080 으로 설정되어 있는지 확인합니다.
  3. http_proxy 또는 https_proxy 변수를 설정하여 HTTP 프록시를 사용하도록 클라이언트 Pod( 송신 프록시 Pod가 아님)를 구성합니다.

        ...
        env:
        - name: http_proxy
          value: http://egress-1:8080/ 1
        - name: https_proxy
          value: http://egress-1:8080/
        ...
    1
    2단계에서 생성된 서비스입니다.
    참고

    모든 설정에 http_proxyhttps_proxy 환경 변수를 사용할 필요는 없습니다. 위 방법으로 유효한 설정이 생성되지 않으면 Pod에서 실행 중인 툴이나 소프트웨어에 대한 설명서를 참조하십시오.

위의 리디렉션 송신 라우터 예와 마찬가지로 ConfigMap을 사용하여 EGRESS_HTTP_PROXY_DESTINATION 지정할 수도 있습니다.

8.6.1.5. 송신 라우터 DNS 프록시 Pod 배포

DNS 프록시 모드에서 송신 라우터는 자체 IP 주소에서 하나 이상의 대상 IP 주소로 TCP 기반 서비스의 DNS 프록시로 실행됩니다. 예약된 사용을 원하는 클라이언트 Pod에서는 대상 IP에 직접 연결하는 대신 송신 라우터에 연결하도록 소스 IP 주소를 수정해야 합니다. 이렇게 하면 외부 대상에서 트래픽을 알려진 소스에서 들어오는 것처럼 처리합니다.

  1. 예를 들어 다음을 사용하여 Pod를 생성합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: egress-dns-proxy
      labels:
        name: egress-dns-proxy
      annotations:
        pod.network.openshift.io/assign-macvlan: "true" 1
    spec:
      initContainers:
      - name: egress-router-setup
        image: registry.redhat.io/openshift3/ose-egress-router
        securityContext:
          privileged: true
        env:
        - name: EGRESS_SOURCE 2
          value: 192.168.12.99/24
        - name: EGRESS_GATEWAY 3
          value: 192.168.12.1
        - name: EGRESS_ROUTER_MODE 4
          value: dns-proxy
      containers:
      - name: egress-dns-proxy
        image: registry.redhat.io/openshift3/ose-egress-dns-proxy
        env:
        - name: EGRESS_DNS_PROXY_DEBUG 5
          value: "1"
        - name: EGRESS_DNS_PROXY_DESTINATION 6
          value: |
            # Egress routes for Project "Foo", version 5
    
            80  203.0.113.25
    
            100 example.com
    
            8080 203.0.113.26 80
    
            8443 foobar.com 443
    1
    pod.network.openshift.io/assign-macvlan 주석을 사용하면 기본 네트워크 인터페이스에서 Macvlan 네트워크 인터페이스가 생성되고 egress-router-setup 컨테이너를 시작하기 전에 Pod의 네트워크 네임스페이스로 이동합니다. "true" 로 따옴표를 보존합니다. 생략하면 오류가 발생합니다.
    2
    노드가 있고 이 포드에서 사용하도록 클러스터 관리자가 예약한 실제 네트워크의 IP 주소입니다. 선택적으로 서브넷 길이 /24 접미사를 포함하여 로컬 서브넷 경로를 설정할 수 있습니다. 서브넷 길이를 지정하지 않으면 송신 라우터에서 EGRESS_GATEWAY 변수로 지정된 호스트에만 액세스하고 서브넷의 다른 호스트에는 액세스할 수 없습니다.
    3
    노드 자체에서 사용하는 기본 게이트웨이와 동일한 값입니다.
    4
    이는 송신 라우터 이미지가 DNS 프록시의 일부로 배포 중임을 나타내므로 iptables 리디렉션 규칙을 설정하지 않아야 합니다.
    5
    선택 사항: 이 변수를 설정하면 stdout에 DNS 프록시 로그 출력이 표시됩니다.
    6
    여러 줄 문자열에 YAML 구문을 사용합니다. 자세한 내용은 아래를 참조하십시오.
    참고

    EGRESS_DNS_PROXY_DESTINATION 의 각 행은 다음 두 가지 방법 중 하나로 설정할 수 있습니다.

    • <port> <remote_address> - 지정된 <port>에 대한 들어오는 연결이 지정된 < remote_address>의 동일한 TCP 포트로 프록시되어야 함을 나타냅니다. <remote_address> 는 IP 주소 또는 DNS 이름이 될 수 있습니다. DNS 이름의 경우 런타임에 DNS 확인이 수행됩니다. 위의 예에서 첫 번째 줄은 로컬 포트 80에서 203.0.113.25의 포트 80으로 TCP 트래픽을 프록시합니다. 두 번째 행은 example.com의 로컬 포트 100에서 포트 100으로 TCP 트래픽을 프록시합니다.
    • <port> <remote_address> <remote_port> - 연결이 <remote_ address>의 다른 <remote_port> 에 프록시된다는 점을 제외하고는 위와 같습니다. 위의 예에서 세 번째 행은 203.0.113.26의 원격 포트 80으로 로컬 포트 8080을 프록시하고, 네 번째 행은 로컬 포트 8443을 foobar.com의 원격 포트 443으로 프록시합니다.
  2. 송신 라우터를 가리키도록 서비스를 생성하여 다른 Pod에서 Pod의 IP 주소를 찾을 수 있는지 확인합니다.

    apiVersion: v1
    kind: Service
    metadata:
      name: egress-dns-svc
    spec:
      ports:
      - name: con1
        protocol: TCP
        port: 80
        targetPort: 80
      - name: con2
        protocol: TCP
        port: 100
        targetPort: 100
      - name: con3
        protocol: TCP
        port: 8080
        targetPort: 8080
      - name: con4
        protocol: TCP
        port: 8443
        targetPort: 8443
      type: ClusterIP
      selector:
        name: egress-dns-proxy

    이제 Pod에서 이 서비스에 연결할 수 있습니다. 해당 연결은 예약된 송신 IP 주소를 사용하여 외부 서버의 해당 포트에 프록시됩니다.

위의 리디렉션 송신 라우터 예와 마찬가지로 ConfigMap 을 사용하여 EGRESS_DNS_PROXY_DESTINATION 지정할 수도 있습니다.

8.6.1.6. 송신 라우터 Pod의 장애 조치 활성화

복제 컨트롤러를 사용하면 다운타임을 방지하기 위해 송신 라우터 Pod의 복사본이 항상 1개 있는지 확인할 수 있습니다.

  1. 다음을 사용하여 복제 컨트롤러 구성 파일을 생성합니다.

    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: egress-demo-controller
    spec:
      replicas: 1 1
      selector:
        name: egress-demo
      template:
        metadata:
          name: egress-demo
          labels:
            name: egress-demo
          annotations:
            pod.network.openshift.io/assign-macvlan: "true"
        spec:
          initContainers:
          - name: egress-demo-init
            image: registry.redhat.io/openshift3/ose-egress-router
            env:
            - name: EGRESS_SOURCE 2
              value: 192.168.12.99/24
            - name: EGRESS_GATEWAY
              value: 192.168.12.1
            - name: EGRESS_DESTINATION
              value: 203.0.113.25
            - name: EGRESS_ROUTER_MODE
              value: init
            securityContext:
              privileged: true
          containers:
          - name: egress-demo-wait
            image: registry.redhat.io/openshift3/ose-pod
          nodeSelector:
            site: springfield-1
    1
    언제든지 지정된 EGRESS_SOURCE 값을 사용할 수 있으므로 복제본이 1 로 설정되어 있는지 확인합니다. 즉, 레이블이 site=springfield-1 인 노드에서 단일 라우터 사본만 실행됩니다.
    2
    노드가 있고 이 포드에서 사용하도록 클러스터 관리자가 예약한 실제 네트워크의 IP 주소입니다. 선택적으로 서브넷 길이 /24 접미사를 포함하여 로컬 서브넷 경로를 설정할 수 있습니다. 서브넷 길이를 지정하지 않으면 송신 라우터에서 EGRESS_GATEWAY 변수로 지정된 호스트에만 액세스하고 서브넷의 다른 호스트에는 액세스할 수 없습니다.
  2. 정의를 사용하여 Pod를 생성합니다.

    $ oc create -f <replication_controller>.json
  3. 확인하려면 복제 컨트롤러 Pod가 생성되었는지 확인합니다.

    $ oc describe rc <replication_controller>
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.