8.4. nftables를 사용하여 NAT 구성
nftables
를 사용하면 다음 NAT(네트워크 주소 변환) 유형을 구성할 수 있습니다.
- 마스커레이딩
- SNAT(소스 NAT)
- 대상 NAT(DNAT)
- 리디렉션
iifname
및 oifname
매개변수에서 실제 인터페이스 이름만 사용할 수 있으며 대체 이름(ltname
)은 지원되지 않습니다.
8.4.1. NAT 유형
다음은 다양한 NAT(네트워크 주소 변환) 유형입니다.
- 마스커레이딩 및 소스 NAT (SNAT)
이러한 NAT 유형 중 하나를 사용하여 패킷의 소스 IP 주소를 변경합니다. 예를 들어, 인터넷 서비스 공급자(ISP)는
10.0.0.0/8
과 같은 개인 IP 범위를 라우팅하지 않습니다. 네트워크에서 개인 IP 범위를 사용하고 사용자가 인터넷의 서버에 연결할 수 있어야 하는 경우 이러한 범위의 패킷의 소스 IP 주소를 공용 IP 주소에 매핑합니다.마스커레이딩과 SNAT는 서로 매우 비슷합니다. 차이점은 다음과 같습니다.
- 마스커레이딩은 나가는 인터페이스의 IP 주소를 자동으로 사용합니다. 따라서 나가는 인터페이스에서 동적 IP 주소를 사용하는 경우 마스커레이딩을 사용합니다.
- SNAT는 패킷의 소스 IP 주소를 지정된 IP로 설정하고 나가는 인터페이스의 IP를 동적으로 조회하지 않습니다. 따라서 SNAT는 마스커레이딩보다 빠릅니다. 나가는 인터페이스에서 고정 IP 주소를 사용하는 경우 SNAT를 사용합니다.
- 대상 NAT(DNAT)
- 이 NAT 유형을 사용하여 들어오는 패킷의 대상 주소와 포트를 다시 작성합니다. 예를 들어 웹 서버가 개인 IP 범위의 IP 주소를 사용하므로 인터넷에서 직접 액세스할 수 없는 경우 라우터에 DNAT 규칙을 설정하여 수신 트래픽을 이 서버로 리디렉션할 수 있습니다.
- 리디렉션
- 이 유형은 체인 후크에 따라 패킷을 로컬 시스템으로 리디렉션하는 DNAT의 특별한 사례입니다. 예를 들어 서비스가 표준 포트와 다른 포트에서 실행되는 경우 표준 포트에서 들어오는 트래픽을 이 특정 포트로 리디렉션할 수 있습니다.
8.4.2. nftables를 사용하여 마스커레이딩 구성
마스커레이딩을 사용하면 라우터가 인터페이스를 통해 전송된 패킷의 소스 IP를 인터페이스의 IP 주소로 동적으로 변경할 수 있습니다. 즉, 인터페이스에 새 IP가 할당되면 nftables
는 소스 IP를 교체할 때 새 IP를 자동으로 사용합니다.
ens3
인터페이스를 통해 호스트를 떠나는 패킷의 소스 IP를 ens3
의 IP 세트로 교체합니다.
절차
테이블을 생성합니다.
# nft add table nat
사전
을 테이블에 추가합니다.설정 및 사
후 체인# nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
중요prerouting
체인에 규칙을 추가하지 않더라도nftables
프레임워크를 사용하려면 들어오는 패킷 응답과 일치해야 합니다.쉘에서 음수 우선 순위 값을
nft
명령의 옵션으로 해석하지 못하도록--
옵션을nft
명령에 전달해야 합니다.ens3
인터페이스에서 나가는 패킷과 일치하는postrouting
체인에 규칙을 추가합니다.# nft add rule nat postrouting oifname "ens3" masquerade
8.4.3. nftables를 사용하여 소스 NAT 구성
라우터에서 SNAT(Source NAT)를 사용하면 인터페이스를 통해 전송된 패킷의 IP를 특정 IP 주소로 변경할 수 있습니다. 그런 다음 라우터는 발신 패킷의 소스 IP를 대체합니다.
절차
테이블을 생성합니다.
# nft add table nat
사전
을 테이블에 추가합니다.설정 및 사
후 체인# nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
중요사
후
체인에 규칙을 추가하지 않더라도nftables
프레임워크를 사용하려면 이 체인이 발신 패킷 응답과 일치해야 합니다.쉘에서 음수 우선 순위 값을
nft
명령의 옵션으로 해석하지 못하도록--
옵션을nft
명령에 전달해야 합니다.ens3
을 통해 나가는 패킷의 소스 IP를192.0.2.1
로 대체하는후 라우팅
체인에 규칙을 추가합니다.# nft add rule nat postrouting oifname "ens3" snat to 192.0.2.1
8.4.4. nftables를 사용하여 대상 NAT 구성
대상 NAT(DNAT)를 사용하면 라우터의 트래픽을 인터넷에서 직접 액세스할 수 없는 호스트로 리디렉션할 수 있습니다.
예를 들어, DNAT를 사용하면 라우터가 포트 80
및 443
으로 전송된 들어오는 트래픽을 IP 주소 192.0.2.1
이 있는 웹 서버로 리디렉션합니다.
절차
테이블을 생성합니다.
# nft add table nat
사전
을 테이블에 추가합니다.설정 및 사
후 체인# 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
명령에 전달해야 합니다.라우터의
ens3
인터페이스에서 IP 주소192.0.2.1
을 사용하여 웹 서버로 들어오는 트래픽을 포트80
및443
으로 리디렉션하는이전
체인에 규칙을 추가합니다.# nft add rule nat prerouting iifname ens3 tcp dport { 80, 443 } dnat to 192.0.2.1
환경에 따라 SNAT 또는 마스커레이딩 규칙을 추가하여 웹 서버에서 보낸 사람에게 반환되는 패킷의 소스 주소를 변경합니다.
ens3
인터페이스에서 동적 IP 주소를 사용하는 경우 masquerading 규칙을 추가합니다.# nft add rule nat postrouting oifname "ens3" masquerade
ens3
인터페이스에서 고정 IP 주소를 사용하는 경우 SNAT 규칙을 추가합니다. 예를 들어ens3
에서198.51.100.1
IP 주소를 사용하는 경우:# nft add rule nat postrouting oifname "ens3" snat to 198.51.100.1
패킷 전달을 활성화합니다.
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
추가 리소스
8.4.5. nftables를 사용하여 리디렉션 구성
리디렉션
기능은 체인 후크에 따라 패킷을 로컬 시스템으로 리디렉션하는 대상 네트워크 주소 변환(DNAT) 특수한 경우입니다.
예를 들어 로컬 호스트의 포트 22
로 전송된 수신 및 전달 트래픽을 포트 2222
로 리디렉션할 수 있습니다.
절차
테이블을 생성합니다.
# nft add table nat
테이블에
사전 제한 체인
을 추가합니다.# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; }
쉘에서 음수 우선 순위 값을
nft
명령의 옵션으로 해석하지 못하도록--
옵션을nft
명령에 전달해야 합니다.포트
22
에서 들어오는 트래픽을 포트2222
로 리디렉션하는사전
할당 체인에 규칙을 추가합니다.# nft add rule nat prerouting tcp dport 22 redirect to 2222
추가 리소스
8.4.6. nftables를 사용하여 flowtable 구성
nftables
유틸리티는 netfilter
프레임워크를 사용하여 네트워크 트래픽에 대해 NAT(네트워크 주소 변환)를 제공하고 패킷 전달을 가속화하기 위한 fastpath 기능 기반 흐름 가능
메커니즘을 제공합니다.
흐름 메커니즘에는 다음과 같은 기능이 있습니다.
- 연결 추적을 사용하여 클래식 패킷 전달 경로를 바이패스합니다.
- 클래식 패킷 처리를 우회하여 라우팅 테이블을 다시 방문하지 않도록 합니다.
- TCP 및 UDP 프로토콜에서만 작동합니다.
- 하드웨어 독립 소프트웨어 빠른 경로.
절차
inet
family의예제 테이블
추가:# nft add table inet <example-table>
Ingress
후크를 사용하여example-flowtable
flowtable을 추가하고 우선순위 유형으로filter
를 추가합니다.# nft add flowtable inet <example-table> <example-flowtable> { hook ingress priority filter \; devices = { enp1s0, enp7s0 } \; }
패킷 처리 테이블의 flowtable에
example-forwardchain
flow를 추가합니다.# nft add chain inet <example-table> <example-forwardchain> { type filter hook forward priority filter \; }
이 명령은
전달
후크 및필터
우선 순위로필터
유형의 흐름을 추가합니다.설정된
연결 추적 상태가 포함된 규칙을 추가하여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)
도움말 페이지