프로그램이 로컬이 아닌 연결에 액세스하는 것을 방지하는 래퍼

프로그램이 로컬이 아닌 연결에 액세스하는 것을 방지하는 래퍼

server"*"에 바인딩하고 들어오는 연결을 수신하는 프로그램을 고려해보세요 . localhost에서만 연결하고 있으며 server외부 사용자가 연결하는 것을 원하지 않습니다. 그러나 server프로그램은 제대로 작성되지 않았으며 localhost에서만 바인딩할 수 있는 구성 옵션이나 플래그를 제공하지 않습니다. 또한 server이 문제를 해결하기 위해 소스 코드를 크랙하는 데 어려움을 겪고 있습니다 .

그래서 실행할 래퍼를 찾고 있지만 server"*" 대신 localhost에 바인딩하도록 만듭니다. (예를 들어, tsocks타사 프로그램에서 SOCKS 프록시를 강제로 사용하도록 하는 등 LD_PRELOAD 기반 트릭을 사용하여 작업을 수행할 수 있습니다 .)그런 것이 존재하나요?도움이 된다면 저는 컴퓨터를 루트로 삼고 있습니다.

또 다른 해결책은 iptables를 사용하는 것이라는 것을 알고 있지만 이러한 규칙은 재부팅 후에도 지속되지 않으므로 자동으로 깨질 수 있습니다. 게다가 이는 "전역적"이므로 서버의 다른 사용자가 수정하거나 난독화될 수 있습니다. 반면에 서버 프로그램을 실행할 때는 wrapper server다른 이유로 인해 설정이 중단되지 않을 것이라는 확신이 더 듭니다.

답변1

ip 네임스페이스를 사용하여 이를 수행하는 방법은 다음과 같습니다(루트 권한이 필요하며 다음은 루트로 실행해야 함).

서버의 네임스페이스를 만듭니다.

ip netns add myserverns

네임스페이스의 루프백에 IP 주소를 할당하고 활성화합니다(출처:이 게시물):

ip netns exec myserverns ifconfig lo 127.0.0.1 up

네임스페이스에서 실행 server(여기서 "serveruser"는 서버를 실행해야 하는 사용자임)

ip netns exec myserverns sudo -u serveruser server

우리는 서버가 포트에서 수신 대기한다고 가정합니다 4242. 이제 socat다음을 사용하여 루프백을 네임스페이스에 바인딩합니다(사용이 bind=127.0.0.1핵심입니다)(출처:이 답변):

socat tcp-listen:4242,bind=127.0.0.1,fork,reuseaddr exec:'ip netns exec myserverns socat STDIO tcp-connect\:127.0.0.1\:4242',nofork

이는 내가 의도한 바를 달성합니다. server"*"(또는 완전히 다른 포트)에 바인딩하려고 할 때에도 이 방식으로 실행하면 port 가 있는 로컬 시스템에서만 액세스할 수 있음을 확신합니다 4242.

관련 정보