오래된 TCP 옵션 차단

오래된 TCP 옵션 차단

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

이는 eol0을 나타내고, nop1을 나타내고...는 timestamp8을 나타내는 식입니다.

고쳐 쓰다:버전 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(에코 응답)은 더 이상 사용되지 않습니다.

관련 정보