2009-05-16 3 views
3

모든 인터페이스에서 로컬 응용 프로그램의 연결을 허용하는 작은 소켓 서버 프록시 응용 프로그램을 작성해야합니다 (소켓은 0.0.0.0에 바인딩되어야 함).모든 인터페이스에서 로컬 클라이언트의 소켓을 허용합니다. rejcct 원격 클라이언트

나는 이것을 달성하는 방법을 모르고있다. (필자는 127.0.0.1에 대한 바인딩을 막는 추가적인 요구 사항이있다.) (s.src_addr 경우

바인드 (0.0.0.0) ... 의의 = 수락() 이 ... 가 // 원격 연결 를 거부 :

이에서의 첫 번째 시도는이 다음을 수행 하지 닫기) local_interfaces에서() ... // 지역 conenction

이 구현은 원격 응용 프로그램에 부작용이 정상적으로 진행 - 사람들은/동의 가까운 조합을 참조하십시오. 이 시스템은 원격 응용 프로그램이 "아무것도 없다"고 인식하도록 행동해야합니다 : -> SYN < --RST/ACK

을 내가 SO_CONDITIONAL_ACCEPT의 윈속 API의 조합을 사용하는이 동작하고 WSAAccept 콜백 (구현하려면 LPCONDITIONPROC lpfnCondition)을 사용하여 원래 인터페이스를 기반으로 연결을 수락하거나 거부합니다 (즉, 로컬 주소 중 하나인지 여부).

이렇게하면 원하는 기능 동작이 발생합니다. 로컬 응용 프로그램이 작동합니다. 원격 응용 프로그램에 필요한 WSAECONNREFUSED 오류가 발생합니다.

SO_CONDITIONAL_ACCEPT에는 특정 부작용이 있지만 더 중요한 것은 LINUX 구현이 필요하며 나중에 다른 UNIX로 이식해야 할 수도 있다는 것입니다.

내 우선 순위는 LINUX 솔루션입니다. 그것이 소켓 API를 뛰어 넘을 경우 기꺼이 할 수 있습니다.

답변

1

하나의 간단한 해결책은 외부 방화벽을 사용하는 것입니다.

+0

저는 갑자기 배포 지침에 방화벽을 지정하지 않았습니다.엔터프라이즈 환경의 클라이언트 시스템에서 작동하려면이 작업이 필요하며 이러한 접근 방식을 요구할 수는 없습니다. –

0

아마도 적절한 패킷 필터를 설치해야하거나 응용 프로그램이 이러한 필터를 설치할 수 있습니다. iptables 명령에 대한 자세한 내용은 http://www.netfilter.org/을 참조하십시오 (필터 관리를위한 API를 제공하는 libnfnetlink도 있지만 일반적으로 일반 응용 프로그램 용도로 사용되지는 않습니다).

AF_UNIX 소켓을 사용 해본 적이 있습니까?

0

이렇게하는 표준 방법은 연결을 수락하는 것입니다. 그런 다음 원치 않는 주소에서 오는 경우 통신하지 않고 즉시 닫습니다.

이것이 정말로 당신이해야 할 일이라면, 그것은 BSD 소켓 방식의 일이 아닙니다.

0

Netfilters/iptables는 이미 언급 했으므로이 문제는 "프로그램"의 일부가 아니라 커널의 기능을 다루는 가장 쉬운 방법입니다.

그러나 많은 시스템 데몬도 사용하는 도구가 있습니다. 그 호스트를 알고 있습니다. &/etc 폴더에 hosts.deny 파일이 있습니다.이 파일은 tcpwrappers의 일부이며 사용자가 설명한 정확한 시나리오를 보관할 수 있습니다.

관련 문제