7.9. 네트워크 RHEL 시스템 역할을 사용하여 특정 서브넷에서 다른 기본 게이트웨이로 트래픽을 라우팅

정책 기반 라우팅을 사용하여 특정 서브넷의 트래픽에 대해 다른 기본 게이트웨이를 구성할 수 있습니다. 예를 들어 RHEL을 기본적으로 기본 경로를 사용하여 모든 트래픽을 인터넷 공급자 A로 라우팅하는 라우터로 구성할 수 있습니다. 그러나 내부 워크스테이션 서브넷에서 수신되는 트래픽은 공급자 B로 라우팅됩니다.

정책 기반 라우팅을 원격으로 및 여러 노드에서 구성하려면 RHEL 네트워크 시스템 역할을 사용할 수 있습니다. Ansible 제어 노드에서 다음 절차를 수행합니다.

이 절차에서는 다음과 같은 네트워크 토폴로지를 가정합니다.

policy based routing

사전 요구 사항

  • 제어 노드와 관리형 노드를 준비했습니다.
  • 관리 노드에서 플레이북을 실행할 수 있는 사용자로 제어 노드에 로그인되어 있습니다.
  • 관리형 노드에 연결하는 데 사용하는 계정에는 sudo 권한이 있습니다.
  • 이 플레이북을 실행하려는 관리형 노드 또는 관리형 노드 그룹은 Ansible 인벤토리 파일에 나열됩니다.
  • 관리형 노드는 NetworkManagerfirewalld 서비스를 사용합니다.
  • 구성하려는 관리형 노드에는 네 개의 네트워크 인터페이스가 있습니다.

    • enp7s0 인터페이스는 공급자 A의 네트워크에 연결되어 있습니다. 공급자 네트워크의 게이트웨이 IP는 198.51.100.2 이며 네트워크는 /30 네트워크 마스크를 사용합니다.
    • enp1s0 인터페이스는 공급자 B의 네트워크에 연결되어 있습니다. 공급자 네트워크의 게이트웨이 IP는 192.0.2.2 이며 네트워크는 /30 네트워크 마스크를 사용합니다.
    • enp8s0 인터페이스는 내부 워크스테이션이 있는 10.0.0.0/24 서브넷에 연결되어 있습니다.
    • enp9s0 인터페이스는 회사 서버를 사용하여 203.0.113.0/24 서브넷에 연결됩니다.
  • 내부 워크스테이션 서브넷의 호스트는 기본 게이트웨이로 10.0.0.1 을 사용합니다. 이 절차에서는 이 IP 주소를 라우터의 enp8s0 네트워크 인터페이스에 할당합니다.
  • 서버 서브넷의 호스트는 기본 게이트웨이로 203.0.113.1 을 사용합니다. 이 절차에서는 이 IP 주소를 라우터의 enp9s0 네트워크 인터페이스에 할당합니다.

절차

  1. 다음 콘텐츠를 사용하여 플레이북 파일(예: ~/pbr.yml )을 만듭니다.

    ---
    - name: Configuring policy-based routing
      hosts: managed-node-01.example.com
      tasks:
      - name: Routing traffic from a specific subnet to a different default gateway
        include_role:
          name: rhel-system-roles.network
    
        vars:
          network_connections:
            - name: Provider-A
              interface_name: enp7s0
              type: ethernet
              autoconnect: True
              ip:
                address:
                  - 198.51.100.1/30
                gateway4: 198.51.100.2
                dns:
                  - 198.51.100.200
              state: up
              zone: external
    
            - name: Provider-B
              interface_name: enp1s0
              type: ethernet
              autoconnect: True
              ip:
                address:
                  - 192.0.2.1/30
                route:
                  - network: 0.0.0.0
                    prefix: 0
                    gateway: 192.0.2.2
                    table: 5000
              state: up
              zone: external
    
            - name: Internal-Workstations
              interface_name: enp8s0
              type: ethernet
              autoconnect: True
              ip:
                address:
                  - 10.0.0.1/24
                route:
                  - network: 10.0.0.0
                    prefix: 24
                    table: 5000
                routing_rule:
                  - priority: 5
                    from: 10.0.0.0/24
                    table: 5000
              state: up
              zone: trusted
    
            - name: Servers
              interface_name: enp9s0
              type: ethernet
              autoconnect: True
              ip:
                address:
                  - 203.0.113.1/24
              state: up
              zone: trusted
  2. 플레이북을 실행합니다.

    # ansible-playbook ~/pbr.yml

검증

  1. 내부 워크스테이션 서브넷의 RHEL 호스트에서 다음을 수행합니다.

    1. traceroute 패키지를 설치합니다.

      # dnf install traceroute
    2. 인터넷의 호스트에 대한 경로를 표시하려면 traceroute 유틸리티를 사용합니다.

      # traceroute redhat.com
      traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets
       1  10.0.0.1 (10.0.0.1)     0.337 ms  0.260 ms  0.223 ms
       2  192.0.2.1 (192.0.2.1)   0.884 ms  1.066 ms  1.248 ms
       ...

      명령의 출력은 라우터가 공급자 B의 네트워크인 192.0.2.1 을 통해 패킷을 전송함을 표시합니다.

  2. 서버 서브넷의 RHEL 호스트에서 다음을 수행합니다.

    1. traceroute 패키지를 설치합니다.

      # dnf install traceroute
    2. 인터넷의 호스트에 대한 경로를 표시하려면 traceroute 유틸리티를 사용합니다.

      # traceroute redhat.com
      traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets
       1  203.0.113.1 (203.0.113.1)    2.179 ms  2.073 ms  1.944 ms
       2  198.51.100.2 (198.51.100.2)  1.868 ms  1.798 ms  1.549 ms
       ...

      명령의 출력은 라우터가 공급자 A의 네트워크인 198.51.100.2 를 통해 패킷을 전송함을 표시합니다.

  3. RHEL 시스템 역할을 사용하여 구성한 RHEL 라우터에서 다음을 수행합니다.

    1. 규칙 목록을 표시합니다.

      # ip rule list
      0:      from all lookup local
      5:    from 10.0.0.0/24 lookup 5000
      32766:  from all lookup main
      32767:  from all lookup default

      기본적으로 RHEL에는 로컬, 기본 및 기본 테이블에 대한 규칙이 포함되어 있습니다.

    2. 5000 에 경로를 표시 :

      # ip route list table 5000
      0.0.0.0/0 via 192.0.2.2 dev enp1s0 proto static metric 100
      10.0.0.0/24 dev enp8s0 proto static scope link src 192.0.2.1 metric 102
    3. 인터페이스 및 방화벽 영역을 표시합니다.

      # firewall-cmd --get-active-zones
      external
        interfaces: enp1s0 enp7s0
      trusted
        interfaces: enp8s0 enp9s0
    4. 외부 영역에 masquerading이 활성화되어 있는지 확인합니다.

      # firewall-cmd --info-zone=external
      external (active)
        target: default
        icmp-block-inversion: no
        interfaces: enp1s0 enp7s0
        sources:
        services: ssh
        ports:
        protocols:
        masquerade: yes
        ...

추가 리소스

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md file