2.4. nftables를 사용하여 NAT 구성

nftables 를 사용하면 다음 NAT(네트워크 주소 변환) 유형을 구성할 수 있습니다.

  • 마스커레이딩
  • 소스 NAT(SNAT)
  • 대상 NAT(DNAT)
  • redirect
중요

iifnameoifname 매개변수에서 실제 인터페이스 이름만 사용할 수 있으며 대체 이름(ltname)은 지원되지 않습니다.

2.4.1. NAT 유형

다음은 다양한 NAT(네트워크 주소 변환) 유형입니다.

마스커레이딩 및 소스 NAT (SNAT)

이러한 NAT 유형 중 하나를 사용하여 패킷의 소스 IP 주소를 변경합니다. 예를 들어, 인터넷 서비스 공급자(ISP)는 10.0.0.0/8 과 같은 개인 IP 범위를 라우팅하지 않습니다. 네트워크에서 개인 IP 범위를 사용하고 사용자가 인터넷의 서버에 연결할 수 있어야 하는 경우 이러한 범위의 패킷의 소스 IP 주소를 공용 IP 주소에 매핑합니다.

마스커레이딩과 SNAT는 서로 매우 비슷합니다. 차이점은 다음과 같습니다.

  • 마스커레이딩은 발신 인터페이스의 IP 주소를 자동으로 사용합니다. 따라서 발신 인터페이스가 동적 IP 주소를 사용하는 경우 masquerading을 사용합니다.
  • SNAT는 패킷의 소스 IP 주소를 지정된 IP로 설정하고 발신 인터페이스의 IP를 동적으로 검색하지 않습니다. 따라서 SNAT는 마스커레이딩보다 빠릅니다. 발신 인터페이스가 고정 IP 주소를 사용하는 경우 SNAT를 사용합니다.
대상 NAT(DNAT)
이 NAT 유형을 사용하여 수신 패킷의 대상 주소와 포트를 다시 작성합니다. 예를 들어 웹 서버가 개인 IP 범위의 IP 주소를 사용하므로 인터넷에서 직접 액세스할 수 없는 경우 라우터에 DNAT 규칙을 설정하여 수신 트래픽을 이 서버로 리디렉션할 수 있습니다.
redirect
이 유형은 체인 후크에 따라 패킷을 로컬 시스템으로 리디렉션하는 DNAT의 특별한 경우입니다. 예를 들어 서비스가 표준 포트와 다른 포트에서 실행되는 경우 표준 포트에서 들어오는 트래픽을 이 특정 포트로 리디렉션할 수 있습니다.

2.4.2. nftables를 사용하여 마스커레이딩 구성

마스커레이딩을 사용하면 라우터에서 인터페이스를 통해 전송되는 패킷의 소스 IP를 인터페이스의 IP 주소로 동적으로 변경할 수 있습니다. 즉, 인터페이스에 새 IP가 할당되면 nftables 는 소스 IP를 교체할 때 새 IP를 자동으로 사용합니다.

ens3 인터페이스를 통해 호스트를 떠나는 패킷의 소스 IP를 ens3 의 IP 세트로 교체합니다.

절차

  1. 테이블을 생성합니다.

    # nft add table nat
  2. 사전 설정 및 사 후 체인 을 테이블에 추가합니다.

    # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
    중요

    선점 체인에 규칙을 추가하지 않더라도 nftables 프레임 워크에는 이 체인이 들어오는 패킷 응답을 일치해야 합니다.

    쉘에서 음수 우선 순위 값을 nft 명령의 옵션으로 해석하지 못하도록 -- 옵션을 nft 명령에 전달해야 합니다.

  3. ens3 인터페이스에서 나가는 패킷과 일치하는 postrouting 체인에 규칙을 추가합니다.

    # nft add rule nat postrouting oifname "ens3" masquerade

2.4.3. nftables를 사용하여 소스 NAT 구성

라우터에서 SNAT(Source NAT)를 사용하면 인터페이스를 통해 전송된 패킷의 IP를 특정 IP 주소로 변경할 수 있습니다. 그런 다음 라우터는 발신 패킷의 소스 IP를 대체합니다.

절차

  1. 테이블을 생성합니다.

    # nft add table nat
  2. 사전 설정 및 사 후 체인 을 테이블에 추가합니다.

    # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
    중요

    체인에 규칙을 추가하지 않더라도 nftables 프레임워크를 사용하려면 이 체인이 발신 패킷 응답과 일치해야 합니다.

    쉘에서 음수 우선 순위 값을 nft 명령의 옵션으로 해석하지 못하도록 -- 옵션을 nft 명령에 전달해야 합니다.

  3. ens3 을 통해 나가는 패킷의 소스 IP를 192.0.2.1 로 대체하는 후 라우팅 체인에 규칙을 추가합니다.

    # nft add rule nat postrouting oifname "ens3" snat to 192.0.2.1

2.4.4. nftables를 사용하여 대상 NAT 구성

