
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
.