iptables/nftables: 라우터의 연결 추적에서 전달된 모든 트래픽을 제외하는 방법은 무엇입니까?

iptables/nftables: 라우터의 연결 추적에서 전달된 모든 트래픽을 제외하는 방법은 무엇입니까?

Linux 상자에는 여러 네트워크 인터페이스가 있습니다. IPv4 및 IPv6에 대해 IP 전달이 활성화됩니다.

상태 저장 방화벽을 통해 라우터 자체에서 실행되는 서비스를 보호하고 싶습니다. 이를 위해서는 연결 추적을 활성화해야 합니다. 동시에 한 인터페이스에서 다른 인터페이스로 전달되는 모든 트래픽을 연결 추적에서 제외하고 싶습니다.

상태 저장 방화벽의 경우 일반적으로 필터 테이블의 INPUT 및 OUTPUT 체인을 사용합니다. 전달된 트래픽은 FORWARD 체인으로 이동합니다. 그러나 AFAIK에는 FORWARD 체인에서 트래픽을 추적되지 않은 것으로 표시할 방법이 없습니다. 이러한 논리는 원시 테이블의 PREROUTING 체인으로 이동해야 합니다. 하지만 PREROUTING 체인에서는 트래픽이 전달되는지 여부가 아직 결정되지 않았다고 생각합니다.

연결 추적에는 추적된 연결 목록이 최대 크기에 도달하면 패킷이 삭제되는 등 많은 단점이 있습니다.

연결 추적에서 전달된 트래픽(및 전달된 트래픽만)을 제외하는 가장 쉬운 방법은 무엇입니까?

답변1

일반적인 규칙 세트의 경우 다음과 같이 질문할 수 있습니다.nftables경로를 미리 검색하려면fib라우팅 스택이 이를 수행할 때까지 기다리는 대신 표현식을 사용하세요. 이를 통해 (미래)를 포함할 수 있습니다.산출인터페이스가 아직 존재하지 않음에도 불구하고(라우팅 결정이 발생하지 않음) 추가 조회가 필요합니다. 그런 다음 결과에 따르면 패킷이 라우팅될 것으로 나타나면 다음을 사용하여 추적이 발생하지 않도록 합니다.notrack성명.

FIB 표현

fib {saddr | daddr | mark | iif | oif} [. ...] {oif | oifname | type}

악의 없는 거짓말표현식은 다음을 쿼리합니다.악의 없는 거짓말(포워딩 정보 베이스) 특정 주소가 사용할 출력 인터페이스 인덱스와 같은 정보를 얻기 위한 것입니다. 입력은 입력으로 사용되는 요소의 튜플입니다.악의 없는 거짓말조회 기능.

NOTRACK 문

notrack 문을 사용하면 특정 패킷에 대한 연결 추적을 비활성화할 수 있습니다.

notrack

이 명령문이 유효하려면 패킷 이전에 적용되어야 합니다.콘트랙조회가 발생합니다. 따라서 다음 중 하나와 함께 체인에 있어야 합니다.사전 라우팅또는산출후크 및 후크 우선순위는 -300 이하입니다.

따라서 "간단한" 경로 확인을 수행해야 합니다.사전 라우팅, 대상 주소만 선택기로 사용하고 출력 인터페이스의 존재를 확인합니다(라우팅할 수 없는 패킷이나 호스트용 패킷은 어떤 것도 확인하지 않습니다). 다음에는 예외가 있습니다.봐라(루프백) 인터페이스를 통해 추적을 유지합니다. 로컬 트래픽을 나타내는 동안 패킷이 전송됩니다.산출경로) 호스트에서 자체로 돌아옵니다.사전 라우팅경로가 있으며 다음과 같은 출력 인터페이스가 있습니다.봐라도. 나가는 패킷이 이미 생성되었으므로콘트랙항목을 일관되게 유지하는 것이 좋습니다.

nft add table ip stateless
nft add chain ip stateless prerouting '{ type filter hook prerouting priority -310; policy accept; }'
nft add rule ip stateless prerouting iif != lo fib daddr oif exists notrack

