Nftables: 소스 주소 제한이 있고 매핑이 하나만 있는 Dnat

Nftables: 소스 주소 제한이 있고 매핑이 하나만 있는 Dnat

우리 라우터 시스템에는 WAN 인터페이스에 여러 개의 공용 IP(/27)가 있습니다. 이제 특정 조합과 일치하는 dportdnat saddr규칙을 추가하고 싶습니다 daddr. 내 꿈은 이렇습니다.

map one2one_dnat {
    # dst_addr     . src_addr  . proto      . dst_port     : dnat_to   . dnat_to_port
    type ipv4_addr . ipv4_addr . inet_proto . inet_service : ipv4_addr . inet_service
    flags interval
    counter
    comment "1-1 dnat"
    elements = {
        42.42.42.5 . 0.0.0.0/0 . tcp . 8888 : 10.42.42.5 . 8888
    }
}

# And then later in a chain
ip daddr . ip saddr . ip protocol . th dport dnat to @one2one_dnat

그러나 결과는 다음과 같습니다.

root@XXX# nft -c -f assembled.nft
assembled.nft:252:59-60: Error: syntax error, unexpected to, expecting newline or semicolon
        ip daddr . ip saddr . ip protocol . th dport dnat to @one2one_dnat
                                                          ^^

다음 구문 예제는 작동합니다(그러나 의도된 고급 올인원 맵에는 해당되지 않음).

dnat ip addr . port to ip saddr . tcp dport map { 42.42.42.5 . 8888 : 10.42.42.5 . 8888}

# And even with saddr restrictions
ip saddr 0.0.0.0/0 dnat ip addr . port to ip saddr . tcp dport map { 42.42.42.5 . 8888 : 10.42.42.5 . 8888}

어떤 아이디어/제안이라도 높이 평가하겠습니다.

답변1

아이디어는 여기에 있지만 명명된 매핑 사례에는 잘못된 구문을 사용하고 익명 매핑 사례에는 올바른 구문을 사용합니다.

발견되면 맵은 키를 해당 값으로 바꿉니다(또는 표현식이 false로 평가되어 추가 처리가 중지됨). dnat이라는 지도를 사용하여 규칙 에 따라도키 값 쌍올바른 구문을 사용해야 합니다. key map @keytovalue.이 세 부분은 패킷의 속성을 기반으로 하는 값으로 대체되고 규칙의 다른 부분에서 사용됩니다.

OP의 시도는 다음 구문을 따르지 않습니다.

ip daddr . ip saddr . ip protocol . th dport dnat to @one2one_dnat

다음과 같이 작성해야 합니다.

dnat to ip daddr . ip saddr . ip protocol . th dport map @one2one_dnat

여기서 놀랄 일이 아닙니다. 익명 매핑에 성공적으로 사용된 OP 구문과 동일합니다. 키(연결로 구성됨), 키워드, map맵 참조(익명 사례의 정의)가 이어집니다. dnat [to]결과 ip:port 값의 소비자가 됩니다(일치하는 경우에만).


추가 의견.

다른 독자들에게는 이 내용도 충분히 최근의 내용이어야 합니다.nftablesNAT를 수행하기 위해 사용자 모드와 커널 부분 모두 다음을 지원합니다.nftables 0.9.4 및 Linux 커널 5.6:

  • 연결된 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
    

type구문을 다음으로 바꾸십시오 .typeof문법적 가장자리직렬 연결, 일반적으로 가독성이 더 좋고 관련된 모든 유형 이름을 알아낼 필요가 없습니다. 그 중 일부는 제대로 문서화되어 있지 않으며 현재 OP의 경우에 적용되지 않는 것 같습니다. ip protocol의 사용은 thmap 및 A 충돌에서 작동하는 것 같습니다 . 사이 규칙은 최소한 nftables 1.0.7 및 커널 6.1.x에 적용됩니다. 따라서 typeof여기에 사용하거나 보관 하지 않는 것이 좋습니다 type. 그렇지 않으면 이러한 충돌을 피하기 위해 매핑을 UDP용과 TCP용의 두 개의 개별 매핑으로 분할합니다.

유사한 IPv6 설정도 분할해야 할 수도 있습니다.ip6 nexthdr사용하기에 안전하지 않음대체 ip protocol및 올바른 대체 meta l4proto도 협력하지 않습니다.

관련 정보