최근에 Dnsmasq를 DNS로 사용하여 OpenVPN을 설정했는데 정보를 찾을 수 없는 작업을 하고 싶습니다.
현재 내 서버에 설정한 내용을 기반으로 한 현재 이해는 다음과 같습니다.
A. 클라이언트는 예를 들어 전화를 통해 OpenVPN에 연결합니다.
B. 클라이언트는 트래픽을 보냅니다. 즉 YouTube와 같은 웹사이트를 엽니다.
C. OpenVPN 서버가 요청을 받아들입니다.
D. 요청을 대상 서버, 즉 YouTube로 전달합니다.
E. YouTube가 응답합니다.
F. OpenVPN은 A의 클라이언트에 응답을 전달합니다.
물론 위의 내용은 지나치게 단순화되었습니다.
내가하고 싶은 일은 무엇입니까?
OpenVPN이 요청을 받은 후(또는 대상 서버로부터 응답을 받은 후, 즉 D->C) 단계 C와 D 사이에서 실제 데이터를 처리하고 싶습니다.
예를 들어 일반적인 사용 사례입니다.
D와 C 사이에서 페이로드를 예를 들어 Python 스크립트에 전달하고 페이로드가 래핑되어 클라이언트로 전송되기 전에 웹 페이지 html의 모든 "사랑해" 텍스트를 "나는 당신을 싫어합니다"로 변경하고 싶습니다.
질문
기본적으로 요청의 페이로드를 듣고 변경할 수 있는 OpenVPN의 "라이프 사이클 후크" 형태가 있습니까?
OpenVPN의 인바운드 또는 아웃바운드 연결은 '포트 녹스'로 보호된다는 점을 이해합니다. 나는 응답 페이로드가 서버에 그대로 있는 지점에 관심이 있습니다.
사용 가능한 옵션은 무엇입니까? 그러한 결과를 얻으려면 다른 패키지/소프트웨어를 사용해야 합니까?
답변1
귀하의 아이디어는 여러 가지 이유로 실현 불가능합니다.
1)
내가 기억하는 한 OpenVPN 자체에는 전달하기 전에 VPN 연결의 데이터를 사용자 정의 프로세스로 파이프하는 기능이 없습니다.
빠른 참조: OSI 스택에서 TCP/IP가 사용되는 위치를 확인하세요.
OpenVPN은 OSI 스택의 계층 3(네트워크 계층)에 있는 반면 TCP 패키지는 계층 4(전송 계층)에 속합니다.
귀하의 질문은 OpenVPN이 달성하고자 하는 범위를 벗어나는 이유입니다.
조작할 수 있는 유일한 것은 클라이언트가 서버에 연결하거나 연결을 끊을 때 발생하는 일입니다.
이러한 상황은 다음 설정을 통해 서버 구성 파일에서 정의할 수 있습니다.
# client connected to VPN server
client-connect "/script/client_connect.sh"
# client disconnected from VPN server
client-disconnect "/script/client_disconnect.sh"
사용자 정의 스크립트에 사용할 수 있는 모든 환경 변수는 여기에서 사용할 수 있습니다.
그러나 본질적으로 모니터링할 수 있는 유일한 정보는 서버에 연결하는 데 사용된 클라이언트 인증서와 클라이언트에 할당된 IP 주소입니다. 그런 다음 연결한 사람과 다시 연결을 끊을 때 수행할 작업에 따라 서버에서 일부 사용자 지정 논리를 만듭니다.
일반적인 설정 중 하나는 동적 DNS 서버 측을 구현하거나 VPN 연결에 따라 장애 조치 라우팅과 같은 일부 사용자 지정 라우팅을 수행하는 것입니다.
2)
이 IPv4 패킷 다이어그램을 참조하면위키피디아:
본질적으로 당신이 원하는 것은 소스 또는 대상 주소에 따라 데이터 필드를 조작하는 것입니다.
이는 중간자 공격(man-in-the-middle) 공격이라고도 알려져 있습니다.
아시다시피 모든 콘텐츠는 암호화되어 있으므로 OpenVPN 인터페이스를 통해 이를 수행하는 것이 어렵습니다. 인터넷으로 향하는 IPv4 패킷은 OpenVPN 서버로 향하는 또 다른 IPv4 패킷에 캡슐화됩니다.
캡슐화된 IPv4 패킷은 위 다이어그램의 데이터 필드에 저장됩니다.
VPN 서버에서 인터넷으로 전달되는 캡슐화 해제된 패킷입니다.
그러나 다음과 같은 주의 사항이 있습니다.
VPN 클라이언트가 그렇다고 가정합니다~ 아니다공개 IP 주소를 가지고 있습니다. 이는 NAT 변환이 포함되고 소스 주소가 인터넷에서 호스트에 연결되기 전에 VPN 서버의 주소로 다시 작성됨을 의미합니다.
마찬가지로 호스트가 응답으로 응답하면 대상 IPv4 주소가 VPN 서버와 동일합니다.
이는 데이터 필드를 조작하려면 NAT network address translation table
(NAT라고도 함)에서 사용되는 포트를 추적해야 함을 의미합니다.
둘 이상의 VPN 클라이언트가 VPN 및 NAT를 통해 인터넷에 연결할 수 있고 모든 TCP 세션(메일, 웹, SSH 등)이 서로 다른 포트를 사용하므로 사용되는 포트는 일반적으로 동적입니다.
그러니 조작하고 싶다면해독된 TCP 패킷이는 암호 해독 후 NAT에서 변환되기 전에 발생해야 합니다.
이론적으로는 를 사용하여 패킷을 가로챌 수 있지만 iptables
VPN과 NAT가 동일한 시스템에 있는 경우 이는 쉽지 않습니다.
또 다른 접근 방식은 암호화된 OpenVPN 트래픽을 직접 공격하는 것입니다. OpenVPN 서버를 제어하면 서버와 클라이언트 모두에서 사용되는 인증서와 개인 키도 제어할 수 있기 때문입니다.
이는 고전적인 중간자 공격으로 가능합니다. 하지만 이것이 어떻게 수행되는지 모르겠습니다. :-)
... 하지만 이것이 나의 마지막 주장으로 이어집니다.
삼)
인터넷상의 대부분의 트래픽은 TLS 암호화입니다.
따라서 OpenVPN 트래픽을 해독한 후에도 데이터 필드의 내용을 조작하기 위해 극복해야 하는 또 다른 암호화 계층이 있습니다.
이 부분은 세션에 사용되는 암호화 키를 제어할 수 없기 때문에 암호화된 OpenVPN 트래픽을 공격하는 것보다 공격하기가 훨씬 어렵습니다.
TLS 트래픽을 해독하고 콘텐츠를 다시 암호화하여 최종 사용자에게 암호화된 트래픽이 실제로 YouTube 등에서 발생한 것처럼 보이더라도 https 트래픽을 암호화하는 데 사용하는 인증서는 다음과 같기 때문에 여전히 소용이 없습니다.신뢰할 수 없음최종 사용자 컴퓨터의 브라우저에 의해.
이것만으로도 중간자 공격이 쓸모없게 됩니다.
이제 이것은 귀하의 질문에 대한 완전한 답변에 가깝습니다.
TCP 세션을 공격하는 다른 각도가 있지만 이제 우리는 보안 전문가들로 가득 찬 포럼에 속하는 고급 분야로 나아가고 있습니다.
그 부분은 내 자격을 훨씬 넘어선다. :-)