OpenVPN 터널을 통과하는 패킷을 표시하고 서버 측에서 다르게 처리


0

클라이언트 쪽에서 각 IP 패킷에 일부 메타 데이터 (예 : ID 또는 이름)가 할당되고 다른 쪽에서 할당 된 메타 데이터에 따라 다르게 처리되도록 클라이언트-서버 OpenVPN 구성을 만들어야합니다. 와. 메타 데이터를 보내기 위해 두 가지 방법을 생각할 수 있습니다.

  • 작지만 ToS 필드를 사용합니다.
  • 페이로드에 추가하여 길이 / 체크섬 /을 변경하는 중 ...

각 패킷을 표시하는 더 좋은 방법이 있습니까? OpenVPN 자체가이 요구 사항에 대한 솔루션을 제공합니까?

서버 측 (즉, OpenVPN 서버 측)에서 기존 메커니즘을 활용하여 각 패킷의 종류의 MITM을 활용할 수있는 방법이 있습니까? 더 정확하게 말하자면, 각 메타 데이터 (각 IP 패킷과 함께 제공되는)를 읽고 일부 분류 통계 나 방화벽을 기록해야합니다.

OpenVPN이이를위한 깨끗한 솔루션을 제공합니까? 그렇지 않으면 OpenVPN 서버 측 코드를 만져서 직접 작성해야합니까?

+------+   + ----+   +--------+           +--------+   +-----+    +----------+
| apps |---| tun |---| socket | ========= | socket |---| tun | ---| Internet |
+------+   +-----+   +--------+           +--------+   +-----+    +----------+
                   ^                                 ^
                   |                                 |
here packets are marked by my custom OpenVPN client  |
                                                     |
                        here I'd need to firewall packets based on the "metadata"

OS 태그를 추가하십시오. 예를 들어 Linux에서는 패킷을 사용 iptables하거나 tc조작하여 통계를 작성합니다. VPN이나 ​​OpenVPN과는 아무런 관련이 없습니다. 또한 "메타 데이터"를 추가하는 더 쉬운 방법은 다른 IP 소스 주소를 사용하는 것입니다 (쉽게 수행 할 수 있음).
dirkt

@dirkt Linux 태그가 추가되었습니다. 당신 말이 맞지만 내 상황은 OpenVPN과 관련이 있습니다. OpenVPN 데몬과 tun인터페이스 사이에 앉아 패킷을 가로 챌 수있는 방법이 있습니까? 내말은. "메타 데이터"를 기준으로 일부 패킷을 필터링하고 어떤 패킷을 보내야하고 어떤 패킷을 보내지 않아야하는지 결정해야합니다 tun.
frogatto

그것이 바로 무엇 iptables을위한 것입니다. Google은 자습서를 제공하거나 정확하게하고 싶은 특정 정보 (어떤 소스 / 조건에서 추가 할 '메타 데이터', '메타 데이터'에 대한 결정)를 추가합니다.
dirkt

@dirkt 내가 알고 iptables사용해야 할 상황. 그러나 내 상황은 조금 다릅니다. iptables알려진 TCP / IP 또는 어떤 특성을 기반으로 결정할 수 있으며, IP 패킷의 어딘가에 내 사용자 지정 "메타 데이터"가 포함되어 있지 않습니다. 해당 메타 데이터는 본인이 해석해야하며 iptables처리 할 수 ​​없습니다. 따라서 OpenVPN 수신 UDP 포트와 관련 포트 사이에 방화벽 통합을 배치해야합니다 tun. 문제를 해결하기 위해 해당 "메타 데이터"를 OpenVPN 클라이언트가 제공하고 IP 패킷에 포함시키는 PID로 생각할 수 있습니다.
frogatto

1
"다르게 처리하다"는 무슨 뜻 입니까? 다른 라우팅 결정, 필터링, 다른 것?
sebasth

답변:


1

사용자 정의 OpenVPN 클라이언트가있는 경우 코드를 작성하여 원하는 방식으로 표시를 처리해야합니다. 패킷을 생성 한 프로세스의 PID는 OpenVPN 클라이언트에서 사용할 수 없으며 실제로 패킷의 속성으로 사용하지 못할 수도 있습니다. 이러한 정보를 얻으려면 클라이언트의 프로세스를 네트워크 네임 스페이스 또는 이와 유사한 방식으로 클라이언트에 배치해야합니다.

다른 종류의 "메타 데이터"를 원하는 경우 원하는 것을 지정하십시오.

