iptables(-nft)의 MSS 클램프가 nftables에서 작동하지 않는 것처럼 보이는 이유는 무엇입니까?

iptables(-nft)의 MSS 클램프가 nftables에서 작동하지 않는 것처럼 보이는 이유는 무엇입니까?

iptables -t mangle -o "$PPP_IFACE" --insert FORWARD 1 -p tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:65495 -j TCPMSS --clamp-mss-to-pmtu내 pppoe 클라이언트는 iptables의 규칙을 자동으로 추가합니다 /etc/ppp/ip-up.d. 그러나 nftables의 이 규칙은 다음과 같습니다.

table ip mangle {
    chain FORWARD {
        type filter hook forward priority mangle; policy accept;
        oifname "ppp0" meta l4proto tcp tcp flags & (syn|rst) == syn # tcpmss match 1400:65495 counter packets 714 bytes 42388 tcp option maxseg size set rt mtu
    }
}

tcpmss 이후의 내용이 주석 처리되어 있는데 이 규칙이 아무런 효과가 없는 것처럼 보이는 이유는 무엇입니까?

답변1

설명하다

  • 에 의해 iptables-nft설정된 규칙xtables 커널 모듈(여기:xt_tcpmss그리고xt_TCPMSS)통과하다nftables커널 API호환성 레이어 API, 일지라도확장 테이블원래 (레거시 커널 API)에 사용되었습니다.iptables.

    국가의nftables____이(가) 작동하지 않습니다확장 테이블커널 모듈 디자인: 언제나확장 테이블사용 중이면 더 이상 네이티브가 아니며 userland nft명령(또는 해당 API)은 네이티브만 처리합니다.nftables. 사용확장 테이블호환성 레이어용으로 예약되어 있습니다. 그래서 디스플레이가 지나갈 때NFFT알 수 없는 모듈은 모두 주석 처리됩니다(아래 참조).

  • 현재 버전은 iptables-nft아직 자동 번역할 수 없습니다.iptables규칙이 현지화되었습니다.nftables규칙(이 경우) 또는 이에 상응하는 기본 규칙이 없습니다.nftables규칙은 다음으로 번역됩니다(예: 생각하다LED표적).

    여기 nft보이네확장 테이블범용 번역 엔진이 번역할 수 없는 모듈은 따라서 이 부분을 금지된 것으로 간주하고 번역할 수 없는 부분에 주석을 달지만 여전히 알고 있는 내용을 번역합니다. 부르다확장 테이블모듈은 다음을 통해 볼 수 있습니다 --debug=netlink.

    # nft -a --debug=netlink list ruleset
    ip mangle FORWARD 2
      [ meta load oifname => reg 1 ]
      [ cmp eq reg 1 0x30707070 0x00000000 ]
      [ meta load l4proto => reg 1 ]
      [ cmp eq reg 1 0x00000006 ]
      [ match name tcp rev 0 ]
      [ match name tcpmss rev 0 ]
      [ counter pkts 0 bytes 0 ]
      [ target name TCPMSS rev 0 ]
    
    table ip mangle { # handle 167
      chain FORWARD { # handle 1
          type filter hook forward priority mangle; policy accept;
          oifname "ppp0" meta l4proto tcp tcp flags & (syn|rst) == syn # tcpmss match 1400:65495 counter packets 0 bytes 0 tcp option maxseg size set rt mtu # handle 2
      }
    }
    

    위 그림 : matchtarget의미확장 테이블기준 치수. ~부터nftables함께 사용iptables-번역-m tcpmss --mss 1400:65495이런 점에서 주석으로 시작하는 질문이고 출력에는 번역되지 않고 마지막 부분은 번역되기 때문에 문제가 발생했다고 추측할 수 있습니다 .여기에 표시된 내용은 nft데모 목적으로만 제공되며 실제 규칙으로 사용되지는 않습니다..

    실제 규칙은 표시된 바이트코드 --debug=netlink(보이지 않는 부분 포함) 입니다.확장 테이블특정 데이터), 따라서 이 바이트코드는 이 규칙의 증거입니다.뭔가를 해보세요. 현지인에게는 유용하지 않음nftables.

국가의nftables버전

예를 들어 대부분의 OPiptables규칙은 로컬로 번역될 수 있습니다.

# iptables-translate -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
nft add rule ip mangle FORWARD tcp flags & (syn|rst) == syn counter tcp option maxseg size set rt mtu

현재 자동 번역 기능은 없지만 -m tcpmss --mss해당 기능은 다음과 같습니다.쓸 수 있는: tcp option maxseg size표현식( match 와 동일 -m tcpmss --mss) 또는 set명령문( target 과 동일 -j TCPMSS)으로 사용할 수 있습니다. 다음은 이러한 번역의 결과입니다(번역 엔진이 개선되면 나중에 나타날 수 있음).

nft add rule ip mangle FORWARD 'oifname ppp0 tcp flags & (syn|rst) == syn tcp option maxseg size 1400-65495 counter tcp option maxseg size set rt mtu'

두 번째 값 65495는 유용하지 않을 수 있습니다(대체 가능 tcp option maxseg size >= 1400).


노트

nftiptables-nft번역을 오용하려고 하면 오해의 소지가 있을 수 있습니다. 예를 들어iptables v1.8.7 (nf_tables)그리고NFFTv1.0.0, 다음을 얻습니다.

# iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
# nft list ruleset | tee /tmp/mss.nft
table ip mangle {
    chain FORWARD {
        type filter hook forward priority mangle; policy accept;
        meta l4proto tcp tcp flags & (syn|rst) == syn counter packets 0 bytes 0 tcp option maxseg size set rt mtu
    }
  }
# nft flush ruleset
# nft -f /tmp/mss.nft
# iptables-save 
# Table `mangle' is incompatible, use 'nft' tool.

nft이는 전체 규칙 세트가 표시될 때 번역되었지만 초기 호환 규칙 세트에는 여전히 다음이 포함되어 있기 때문입니다.확장 테이블바이트코드의 대상(위에서 본 것과 동일) [ target name TCPMSS rev 0 ]: 차이를 iptables-nft표시하지 않고 iptables-translate숨기는 출력입니다. 명령을 다시 nft실행 하면 nft결과는 완전히 기본입니다.nftablestcp option maxseg size set rt mtu대체되었지만 명령 -j TCMPSS --clamp-mss-to-pmtuiptables-save더 이상 결과를 인식하지 못합니다.iptables- 번역된 코드는 다시 번역할 수 없습니다.iptables체재.

맹목적으로 버리지 마세요iptables사용 규칙nftables다시 로드하세요nftables,만약에iptables여전히 필요합니다.

관련 정보