nftables는 DNAT에 대해 "port"를 "ip:port"로 매핑합니다.

nftables는 DNAT에 대해 "port"를 "ip:port"로 매핑합니다.

portipv4_addr:port매핑 port되고 ipv4_addr:port다른 TCP 포트 번호를 갖는 nftables 맵을 가질 수 있습니까 ? 예를 들어, 포트 80에서 들어오는 모든 패킷을 포트 8080에서 웹 서버를 실행하는 컨테이너로 전송하려고 합니다(순전히 nftables 사용). 이는 아래와 같이 두 개의 맵과 두 개의 맵 조회를 사용하여 달성할 수 있습니다.

table ip dnatTable {
  chain dnatChain {
    type nat hook prerouting priority dstnat; policy accept;
    dnat to tcp dport map { 80 : 172.17.0.3 }:tcp dport map { 80 : 8080 }
  }
}

그런데 지도 조회를 한 번만 할 수 있는지 궁금합니다.

감사해요

답변1

평소처럼nftables움직이는 표적이다. 이 기능은 다음에서 나타납니다.nftables0.9.42020-04-01에 게시됨:

  • 연결된 NAT 매핑을 사용합니다. 이를 통해 예를 들어 NAT 수정에 사용할 주소와 포트를 맵에서 지정할 수 있습니다.

    nft add rule ip nat pre dnat ip addr . port to ip saddr map { 1.1.1.1 : 2.2.2.2 . 30 }
    

    명명된 세트와 함께 이 새로운 기능을 사용할 수도 있습니다.

    nft add map ip nat destinations { type ipv4_addr . inet_service : ipv4_addr . inet_service \; }
    nft add rule ip nat pre dnat ip addr . port to ip saddr . tcp dport map @destinations
    

따라서 OP의 경우 다음과 같습니다.

nft add ip dnatTable dnatChain 'dnat ip addr . port to tcp dport map { 80 : 172.17.0.3 . 8080 }'

참고용으로만,nftables1.0.0 2021년 8월 19일 출시단순화된 구문이 있습니다.

  • NAT 매핑을 위한 단순화된 구문입니다. IP 범위를 지정할 수 있습니다.

[...]

또는 특정 IP 및 포트.

... dnat to ip saddr map { 10.141.11.4 : 192.168.2.3 . 80 }

따라서 OP의 상황은 다음과 같이 단축될 수 있습니다(이전 규칙은 다음과 같이 표시됨).

nft add ip dnatTable dnatChain 'dnat to tcp dport map { 80 : 172.17.0.3 . 8080 }'

명명된 맵을 사용하면 데이터에서 규칙을 분리하는 데 도움이 됩니다. 이것은 또한 작동합니다(0.9.4 구문 사용).

nft add map ip dnatTable portToIpPort '{ type inet_service : ipv4_addr . inet_service ; }'
nft add rule ip dnatTable dnatChain dnat ip addr . port to tcp dport map @portToIpPort

그런 다음 편리한 시간에 다음을 수행하십시오.

nft add element ip dnatTable portToIpPort '{ 80 : 172.17.0.3 . 8080 }'

관련 정보