ip제품군을 콤보 제품군으로 바꾸면 inet동일한 일반 동작이 IPv4+IPv6으로 확장됩니다.

보다 구체적으로 예를 들어 미래의 출력 인터페이스를 지정할 수 있습니다 fib daddr oif eth1. 이는 와 거의 동일 oif eth1하지만 다음에서도 사용할 수 있습니다.사전 라우팅.

물론 토폴로지가 미리 알려진 경우 주소 테스트를 기반으로 한 하나 또는 몇 가지 규칙을 사용하여 FIB 조회를 피할 수 있습니다. 그러면 관리자가 경로를 미리 알 수 있기 때문입니다. 이것이 일반적인 방법을 유지하는 것보다 더 흥미로운지 확인하려면 결과를 벤치마킹해야 할 수도 있습니다.

예를 들어 OP가 제공한 정보를 사용하여 이전 규칙을 다음으로 바꿉니다.

nft add rule ip stateless prerouting 'ip daddr != { 192.168.1.1, 192.168.2.1, 127.0.0.0/8 } notrack'

거의 동등한 효과를 가져야 합니다. 127.0.0.0/8은 위와 같은 이유로 존재합니다.봐라상호 작용.

브로드캐스트 처리(예: 192.168.1.255 수신됨)eth0) 및 멀티캐스트(인터페이스에서 수신된 link-local 224.0.0.1과 같은)는 두 방법 모두에서 동일하게 작동하지 않을 수도 있고 예상한 대로 작동하지 않을 수도 있으며 특히 두 번째 방법의 경우 특정 요구 사항에 대해 추가 규칙이 필요할 수 있습니다. 브로드캐스트 및 멀티캐스트 추적은 거의 유용하지 않습니다. 응답 소스가 원래 브로드캐스트 또는 멀티캐스트 주소 대상이 아니므로(할 수도 없고) conntrack 항목이 양방향 트래픽을 "인식"하지 않기 때문입니다. 일반적으로 별 문제가 되지 않습니다. 상태 저장 규칙.


노트

  • 이는 일반적으로 상태 저장 NAT와 호환되지 않습니다.

    내가 이해하는 바는 원격 호스트를 향한 DNAT가 NAT가 해제되지 않은 응답 트래픽을 가져오고 실패하며 전달된 SNAT가 없기 때문에 트리거되지 않는다는 것입니다.콘트랙항목이 생성되었습니다. 입력 경로에서 거의 사용되지 않는 SNAT는 괜찮고 DNAT+SNAT 조합(로컬 주소 소스 사용)도 작동할 수 있습니다. 그 이후에는 원래 방향과 응답 방향 모두에서 로컬 대상이 관련되어 있으므로콘트랙그러면 항목이 항상 올바르게 생성되거나 조회되어야 합니다.

  • 표준 규칙 세트

    실제 규칙을 사용하여iptables또는nftables(자체 다른 테이블에서) 호스트 자체에 대한 상태 저장 규칙을 포함하여 평소와 같이 수행할 수 있습니다. 라우팅된 트래픽이 생성되지 않으므로콘트랙이러한 트래픽과 관련된 항목, 규칙은 상태 비저장만 고수해야 하며 ct일치하지 않으므로 어떤 표현도 사용하지 않아야 합니다.

  • 행동 확인

    적절한 방화벽 규칙이 없어도 다음을 통해 전반적인 동작을 확인할 수 있습니다.

    • 더미 ct규칙을 사용하여콘트랙시설은 현재 네트워크 네임스페이스에 등록됩니다.

      nft add table ip mytable
      nft add chain ip mytable mychain '{ type filter hook prerouting priority -150; policy accept; }'
      nft add rule ip mytable mychain ct state new
      
    • 사용conntrack이벤트를 추적하는 도구:

      conntrack -E
      
    • 원격에서 트래픽 생성

      새로운콘트랙그러면 라우터가 수신할 트래픽에 대한 항목이 생성되지만 라우팅된 트래픽에 대한 항목은 생성되지 않습니다.

관련 정보