타사 애플리케이션이 소유한 포트를 릴리스하시겠습니까?

타사 애플리케이션이 소유한 포트를 릴리스하시겠습니까?

누군가가 수신 대기 중인 타사 애플리케이션이 소유한 포트를 해제하는 방법을 물었습니다. 응용 프로그램이 소켓을 사용하고 특정 포트를 수신하고 있으며 이제 루트가 응용 프로그램을 종료하지 않고 해당 포트를 회수하려고 한다고 가정해 보겠습니다. 나는 대답을 할 수 없었다.

터미널에서 포트 핸들을 닫거나 이를 수행하기 위해 특정 API(예: 루트가 C++를 작성하고 실행할 수 있음)를 사용할 수 있는 방법이 있습니까?

답변1

의도하지 않은 응용 프로그램에서 열린 파일(네트워크 포트 등)을 닫는 확실한 방법은 없습니다.

코 아래에 있는 파일을 닫는 방법이 있지만 응용 프로그램이 제대로 반응하지 않을 수 있습니다. 붕괴되어 목적을 달성할 가능성이 높습니다. 다음 명령을 사용하여 원격 프로세스에서 시스템 호출을 수행할 수 있습니다.ptrace시스템 호출. 관심 있는 파일 설명자를 사용 lsof하거나 찾으십시오. netstat그런 다음 좋아하는 디버거를 문제의 프로세스에 연결하고 시스템 호출을 실행 close(또는 )하도록 합니다.shutdown

#!/bin/sh
# Usage: shutdown-in-process PID FD
gdb -n -pid "$1" -batch -x /dev/stdin <<EOF
call close($2)
detach
quit
EOF

환경에 대한 인터페이스가 더 이상 내부 데이터 구조와 일치하지 않기 때문에 애플리케이션이 충돌할 가능성이 높으므로 다른 접근 방식을 고려하십시오. 특히 다른 애플리케이션이 UDP 또는 TCP 포트를 수신하도록 하려는 경우 네트워크 계층 수준( iptablesLinux에서는 pfctlBSD에서...)에서 트래픽을 다른 포트로 리디렉션할 수 있습니다.

관련 정보