및 .10.x.y.0/24
0 ≤ x ≤ 50
0 ≤ y ≤ 20
의 각 값 10.x.y.0/24
과 사이의 트래픽을 허용하고 싶습니다 .10.z.y.0/24
(x, y, z)
실행 파일을 사용하여 스크립트를 작성할 수 있지만 nft
단일 규칙과 이진 작업을 사용하여 스크립트를 작성할 수 있는지 궁금합니다.
y
"Extract"를 사용하여 주소의 "바이트"를 추출 할 수 있지만 연산자를 ip saddr & 0.0.255.0
사용하려고 하면 구문이 유효하지 않다는 메시지가 나타납니다.==
nftables
$ cat /etc/nftables.conf
# [...]
ip saddr & 0.0.255.0 == daddr & 0.0.255.0 accept
# [...]
$ sudo nft -f /etc/nftables
/etc/nftables.conf:113:27-31: Error: syntax error, unexpected daddr
ip saddr & 0.0.255.0 == daddr & 0.0.255.0 accept
나는 몇 가지 변형을 시도했지만 그 중 어느 것도 작동하지 않는 것 같고 NTFables 위키는 패킷의 다른 필드를 비교하지 않습니다.
이를 수행할 수 있는 방법이 있습니까?
답변1
지금은 그럴 생각이 없다nftables오른쪽의 상수가 아닌 표현식 비교를 지원합니다. 이 제한이 충분한 바이트코드를 생성하는 방법에 대한 사용자 공간 측에 있는지, 아니면 커널 측의 바이트코드가 그러한 것을 처리할 수 없는지 알 수 없습니다. 상수나 세트/맵 조회가 있을 수 있지만 그게 전부입니다. 이는 앞으로 발전할 수 있습니다.
어쨌든 나는 다음을 사용하여 대체 솔루션을 생각해 냈습니다.놓다그리고직렬 연결조회 테이블로. 특정 넷마스크 작업을 계속 사용하려면 y 요소(21)만 필요합니다. 이는 철저한 규칙 세트나 이에 상응하는 전체 세트 버전보다 훨씬 낫습니다(해시되기 때문에 단순한 규칙 세트보다 여전히 빠릅니다). 더 많은 규칙이 필요할 수 있습니다. 또는 일치하는 목록의 전체 요소입니다.
예제에서는 테이블 ip myfilter
과 해당 체인을 사용하겠습니다 type filter hook forward
. 다음을 수정하십시오.ip myfilter forward
nft add table myfilter
nft add chain ip myfilter forward '{ type filter hook forward priority 0; policy drop; }'
연결된 두 가지 IP 주소 유형으로 구성된 집합을 추가합니다.
table ip myfilter {
set same-y {
type ipv4_addr . ipv4_addr
}
}
내장:
nft add set ip myfilter same-y '{ type ipv4_addr . ipv4_addr; }'
검색은 두 개의 IP 주소를 연결한 것과 일치합니다. 이제 비교의 왼쪽에 연산자를 적용하는 것이 가능하므로 사용자 정의 넷마스크 연산자가 계속 사용됩니다. 수정된 소스 주소와 수정된 대상 주소를 제공하고 세트에 일치하는 요소가 있는 경우 결과는 true가 됩니다(그리고 규칙은 명령문을 실행합니다 accept
).
nft 'add ip myfilter forward ip saddr & 0.0.255.0 . ip daddr & 0.0.255.0 @same-y accept'
다시 말하지만, 작동하게 만드는 차이점은 여기서 패킷의 내용에 의존하는 두 표현식이 모두 있다는 것입니다.왼쪽따라서 비교가 허용됩니다.
0.0.y.0 : 0.0.y.0
이제 다음 셸 루프를 사용하여 패킷 경로 탐색 중에만 수행할 수 없는 논리적 비교 부분을 완료하기 위해 유형의 항목으로 컬렉션을 채웁니다 .
for i in $(seq 0 20); do printf 'add element ip myfilter same-y { 0.0.%d.0 . 0.0.%d.0 }\n' $i $i; done | nft -f -
그러면 다음에 21개의 요소가 추가됩니다 @same-y
.
0.0.0.0 . 0.0.0.0,
0.0.1.0 . 0.0.1.0,
[...]
0.0.20.0 . 0.0.20.0
네트워크가 유형의 하위 네트워크를 확장하고 수신하는 경우 10.x.21.0/24
하나의 요소만 추가하면 되며 이 작업은 런타임 시에도 수행될 수 있습니다.
필터를 일반적으로 유지하면서 필터에 몇 가지 예외가 필요한 경우 위 세트를 결정 그래프로 변환할 수 있습니다. 대부분의 판정 요소는 : accept
다음과 같은 예외 로 끝납니다 0.0.15.0 . 0.0.15.0 : jump exception-net-15
(이러한 사용자 체인도 동일한 규칙 세트에서 정의되어야 함).
이 판정 다이어그램을 사용하면 다음과 같습니다.
table ip myfilter {
map accept-same-y {
type ipv4_addr . ipv4_addr : verdict
}
}
이런 종류의 요소로 채워져야 합니다:
0.0.0.0 . 0.0.0.0 : accept,
0.0.1.0 . 0.0.1.0 : accept,
[...]
0.0.20.0 . 0.0.20.0 : accept
그리고 이 규칙에 따라 사용하면, vmap
발견되면 지도에서 판단이 실행됩니다.
ip saddr & 0.0.255.0 . ip daddr & 0.0.255.0 vmap @accept-same-y