Linux에서 더 이상 사용되지 않는 tcp 옵션이 포함된 모든 패킷을 제거하고 싶습니다. 사용되지 않는 옵션이란 TCP 옵션 유형 번호가 8보다 큰 모든 옵션을 의미합니다. 이 작업을 수행하려면 어떻게 해야 합니까 nftables
?
예를 들어, tcp 패킷에 nftables에 지정된 숫자 유형의 옵션이 있는지 확인하는 방법이 있다면 작동할 것입니다. nftables가 이 기능을 지원하지 않는 경우 tc
다른 표준 Linux 유틸리티를 사용하여 이 기능을 사용할 수 있습니까?
답변1
그 안에 키워드가 많아요nftables그것은 단지 상수를 나타냅니다. 이는 tcp 옵션의 경우입니다(고쳐 쓰다: 하지만 그때부터야nftables0.9.8).
다음은 tcp 옵션에서 발췌한 내용입니다.
확장 헤더 표현식은 IPv6 확장 헤더 및 TCP 옵션과 같은 가변 크기 프로토콜 헤더의 데이터를 참조합니다.
[...]
TCP 옵션
{생산 중단 | 최대 세그먼트 | 자루 0 | 자루 3 |
TCP 옵션
핵심 단어 설명하다 TCP 옵션 필드 단종 옵션 목록 끝 유형 누프 1바이트 TCP 동작 없음 옵션 유형 최대 세그먼트 TCP 최대 세그먼트 크기 유형, 길이, 크기 창문 TCP 창 크기 조정 유형, 길이, 수량 [...] 타임스탬프 TCP 타임스탬프 유형, 길이, tsval, tsecr [...]
부울 사양
다음 표현식은 부울 비교를 지원합니다.
표현하다 행동 거짓말하다 경로가 존재하는지 확인하세요. 확장하다 IPv6 확장 헤더가 있는지 확인하세요. TCP 옵션 TCP 옵션 헤더가 있는지 확인하십시오. [...]
# match if TCP timestamp option is present filter input tcp option timestamp exists
이는 eol
0을 나타내고, nop
1을 나타내고...는 timestamp
8을 나타내는 식입니다.
고쳐 쓰다:버전 0.9.8부터키워드 대신 임의의 숫자 값을 지정할 수 있습니다.
원시 TCP 옵션 일치 지원 추가
...TCP 옵션@42,16,4
@kind, 오프셋, 길이를 지정할 수 있는 곳
TCP 옵션이 있는지 확인할 수 있습니다.
... TCP 옵션 42가 존재합니다.
그래서 이런 규칙이 있습니다.
nft add table t
nft add chain t c '{ type filter hook input priority 0; policy accept; }'
nft add rule t c tcp option 8 exists drop
nft add rule t c tcp option 9 exists drop
nft add rule t c tcp option 10 exists drop
[...]
nft add rule t c tcp option 254 exists drop
값이 8(나중에 표시되는 8 포함 timestamp
) 이상(옵션 값은 8비트 필드에 있음)으로 모든 규칙을 필터링할 수 있습니다.
알려진 값(여기서만 timestamp
)은 키워드와 함께 표시되며, 그렇지 않으면 숫자로 유지됩니다.
# nft -a --debug=netlink list ruleset
ip t c 2
[ exthdr load tcpopt 1b @ 8 + 0 present => reg 1 ]
[ cmp eq reg 1 0x00000001 ]
[ immediate reg 0 drop ]
ip t c 3 2
[ exthdr load tcpopt 1b @ 9 + 0 present => reg 1 ]
[ cmp eq reg 1 0x00000001 ]
[ immediate reg 0 drop ]
ip t c 4 3
[ exthdr load tcpopt 1b @ 10 + 0 present => reg 1 ]
[ cmp eq reg 1 0x00000001 ]
[ immediate reg 0 drop ]
ip t c 5 4
[ exthdr load tcpopt 1b @ 254 + 0 present => reg 1 ]
[ cmp eq reg 1 0x00000001 ]
[ immediate reg 0 drop ]
table ip t { # handle 21
chain c { # handle 1
type filter hook input priority filter; policy accept;
tcp option timestamp exists drop # handle 2
tcp option 9 exists drop # handle 3
tcp option 10 exists drop # handle 4
tcp option 254 exists drop # handle 5
}
}
나는 그것을 세트나 맵으로 분해하거나 옵션 값과 비교하는 방법을 찾지 못했습니다. 이는 전체가 tcp option foo
구문에 사용되어야 하고 tcp option
내가 아는 한 구문에 사용되어야 하기 때문에 이를 단순화합니다. 쓸모없는 결과로 이어집니다. 기능은 다음과 같습니다.
옵션 타임스탬프가 다음을 의미하는지 확인하세요.카테고리 8그 종류값은...8입니다. (존재하는 경우 항상 true이므로 동일합니다
tcp option timestamp exists
.):nft add rule t c tcp option timestamp kind == 8
또는 옵션 타임스탬프가 다음을 의미하는지 확인하세요.카테고리 8종류 값이 8보다 큽니다(항상 거짓).
nft add rule t c 'tcp option timestamp kind > 8'
고려하다TCP 옵션옵션 목록의 일부이므로 하나를 선택하려면 기존 옵션을 모두 반복해야 하기 때문에 구현이 쉽지 않다는 것을 이해할 수 있습니다. 두 개가 일치하면 어느 것이 선택됩니까?
참고: 8 이상의 여러 옵션은 유지할 가치가 있습니다. 예를 들어TCP 옵션 유형 30에 사용됩니다다중지점 TCP최근 주류 Linux에 추가된 tcp 옵션 유형 6(에코) 및 7(에코 응답)은 더 이상 사용되지 않습니다.