저는 루트 액세스 권한이 없는 일반 사용자로 공유 Linux 서버에서 작업하고 있습니다. 로컬 TCP 포트에서 수신 대기하는 프로그램을 시작하고 해당 포트에 연결할 수 있는 유일한 사용자가 될 수 있습니까? 프로그램이 수신하는 주소와 포트를 제어할 수 있습니다.
예를 들어, 프로그램은 웹 서버의 개발/테스트 버전일 수 있습니다.
또한 서버는 포트 22(ssh)를 통해 들어오는 TCP 연결만 허용하므로 랩톱을 사용하여 연결할 수 있도록 SSH를 통해 로컬 포트를 전달했습니다. ssh -L 8080:localhost:8000 evaben@dice01
따라서 이와 유사한 상황을 허용하는 솔루션이 좋을 것입니다.
답변1
루트만이 방화벽을 설정할 수 있습니다.
한 가지 가능성은 컨테이너(예: Docker)에서 프로그램을 실행하는 것입니다. 이를 위해서는 루트 권한이 필요하지만 루트 액세스 권한이 없더라도 Docker 컨테이너를 인스턴스화하는 것이 허용될 수 있습니다.
네트워크 보호를 설정하는 직접적 또는 간접적인 방법이 없는 경우 프로그램 작동 방식을 수정해야 합니다. 듣게 놔둬유닉스 소켓TCP 대신. 프로그램이 표준 라이브러리에 동적으로 연결되어 있다고 가정하면(거의 모든 프로그램이 그렇습니다) 프로그램 자체를 변경할 필요는 없고 실행 방법만 변경할 수 있습니다. 당신은 이것을 할 수 있습니다LD_PRELOAD
, TCP 소켓 열기 함수 주위에 래퍼를 로드하여 Unix 소켓을 엽니다.ttu
정확히 그렇게 합니다(문서에 따르면 나는 그것을 사용한 적이 없습니다).
답변2
로컬 TCP 포트에서 수신 대기하는 프로그램을 시작할 수 있나요?
예. 루트가 아닌 경우 소위 "높은 포트", 즉 포트 번호 > 1024에서만 수신 대기할 수 있습니다.
해당 포트에 연결할 수 있는 유일한 사용자인가요?
아니요. 루트 액세스 권한이 있는 경우 를 사용하여 일부 작업을 수행할 수 있지만 iptables
포트에서 연결을 수락할 때 사용자 기반 액세스 제어 개념은 없습니다.