대상 NAT(DNAT)를 사용하면 라우터의 트래픽을 인터넷에서 직접 액세스할 수 없는 호스트로 리디렉션할 수 있습니다.

예를 들어, DNAT를 사용하면 라우터가 포트 80443 으로 전송된 들어오는 트래픽을 IP 주소 192.0.2.1 이 있는 웹 서버로 리디렉션합니다.

절차

  1. 테이블을 생성합니다.

    # nft add table nat
  2. 사전 설정 및 사 후 체인 을 테이블에 추가합니다.

    # nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; }
    # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
    중요

    체인에 규칙을 추가하지 않더라도 nftables 프레임워크를 사용하려면 이 체인이 발신 패킷 응답과 일치해야 합니다.

    쉘에서 음수 우선 순위 값을 nft 명령의 옵션으로 해석하지 못하도록 -- 옵션을 nft 명령에 전달해야 합니다.

  3. 라우터의 ens3 인터페이스에서 IP 주소 192.0.2.1 을 사용하여 웹 서버로 들어오는 트래픽을 포트 80443 으로 리디렉션하는 이전 체인에 규칙을 추가합니다.

    # nft add rule nat prerouting iifname ens3 tcp dport { 80, 443 } dnat to 192.0.2.1
  4. 환경에 따라 SNAT 또는 마스커레이딩 규칙을 추가하여 웹 서버에서 보낸 사람에게 반환되는 패킷의 소스 주소를 변경합니다.

    1. ens3 인터페이스에서 동적 IP 주소를 사용하는 경우 masquerading 규칙을 추가합니다.

      # nft add rule nat postrouting oifname "ens3" masquerade
    2. ens3 인터페이스에서 고정 IP 주소를 사용하는 경우 SNAT 규칙을 추가합니다. 예를 들어 ens3 에서 198.51.100.1 IP 주소를 사용하는 경우:

      # nft add rule nat postrouting oifname "ens3" snat to 198.51.100.1
  5. 패킷 전달 활성화:

    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf

추가 리소스

2.4.5. nftables를 사용하여 리디렉션 구성

리디렉션 기능은 체인 후크에 따라 패킷을 로컬 시스템으로 리디렉션하는 대상 네트워크 주소 변환(DNAT) 특수한 경우입니다.

예를 들어 로컬 호스트의 포트 22 로 전송된 수신 및 전달 트래픽을 포트 2222 로 리디렉션할 수 있습니다.

절차

  1. 테이블을 생성합니다.

    # nft add table nat
  2. 테이블에 사전 제한 체인 을 추가합니다.

    # nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; }

    쉘에서 음수 우선 순위 값을 nft 명령의 옵션으로 해석하지 못하도록 -- 옵션을 nft 명령에 전달해야 합니다.

  3. 포트 22 에서 들어오는 트래픽을 포트 2222 로 리디렉션하는 사전 할당 체인에 규칙을 추가합니다.

    # nft add rule nat prerouting tcp dport 22 redirect to 2222

추가 리소스

2.4.6. nftables를 사용하여 flowtable 구성

nftables 유틸리티는 netfilter 프레임워크를 사용하여 네트워크 트래픽에 대해 NAT(네트워크 주소 변환)를 제공하고 패킷 전달을 가속화하기 위한 fastpath 기능 기반 흐름 가능 메커니즘을 제공합니다.

흐름 메커니즘에는 다음과 같은 기능이 있습니다.

  • 연결 추적을 사용하여 클래식 패킷 전달 경로를 바이패스합니다.
  • 클래식 패킷 처리를 우회하여 라우팅 테이블을 다시 방문하지 않도록 합니다.
  • TCP 및 UDP 프로토콜에서만 작동합니다.
  • 하드웨어 독립 소프트웨어 빠른 경로.

절차

  1. inet family의 예제 테이블 추가:

    # nft add table inet <example-table>
  2. Ingress 후크를 사용하여 example-flowtable flowtable을 추가하고 우선순위 유형으로 filter 를 추가합니다.

    # nft add flowtable inet <example-table> <example-flowtable> { hook ingress priority filter \; devices = { enp1s0, enp7s0 } \; }
  3. 패킷 처리 테이블의 flowtable에 example-forwardchain flow를 추가합니다.

    # nft add chain inet <example-table> <example-forwardchain> { type filter hook forward priority filter \; }

    이 명령은 전달 후크 및 필터 우선 순위로 필터 유형의 흐름을 추가합니다.

  4. 설정된 연결 추적 상태가 포함된 규칙을 추가하여 example-flowtable 흐름을 오프로드합니다.

    # nft add rule inet <example-table> <example-forwardchain> ct state established flow add @<example-flowtable>

검증

  • example-table 의 속성을 확인합니다.

    # nft list table inet <example-table>
    table inet example-table {
        	flowtable example-flowtable {
         		hook ingress priority filter
               devices = { enp1s0, enp7s0 }
        	}
    
        	chain example-forwardchain {
    type filter hook forward priority filter; policy accept;
    ct state established flow add @example-flowtable
        }
    }

추가 리소스

  • nft(8) 매뉴얼 페이지