나는 게시했다ServerFault의 특수 방화벽 설정에 대한 질문하지만 열정적인 소프트웨어 개발자로서 저는 자체 소프트웨어를 출시하는 것도 고려하고 있습니다.
저는 고급 언어, 가급적이면 Java나 Node.JS를 사용하는 데에만 관심이 있습니다. Linux 또는 Illumos에는 모든 네트워크 패킷을 가져와 내 애플리케이션에 공급하여 허용, 삭제 또는 거부해야 하는지 결정할 수 있는 시스템이 있습니까? (또는 다시 작성)
나는 ICMP, UDP, TCP 패킷에만 관심이 있습니다. 나는 트래픽을 스니핑하여 허용 여부를 결정할 수 있는 Java 애플리케이션을 작성할 것이라고 상상했습니다. 예를 들어, HTTP 트래픽의 Host
경우 헤더를 검사하여 브라우저가 어떤 웹 사이트에 액세스하려고 하는지 확인할 수 있습니다 .
이것이 잠재적인 처리량을 감소시킬 수 있다는 것을 알고 있지만 아마도 여러분이 권장하는 솔루션에는 해당 경고의 영향을 명확히 할 수 있는 문서가 있을 것입니다.
파일 시스템 대신 방화벽을 사용한다는 점을 제외하면 FUSE를 요구하는 것과 거의 같습니다.
그러한 프로그램이 있습니까? 아니면 항상 방화벽용 C/C++ 코드를 작성합니까?
답변1
Linux 기반 플랫폼에는 Java 프로그램에서 열고 패킷 허용 여부를 결정할 수 있는 netlink 소켓이 있습니다. 소켓은 규칙을 통해 네트워크 스택에 포함될 수 있습니다 iptables
. 물론 여기에서 사용자 모드 필터로 전달되는 패킷 유형을 제한할 수도 있습니다.
이에 대한 매뉴얼 페이지의 내용은 다음과 같습니다.
우로그
이 대상은 일치하는 패킷의 사용자 공간 로깅을 제공합니다. 규칙에 대해 이 대상이 설정되면 Linux 커널은 netlink 소켓을 통해 이 패킷을 멀티캐스트합니다. 그러면 하나 이상의 사용자 공간 프로세스가 다양한 멀티캐스트 그룹에 가입하고 패킷을 수신할 수 있습니다.
netfilter 프로젝트의 복잡성과 복잡성을 고려하면 해결하려는 문제에 대한 솔루션을 추구하는 것이 가치가 있을 수 있습니다. (아니면 다른 SE 질문에서 다루는 내용일 수도 있습니다. 아직 살펴보지 않았습니다.)
답변2
OpenBSD에서divert(4)
divert(4)
언어가 시스템 측면에서 동작하는 경우 언어가 시스템 호출과 상호 작용할 수 있다고 가정하면(직접 또는 shim의 추가 복잡성을 통해) 메커니즘을 사용하여 커널과 모든 언어로 작성된 사용자 공간 프로세스 간에 패킷을 전달할 수 있습니다. 그렇지 않은 경우 IPC 프록시 계층이 필요합니다).
답변3
Java로 방화벽을 구축하는 것은 매우 합리적이지만 네트워크 시스템에 필요한 속도로 실행되는 깔끔한 프로젝트는 아닐 것입니다.
저는 SecureBSD에서 실행되는 네트워크 보안 장비를 만드는 회사에서 근무했습니다. 트래픽이 실시간으로 필터링되므로 ipchain에 대한 모든 변경 사항은 신중한 검토가 필요합니다. 아주 작은 성능 손실이라도 치명적일 수 있습니다.