서버 측에서는 iptablesOpenVPN 서버를 수정하지 않고도 원하는 모든 것을 할 수 있습니다. ToS와 --tos일치하거나 TTL과 --ttl-*일치하거나 4 바이트와 일치 --u32하거나 --bytecode확장 헤더 또는 기타를 추가하기로 결정한 전체 BPF 필터 프로그램을 실행할 수 있습니다 . 일치하는 패킷의 경우 원하는 송신 인터페이스로 패킷을 넣을 수 있으며 내부적으로 표시하고 라우팅하거나 원하는 다른 것을 할 수 있습니다. 자세한 내용 man iptables-extensions을 참조하십시오.

따라서 쉬운 부분은 어려운 부분은 PID 외에 어떤 종류의 메타 데이터를 먼저 찾은 다음 OpenVPN 클라이언트에 실제로 방법이없는 경우이를 패킷에 추가 할 수있는 방법을 찾는 것입니다 이 메타 데이터를 얻습니다.

편집하다

유연성을 극대화하기 위해 고유 한 IP 옵션을 정의 하고 패킷 헤더 다음의 모든 IPv4 패킷에 추가 할 수 있습니다. 이것은 눈에 띄게 오버 헤드를 추가하고 더 많은 조각화를 일으킬 수 있습니다 (OpenVPN이 VPN 터널 내부의 조각화를 처리하는 방법을 모르겠습니다).

원칙적으로 패킷을 NFQUEUE대상 과 함께 사용자 공간으로 다시 전달할 수도 있습니다 . 각 패킷에 대해 그렇게하면 빙하 적으로 느려질 것이므로 강력히 권장합니다.

각 패킷에 대해 "자신의 스크립트를 실행"(쉘 스크립트가 아니기를 바랍니다)을 원한다면 OpenVPN 서버도 수정하는 것이 가장 좋습니다.

나는 아직도 당신이 이것에 대한 유스 케이스를 모른다. 그러나 계획의 지금까지의 설명에서 모든 것이 크롤링으로 느려질 것이기 때문에 이것이 작동하지 않을 것이라고 확신한다. 수행하려는 작업을 재고하고 유스 케이스 (무엇을 달성 하시겠습니까?) iptables를 지정하고 분리를 원할 경우 여러 OpenVPN 클라이언트 및 서버를 사용하여 커널 공간에서 솔루션을 파악하십시오 .

일반적 으로 사용자 / 프로세스 클래스가 있으며,이 중 일부는 무언가를 수행하고 다른 것을 다르게 처리하도록합니다. 사용자 / 프로세스를 클래스에 지정하고 커널 공간에서 클래스를 처리하십시오. 이 정보를 모든 패킷에 추가하여 클래스 할당을 처리하려고하지 마십시오.

행운을 빌어 요, 당신은 그것을 필요로 할 것입니다.

편집하다

나는 일반적으로 모든 iptables규칙 의 수집을 "스크립트 언어"(체인의 규칙은 단계별로 처리하고 다른 체인으로 이동할 수 있음)와 대부분의 목적을 위해 "데이터베이스"로 생각한다고 덧붙여 야한다 . 물론 "데이터베이스"는 너무 크지 않아야합니다. "데이터베이스"를 변경하려면 해당 목적으로 만들어진 체인에서 규칙을 추가하거나 삭제하십시오.

패킷을 처리 할 때는 속도가 중요합니다 (커널은 초당 많은 패킷을 가져 옵니다). 사용자 공간과 커널 공간 사이의 전환은 속도면에서 비쌉니다. 자체 버퍼가있는 OpenVPN tun / tap 인터페이스에서와 같이 한 번만해도 괜찮지 만 한 번 이상 필요하지는 않습니다.


않는 iptables날 각 IP 패킷에 대한 결정을 내릴 내 자신의 스크립트를 실행할 수 있도록? 실제로 스크립트에서 나는 패킷에서 필요한 것을 읽고 데이터베이스를 쿼리 iptables하고 현재 전달되는 IP 패킷에 대한 결정을 알릴 수 있어야합니다 .
frogatto

1

SELinux Labeled Networking을 사용하면 트래픽을 생성하는 프로세스까지 트래픽을 표시하는 정책을 작성할 수 있습니다. 원격 호스트의 정책은 레이블을 기반으로 의사 결정 / 필터링에 액세스합니다. 그러나 레이블이있는 네트워킹은 레이블이있는 IPSec 및 CIPSO에서만 지원되며 OpenVPN에서는 직접 지원되지 않습니다.

트래픽을 전달하는 경우 다른 방법으로 액세스 제어 결정을 내리는 대신 자체 논리를 사용하여 OpenVPN을 확장하는 것이 좋습니다. 들어오는 트래픽이 모두 앱으로 전송되는 경우 대신 모든 액세스 제어 결정을 고려해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.