지난 2년 동안 동일한 구성으로 nftables를 사용해 왔으며 며칠 전에 프로그램을 업데이트했는데 이제는 모든 문서에 여전히 올바른 것으로 나와 있음에도 불구하고 내 구성이 유효하지 않다고 불평합니다. 어쩌면 누군가 불량 기호 같은 것을 발견할 수 있을까요?
내 구성은 다음과 같습니다.
flush ruleset
# `inet` applies to both IPv4 and IPv6.
table inet filter {
chain input {
type filter hook input priority 0;
# accept any localhost traffic
iif lo accept
# no ping floods:
ip protocol icmp icmp type echo-request limit rate over 10/second burst 4 packets drop
ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 10/second burst 4 packets drop
# accept traffic originated from us
ct state established,related accept
# ssh
tcp dport 22 accept
# http/https
tcp dport 80 accept
tcp dport 443 accept
# tftp/netboot
udp dport 4011 accept
udp dport 67 accept
tcp dport 69 accept
udp dport 69 accept
# listinator
tcp dport 8080 accept
tcp dport 4343 accept
# smb
tcp dport 139 accept
tcp dport 445 accept
udp dport 137 accept
udp dport 138 accept
# mc
tcp dport 25565 accept
# count and drop any other traffic
counter drop
}
chain output {
type filter hook output priority 0;
policy accept;
}
chain forward {
type filter hook forward priority 0;
nft add rule inet filter forward ct status dnat accept;
policy drop;
}
}
시작할 때 오류가 발생했습니다.
Starting nftables...
/etc/nftables.conf:57:6-8: Error: syntax error, unexpected add
nft add rule inet filter forward ct status dnat accept;
^^^
nftables.service: Main process exited, code=exited, status=1/FAILURE
nftables.service: Failed with result 'exit-code'.
Failed to start nftables.
답변1
이것은 내부에 있습니다.nftables 스크립트명령으로 로드됩니다 nft -f
. 그 nft
단어는 내부적으로 의미가 없으며 나타나서는 안 됩니다. 그러나 같은 장소에 1 1/2개의 다른 문제가 있습니다. 그럼 보자:
명령이 불평하는 줄 주위에는 다음 nft
이 있습니다.
chain forward { type filter hook forward priority 0; nft add rule inet filter forward ct status dnat accept; policy drop; }
nft
제거할,이미
inet filter forward
(체인) 블록 안에 있습니다.따라서
add rule inet filter forward
제거도 해야 합니다. 실제로;
그 뒤에 새로운 줄이 있기 때문에 불필요합니다.ct status dnat accept
policy drop;
기본 체인 정의와 함께 넣어야 합니다.이번에는
;
구문의 필수 부분이 있습니다. 키워드policy
는체인정의, 의 일부가 아님규칙정의. 이는 현재 규칙에 따라 기본 체인 정의와 별도로 허용되는 것처럼 보이지만 이는 의존할 사항이 아닙니다. 이는 이후 릴리스에서 변경될 수 있습니다.체인 에도 동일한 설명이 적용됩니다 . 나중에 실수로 규칙을 삽입하지 않도록 기본 체인 정의에서
output
분리하지 마십시오 .policy accept;
체인은 forward
결국 다음으로 교체되어야 합니다.
chain forward {
type filter hook forward priority 0; policy drop;
ct status dnat accept
}
올바른 구문이지만 실제로 흥미롭지는 않은 것은 블록 내부가 아닌 구조 외부에서 규칙을 다음과 같이 스크립트 끝에서 정의하는 것입니다.
chain forward {
type filter hook forward priority 0; policy drop;
}
}
add rule inet filter forward ct status dnat accept
어쨌든 체인 블록 nft list ruleset
내에서 이전과 같이 다시 표시됩니다 inet filter forward
.
노트:
사용하는 것은 괜찮지만
ip protocol icmp
사용하는 것은 좋지 않습니다.ip6 nexthdr ipv6-icmp
그 이유는 IPv4 헤더의 프로토콜이 항상 레이어 4 프로토콜인 IPv4와 달리 IPv6의 경우다음 헤더항상 계층 4(icmp, udp, tcp...) 헤더는 아닙니다.확장 헤더IPv6 헤더와 레이어 4(최종) 헤더 사이에 나타납니다. 이 경우 규칙이 일치하지 않습니다.
OS는 이 패킷이 어떤 레이어 4 프로토콜에 속하는지 이미 결정했으므로 해당 정보는 패킷 콘텐츠 정보가 아닌 메타 정보로 사용할 수 있습니다
meta l4proto ipv6-icmp
.이것은 또한매뉴얼 페이지에 문서화되어 있음:
이 표현식은 ipv6 헤더 필드를 나타냅니다. 를 사용할 때 주의하세요
ip6 nexthdr
. 값은 다음 헤더만 참조합니다. 즉,ip6 nexthdr tcp
ipv6 패킷에 확장 헤더가 포함되지 않은 경우에만 일치합니다. 단편화되었거나 라우팅 확장 헤더를 포함하는 패킷은 일치하지 않습니다.meta l4proto
실제 전송 헤더와 일치시키려는 경우 사용 하고 대신 추가 확장 헤더를 무시하십시오.하지만 실제로는 같은 줄에
icmpv6 type ...
라인이 포함되어 있으므로 이는 이미 ICMPv6과 일치하도록 레이어 4 프로토콜을 필터링하고 동시에ICMPv6을 사용하면 암시적으로 레이어 3 프로토콜이 IPv6과 일치하도록 설정됩니다.: 올바르게 만드는 데는 아무것도 필요하지 않습니다.마찬가지로 이전 줄도
ip protocol icmp
같은 이유로 없이 수행할 수 있습니다(그러나 현재 동작은 여전히 괜찮습니다).라인:
ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 10/second burst 4 packets drop
간단히 다음으로 대체해야 합니다.
icmpv6 type echo-request limit rate over 10/second burst 4 packets drop
(앞에 추가할 필요 없이
meta nfproto ipv6 meta l4proto icmpv6
)TFTP
-
TCP 포트 69는 사용되지 않으므로 이를 허용하는 규칙이 필요하지 않습니다.
TFTP 및 상태 저장 방화벽
TFTP방화벽의 FTP만큼 어려운 프로토콜입니다. 초기 쿼리 후 데이터 전송 자체는 더 이상 UDP 포트 69를 사용하지 않습니다. 적절한 사용TFTP 연결 추적 도우미더 이상 사용되지 않는 sysctl 설정을 다시 활성화하지 않는 한 추가 규칙(커널 모듈을 자동 로드해야 함
nf_conntrack_tftp
)이 필요할 수 있습니다 .net.netfilter.nf_conntrack_helper
여기서 이 문제를 다루기에는 실제로 주제에서 벗어나게 됩니다. 내 답변의 시작 부분만 확인하세요.nft 및 방화벽이 있는 NAT 라우터인 CentOS 8 - TFTP를 통과하도록 하는 방법은 무엇입니까?대체하기 위해 복사할 수 있는 예시 TFTP 규칙 세트를 갖고 싶습니다.nftables 위키의 FTP 예.
-
포트 값만 다른 동일한 규칙은 다음을 사용하여 인수분해할 수 있습니다.익명 세트.nftables 버전 >= 1.0.2에는
-o
(최적화) 옵션 도 있습니다.이 작업을 자동으로 시도합니다.