Linux netfilter/iptables를 사용하여 특정 조건에서 양쪽 끝에서 즉시 TCP 연결을 재설정하는 방법은 무엇입니까?

Linux netfilter/iptables를 사용하여 특정 조건에서 양쪽 끝에서 즉시 TCP 연결을 재설정하는 방법은 무엇입니까?

친애하는 Serverfault 커뮤니티 여러분,

다음과 같은 문제가 있습니다. 패킷 데이터에서 특정 문자열이 발견되면 즉시 양쪽 네트워크 모두에서 TCP 연결을 재설정(연결 끊기)해야 합니다. 저는 양쪽의 애플리케이션을 제어할 수 없으며 Linux iptables(또는 유사한 도구)만 사용하여 연결을 중단할 수 있습니다.

내 첫 번째 아이디어는 내가 찾고 있던 것을 달성하기 위해 다음 iptables 규칙을 사용하는 것이었습니다.

/usr/sbin/iptables -A INPUT -p tcp --dport 1234 -m string --algo bm --string 'BAD STRING' -j REJECT --reject-with tcp-reset

이는 TCP RST 패킷을 클라이언트에 전송하여 원격 측에서 완벽하게 작동하므로 즉시 연결이 끊어집니다. 안타깝게도 강제 연결 해제 시 로컬 측에 알림이 전송되지 않으며 서버 프로세스(연결)가 영원히 중단됩니다.

특정 조건(이 경우 IP 패킷의 문자열 일치)에서 이미 설정된 연결을 양쪽에 즉시 연결 해제해야 하는 요구 사항이 그리 특이한 것은 아니라고 생각했습니다. 그래서 Google 검색을 했지만 놀랍게도 합리적인 시간 내에 사용할 수 있는 항목을 찾을 수 없었습니다.

iptables를 사용하여 양쪽 네트워크에서 TCP 연결을 끊는 방법이 있습니까? 그렇지 않다면 어떤 다른 도구를 사용할 수 있습니까? (클라이언트/서버 응용 프로그램을 제어할 수 없다는 점을 명심하십시오.)

귀하의 귀중한 답변에 미리 감사드립니다!

친애하는,

옌스

답변1

당신이 사용할 수있는xt_RESET, 예:-j RESET

답변2

시간 초과가 발생하도록 애플리케이션을 구성할 수 있습니다.

또 다른 해결책은 TCP KeepAlive를 구성하고 10분마다 더 자주 확인하는 것입니다.

일부 애플리케이션은 애플리케이션 수준에서 KeepAlive를 구현합니다. 예를 들어 SSH, 아파치.

연결 유지가 전송되고 원격 끝에서 연결이 닫히면 원격 끝에서 RST를 받게 됩니다.

상태 저장 방화벽은 일정 기간 동안 활동이 없으면 연결을 잊어버립니다. 이는 한동안(30분 또는 1시간) 트래픽이 없을 때 패킷이 삭제되고 연결이 절반만 열려 있을 수 있음을 의미합니다.

구현하려는 특정 솔루션에 대해 묻는 것보다 해결하려는 특정 문제에 대해 물어보는 것이 더 낫다고 생각합니다.

답변3

안타깝게도 강제 연결 해제 시 로컬 측에 알림이 전송되지 않습니다.

tcp-reset은 연결이 닫히고 있다는 사실을 클라이언트에게 알려야 함을 의미합니다. 재설정이 전송될 때 클라이언트가 응답하지 않는 경우 이는 IPTable을 실행하는 호스트에서 다시 전송되는 재설정을 제대로 처리하지 못하고 있음을 의미합니다. 그 문제를 해결할 수단이 없다면, 나는 당신이 이것을 달성할 수 있는 어떤 방법도 생각할 수 없습니다.

관련 정보