긴 서비스 목록으로 서버를 설정했는데 IPv4에서 모든 것이 잘 실행되고 있습니다. 그러나 IPv6에 대해 테스트했을 때 아무것도 해결되지 않았습니다. 모든 것을 비활성화 한 후 nftables
작동하기 시작하여 다시 켰고 시행착오를 거쳐 -->
문제를 일으킨 두 줄을 식별할 수 있었습니다(아래 참조).
# Accept related or established, drop bad, accept everything else
add rule inet filter INPUT ct state related,established accept
add rule inet filter INPUT tcp flags & (fin|syn|rst|psh|ack|urg) == 0x0 drop
--> add rule inet filter INPUT tcp flags & (fin|syn|rst|ack) != syn ct state new drop
--> add rule inet filter INPUT tcp flags & (fin|syn|rst|psh|ack|urg) == fin|syn|rst|psh|ack|urg drop
add rule inet filter INPUT iifname "lo" accept
나는 TCP에 대해 제대로 교육받지 못했고 실제로 내가 배운 것은 문제에 빠지는 것뿐입니다. 따라서 내가 여기서 하고 있는 일을 설명하는 데 도움이 필요합니다. 제가 이해한 바는 모든 관련/확립 트래픽과 루프백 인터페이스와 관련된 모든 트래픽을 허용한다는 것입니다. 저는 단지 "새로운" 요청을 보고 있는 중입니다...
syn
내 문제는 내가 and 이외의 TCP 플래그를 실제로 이해하지 못한다는 것입니다 ack
.3방향 TLS 핸드셰이크), 여기에 추가한 다른 것들은 내가 보고 있는 튜토리얼에서 공통적으로 나타나는 것 같습니다. 내 걱정은 그것들을 거기에 두거나 꺼내는 것이 무엇을 의미하는지, 그리고 내가 무엇을 열어가는지 이해하지 못한다는 것입니다. 내 목표는 IPv4 및 IPv6 트래픽을 허용하면서 모든 트래픽을 제거하는 것입니다.나쁜또는관련 없는패킷이 통과할 수 없습니다.
이는 결국 상용 제품으로 연결될 것이므로 더 잘 이해하고 싶지만 지침이 필요합니다. 누구든지 이 문제를 해결하는 데 도움을 줄 수 있다면 매우 감사하겠습니다.
편집하다:이 중 어느 것도 문제가 되지 않았으며 문제를 일으킨 규칙은 실제로 rule 이었고 icmp
IPv6이 nb-*
제대로 작동하려면 몇 가지 규칙이 필요하다는 것이 밝혀졌습니다. 답변에 자세한 내용을 제공하겠습니다.
답변1
질문 업데이트에서 지적했듯이 제가 게시한 규칙이 범인이 아닌 것으로 밝혀졌습니다. 실제 문제는 ICMP 트래픽, 특히 IPv6와 직접 관련된 유형과 관련이 있습니다. 내 ICMP 규칙은 ...
add rule inet filter INPUT ct state new icmp type { echo-request, echo-reply } accept
add rule inet filter INPUT ct state new icmpv6 type { echo-request, echo-reply } accept
그러나 IPv6을 제대로 실행하려면 몇 가지 사항이 필요합니다.이웃이 알아냈어요관련 규칙( nd-*
). 나는 "훌륭한 온라인 시민"의 일환으로 몇 가지 다른 유형과 함께 이들을 포함시켰습니다. 저는 이 질문이 실제로 공격을 완화하는 데 중요하다고 생각했고, 이제 ICMP 트래픽을 수정했고 제대로 작동하고 있습니다.
새로운 ICMP 규칙은 다음과 같습니다.
add rule inet filter INPUT ip protocol icmp icmp type { destination-unreachable, echo-reply, echo-request, source-quench, time-exceeded } accept
add rule inet filter INPUT ip6 nexthdr icmpv6 icmpv6 type { destination-unreachable, echo-reply, echo-request, nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert, packet-too-big, parameter-problem, time-exceeded } accept
문제의 원래 규칙은 실제로 악의적인 행동을 완화하는 것이었던 것 같습니다...
크리스마스 공격이 규칙은 완화하기 위한 것입니다.크리스마스 공격또는 모든 TCP 패킷 비트를 활성화합니다.유형그렇지 않은 경우 "크리스마스 트리"처럼 불을 켜서 이러한 요청에 대한 운영 체제 응답의 미묘한 차이를 분석하여 악의적인 행위자에 대한 추가 공격 벡터를 식별하는 데 도움을 줍니다.
add rule inet filter INPUT tcp flags & (fin|syn|rst|psh|ack|urg) == fin|syn|rst|psh|ack|urg drop
강제 SYN 확인내가 올바르게 이해했다면 이는 리소스 고갈을 통한 서비스 거부와 같이 리소스에 대한 공격의 일부일 수 있는 초기 SYN 패킷 이전에 다른 쓸모 없는 패킷을 제거하여 처리 부하를 줄이는 데 도움이 됩니다.
add rule inet filter INPUT tcp flags & (fin|syn|rst|ack) != syn ct state new drop
이 게시물내 발을 찾고 더 나은 이해를 찾기 시작하는 데 도움이되었습니다.
이것이 다른 사람에게 답변에 대한 지름길을 제공하기를 바랍니다! :)
답변2
nftables 규칙을 단순화하고 싶을 수도 있습니다. 이것이 내가 가진 것입니다:
table inet Filter {
chain Input {
type filter hook input priority 0
policy drop
iif lo accept
ct state established,related counter accept
ct state invalid counter drop
#Your other rules here
# this rule exists to avoid junk in syslog
ct state new tcp flags & (fin|syn|rst|ack) != syn counter drop
}
}
필요하지 않으면 counter
어디에서나 삭제할 수 있습니다 .
답변3
IP6 규칙이 IP4 규칙에 의해 깨지는 것을 원하지 않으면 "inet"를 "ip"로 변경하십시오. nftables는 IP4("ip"), IP6("ip6"), IP4와 IP6("inet") 모두에 적용되는 규칙을 허용합니다. 목표는 TCP 및 UDP 규칙을 한 곳에서 일관되게 처리할 수 있는 것입니다. 이 기능은 나중에 버그라고 불렸습니다.