`conntrack`과 `--protocol` 등을 혼합하여 규칙을 다시 작성하려고 합니다. v4

`conntrack`과 `--protocol` 등을 혼합하여 규칙을 다시 작성하려고 합니다. v4

난 방금 읽었어iptables매뉴얼 페이지. 모듈의 경우 ?를 conntrack사용/ --ctproto선호 해야 하는 것 같습니다 .--protocol

지금까지 써본거 더 잘 보여드릴께요, 언젠가는 옮겨갈게요ct*. 어쨌든, 여기 있습니다:

$ cat /etc/iptables/rules.v4 
*filter
:INPUT      DROP      [0:0]
:FORWARD    DROP      [0:0]
:OUTPUT     ACCEPT    [0:0]
--append INPUT --in-interface lo --match comment --comment "Allow loopback" --jump ACCEPT
--append INPUT --match conntrack --ctstate INVALID --match comment --comment "Drop invalid packets" --jump DROP
--append INPUT --match conntrack --ctstate NEW --protocol tcp ! --syn --match comment --comment "Reject new non-syn TCP" --jump REJECT --reject-with tcp-reset
--append INPUT --match conntrack --ctstate NEW,ESTABLISHED --protocol tcp --match tcp --destination-port 22 --source 192.168.0.0/24 --match comment --comment "Allow local SSH on default port" --jump ACCEPT
--append INPUT --protocol icmp --icmp-type echo-request --match limit --limit 2/second --limit-burst 5 --match comment --comment "Allow only ping and within limits" --jump ACCEPT
--append INPUT --match conntrack --ctstate RELATED,ESTABLISHED --match comment --comment "Normal traffic" --jump ACCEPT
COMMIT

그래서 다음과 같이 다시 작성해 보았습니다.

*filter
:INPUT      DROP      [0:0]
:FORWARD    DROP      [0:0]
:OUTPUT     ACCEPT    [0:0]
--append INPUT --in-interface lo --match comment --comment "Allow loopback" --jump ACCEPT
--append INPUT --match conntrack --ctstate INVALID --match comment --comment "Drop invalid packets" --jump DROP
--append INPUT --match conntrack --ctstate NEW --ctproto tcp ! --syn --match comment --comment "Reject new non-syn TCP" --jump REJECT --reject-with tcp-reset
--append INPUT --match conntrack --ctstate NEW,ESTABLISHED --ctproto tcp --match tcp --destination-port 22 --source 192.168.0.0/24 --match comment --comment "Allow local SSH on default port" --jump ACCEPT
--append INPUT --match conntrack --ctproto icmp --icmp-type echo-request --match limit --limit 2/second --limit-burst 5 --match comment --comment "Allow only ping and within limits" --jump ACCEPT
--append INPUT --match conntrack --ctstate RELATED,ESTABLISHED --match comment --comment "Normal traffic" --jump ACCEPT
COMMIT

다른 방법을 시도하면 다음과 같은 오류가 발생할 수 있으며 다른 오류도 발생할 수 있습니다.

# iptables-restore < rules.v4-ct 
iptables-restore v1.8.4 (legacy): unknown option "--syn"
Error occurred at line: 7
Try `iptables-restore -h' or 'iptables-restore --help' for more information.
# iptables-restore < rules.v4-ct 
iptables-restore v1.8.4 (legacy): unknown option "--icmp-type"
Error occurred at line: 9
Try `iptables-restore -h' or 'iptables-restore --help' for more information.
# iptables-restore < rules.v4-ct 
iptables-restore: line 11 failed
# iptables-restore < rules.v4-ct 
Bad argument `COMMIT'
Error occurred at line: 11
Try `iptables-restore -h' or 'iptables-restore --help' for more information.

이에 대해 밝혀주시면 감사하겠습니다.

답변1

몇 가지 참고사항:

  • 사람들이 먼저 사용해야 하는 곳이 어디인지 알고 싶습니다 --ctproto tcp.
  • 정밀한OP의 맨페이지 URL 링크10년이 넘었습니다. 예를 들어 이 답변 끝에 있는 주석에 사용된 conntrack일치 모듈이 포함되어 있지 않습니다. --ctreplsrcport두 개의 매뉴얼 페이지로 분할되지 않았습니다.iptables(기본) 및iptables-extensions오늘날 대부분의 흥미로운 문서(일치 및 표적)가 여기에 존재합니다. 나는 인수와 하위 명령에 대한 링크를 제공하는 데비안 매뉴얼 페이지를 선호하지만(예:conntrack성냥)가 자주 나타납니다.

