conntrack 모듈의 몇 가지 기본 개념을 이해하지 못합니다.
modinfo
먼저 내 시스템(Ubuntu 18.04)에서 활성화되어 있는지, nf_conntrack에 대한 정보가 표시되는지, /proc/modules
nf_conntrack에 표시된 파일이 "live"인지 확인했습니다 .
둘째, 다음과 같은 테스트 설정이 있습니다.
머신 A(192.168.1.2) <------> 라우터 머신(192.168.1.1 & 192.168.2.1) <----> 머신 B(192.168.2.2)
라우터 시스템에는 다음과 같은 iptables 규칙이 있습니다.
iptables -t filter -A FORWARD -m set --match-set BlackListPort dst -j DROP
BlackListPort는 ipset 테이블입니다.
이제 머신 A(1.2)에서 머신 B(2.2)로 SSH 연결이 설정되었습니다. 작동하는지 확인한 후 BlackListPort 테이블에 포트 22(SSH 기본값)를 추가했습니다.
해당 ipset 테이블에서 포트 22를 제거할 때까지 SSH 연결이 정지/중단됩니다.
이제 문제는: 내 시스템에 conntrack이 있는데 SSH 차단이 성공한 이유는 무엇입니까? SSH 연결은 포트 22가 ipset에 추가되기 전에 설정되었으므로 conntrack은 모든 패킷을 건너뛰어 SSH가 작동하도록 해야 합니다.
답변1
SSH 연결은 포트 22가 ipset에 추가되기 전에 설정되었으므로 conntrack은 모든 패킷을 건너뛰어 SSH가 작동하도록 해야 합니다.
이것은 정확하지 않습니다.
모든 패킷은 추적된 연결에 속하는지 여부에 관계없이 필터링 규칙을 통해 처리됩니다.
관련 규칙 체인의 시작 부분( FORWARD
귀하의 예에서는) 근처에 이와 같은 것을 배치하는 것은 iptables 규칙에 대한 매우 일반적인 최적화입니다.
iptables -t filter -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
이전 배포판에서는 다음 버전을 볼 수 있습니다.
iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
conntrack
( 요즘에는 match보다 match가 더 인기가 있다는 걸 알고 있습니다 state
. 일부 커널 버전에서는 이에 대해 잔소리도 할 것 같습니다.)
이렇게 하면 연결 추적 정보가 있는 경우 기존 연결에 속한 패킷이 통과될 수 있습니다. 하지만 요점은,너통제할 수 있는정확히 어디에이 규칙을 만들었습니까, 아니면 사용했습니까? 따라서 방화벽 규칙에서 연결 상태에 대해 원하는 만큼 신경을 쓰도록 할 수 있습니다.