연결 설정을 가로채고 싶습니다. 예를 들어 특정 프로세스(모든 프로세스)가 언제 연결을 설정하는지 알고 싶습니다. 이것을 달성할 수 있는 방법이 있나요?
내가 생각할 수 있는 유일한 것은 connect()
시스템 호출을 가로채는 것입니다. 하지만 다른 방법이 있을까요? 커널에서 네트워크 컨텍스트를 생성할 때 가능할까요?
목표는 특정 요구 사항에 따라 프로세스를 필터링하고 실시간으로 연결 설정을 활성화/비활성화하는 것입니다.
미리 감사드립니다.
추신: 저는 절대적으로 합법적인 목적으로 이 일을 하고 있습니다.
PPS Google에서 검색했지만 이미 설정된 연결을 가로채는 방법만 찾았습니다(정확히 내가 원하는 것은 아님). 내가 요구하는 것은 코드가 아닌 아이디어, 검색 방향이다.
답변1
정보를 추출하려면 AUDIT 일치(또는 많은 정보가 필요하지 않은 경우 LOG 일치)를 사용하여 iptables를 통해 수행할 수 있습니다.
실제로 복잡한 규칙에 따라 라이브 연결을 허용하거나 허용하지 않는 경우 Linux에서 안정적으로 수행할 수 있을지 확신할 수 없습니다. 옵션은 다음과 같습니다:
- Seccomp-BPF이지만 이것이 가능한지 확실하지 않습니다(그리고 필터는 주어진 프로세스에서 인스턴스화되면 정적으로 됩니다).
- 다양한 소켓 호출을 재정의하려면 LD_PRELOAD 또는 기타 메서드를 사용하세요. 이는 쉽게 우회할 수 있으므로 신뢰할 수 없습니다(직접 시스템 호출을 만드는 것은 간단합니다. 또한
dlopen()
임의의 libc를 사용하여 이 방법으로 호출할 수도 있습니다). - 통제
net_cls
그룹. 이를 위해서는 방화벽 설정이 필요하고 활성 연결에 영향을 미칠 수 있으며 원하는 방식으로 정확하게 작동하지 않을 수 있습니다(시작 시 프로세스를 적절한 제어 그룹으로 이동하려면 데몬이 필요함). - 네트워크로 들어오는 일부 데이터를 허용할 수 있는 경우 iptables NFLOG 대상을 사용하고 흥미로운 연결을 모니터링할 수 있습니다(실시간 평가를 원할 경우 모든 새 연결을 기록하고 사용자 공간의 콘텐츠를 구문 분석해야 함). 그런 다음 수동적으로 연결을 원하지 않는 것을 닫으십시오.
- 자체 네트워크 네임스페이스에서 각 애플리케이션을 실행하고 호스트 시스템을 통해 아웃바운드 트래픽을 강제한 다음 소스 기반 정책 라우팅을 사용하여 실제 네트워크에 도달하는 트래픽을 제어할 수 있습니다.
즉, 이것이 왜 필요한지 재평가하고 싶을 수도 있습니다. 신경망이나 다른 휴리스틱(둘 다 여러 가지 이유로 의심스러운 선택)을 통해 결정을 제공하지 않는 한 거의 항상 방화벽에 직접 인코딩하는 것이 더 좋습니다(iptables가 그렇게 할 수 있습니다). 균일하게 분산된 무작위 속도로 특정 UID에서 시작되는 특정 포트에 대해 특정 IP 프로토콜을 사용하는 연결만 일치시키고 일치하지 않는 패킷을 다른 대상으로 전송) 또는 예약 도구 또는 기타 후크를 사용하여 방화벽 규칙을 동적으로 업데이트(예: , 시스템을 사용하지 않을 때 방화벽 규칙을 변경하거나 사용자가 로그인할 때 특정 UID에서 새 연결만 허용).
답변2
목표는 특정 요구 사항에 따라 프로세스를 필터링하고 실시간으로 연결 설정을 활성화/비활성화하는 것입니다.
netstat -pant |grep -i ESTABLISHED
위 명령은 설정된 연결, 프로세스 ID/응용 프로그램 이름, 사용자를 제공합니다.
이제 필요한 것이 준비되었으므로 첫 번째 명령에서 받은 정보를 계속 사용하기 위해 bash 스크립트를 작성할 수 있습니다.