질문에 관하여:

  • --protocol은 내장된 기능이며 iptables추가 일치 모듈이 필요하지 않습니다(설명 참조 iptables-extensions(8)). 일치 모듈 인수가 아니며 종속성을 여러 모듈로 변경합니다.

  • 모듈을 로드하지 않고 모듈별 매개변수를 사용하면 작동하지 않습니다.

    • --syn의 일부입니다-m tcp이 모듈을 로드하지 않으면 사용할 수 없습니다.

      이로 인해 7호선이 실패합니다.

    • --icmp-type의 일부입니다-m icmp이 모듈을 로드하지 않으면 사용할 수 없습니다.

      이로 인해 9호선이 실패합니다.

  • 프로토콜별 모듈은 프로토콜을 지정해야 합니다.

    프로토콜(예: -p tcp)을 선언하면 자동으로 동일한 이름(예: -m tcp)을 가진 모듈 로드를 시도합니다. 그 반대는 사실이 아닙니다. 이것이 바로 tcpOR icmp모듈이 명시적으로 작성되는 경우가 거의 없지만 그림과 같이 실제로는 항상 존재하는 이유 입니다 iptables-save. 이는 명시적으로 문서화되어 있지 않지만 만약 그렇다면 문서는 다음과 같습니다.엄격하게둘째, 항상 최신 문서를 작성 -p tcp하고 존중해야 합니다.-m tcp

    • 전송 제어 프로토콜

      tcp

      --protocol tcp지정된 경우 이러한 확장을 사용할 수 있습니다. 다음과 같은 옵션을 제공합니다.

      7행이 추가 되면 -m tcp7행과 8행은 여전히 ​​실패합니다(분명히 커널 검증 수준에서).

    • ICMP

      icmp(IPv4 전용)

      --protocol icmp지정하는 경우 이 확장을 사용할 수 있습니다. 다음과 같은 옵션을 제공합니다.

      이러한 이유로 9행이 실패합니다(분명히 커널 검증 수준에서).

따라서 사용 가능하더라도 --ctproto tcp일부가 아닌 기능이 필요할 때마다 -p tcp -m tcp여전히 필요합니다. ICMP도 마찬가지다. 보다 구체적인 방법을 사용할 수 있는 경우 conntrack이를 위해 모듈을 사용하는 것은 아마도 가치가 없을 것입니다.

또한 conntrack검색연결하다테이블은 특정 방법보다 비용이 더 많이 들 수 있습니다(그러나 실제로 조회가 완료되면(prio -200 기준)연결하다시설),항목에 대한 참조 캐싱상태는 패킷의 skbuff에서도 직접 확인할 수 있습니다.

몇 가지 참고사항:

  • nf_conntrack_tcp_loose

    시스템(네트워크 네임스페이스) 수준에서 이 필터는 다음을 수행합니다.

    -A INPUT -p tcp -m conntrack --ctstate NEW --ctproto tcp -m tcp ! --syn -m comment --comment "Reject new non-syn TCP" -j REJECT --reject-with tcp-reset
    

    최종 REJECT목표를 제외하고는 다음으로 대체될 수 있습니다.

    sysctl -w net.netfilter.nf_conntrack_tcp_loose=0
    

    이러한 패킷은 이제 유효하지 않은 것으로 분류되어 유효하지 않은 규칙 검사를 통해 삭제됩니다(OP 규칙에서 거부되는 대신). 기본적으로 느슨한 모드는 일시적으로 중단된 트래픽(예: 상태 저장 라우팅 방화벽 다시 시작)을 재개할 수 있도록 활성화됩니다.

  • 8호선은 실제로 완료될 수 있습니다.아니요 -p tcp -m tcp

    왜냐면 이 사건 때문에-m conntrack대체하는 기능이 있습니다.

    nat/PREROUTING 규칙은 원래 대상 포트(22와 다를 수 있음)를 변경할 수 있으므로 --ctreplsrcport 22아래에서는 보다 자연스러운 포트가 선택됩니다 --ctorigdstport 22.

    -A INPUT -s 192.168.0.0/24 -m conntrack --ctstate NEW,ESTABLISHED --ctproto tcp --ctreplsrcport 22 --match comment --comment "Allow local SSH on default port" --jump ACCEPT
    

    심지어(드물게 사용되는 nat/INPUT은 필터/입력 후에 발생합니다. 일부 문서에서는 달리 설명하지만 소스에서는 아무 것도 변경되지 않으며 --ctorigsrc자연스럽게 사용할 수 있습니다):

    -A INPUT -m conntrack --ctstate NEW,ESTABLISHED --ctproto tcp --ctreplsrcport 22 --ctorigsrc 192.168.0.0/24 --match comment --comment "Allow local SSH on default port" --jump ACCEPT
    

관련 정보