VPN없이 TLS를 통해 모든 웹 트래픽 리디렉션


10

가정 :

섬기는 사람:

  • 정적 IPv4 주소로 공개 인터넷에서 라우팅 가능한 데비안 스퀴즈 서버가 있습니다.
  • 서버에서 소프트웨어를 수정할 수있는 무제한 액세스 권한이 있습니다.
  • 서버는 임의의 포트를 수신하고 방화벽 규칙을 재구성 할 수 있습니다. 기본적으로 서버가 수행 할 수있는 작업에는 제한이 없습니다.

고객:

  • 로컬 시스템 (관리자 권한이없는 잠긴 Windows 데스크톱) 에서 관리자 액세스가 필요하지 않은 Firefox, Java 프로그램, .NET 프로그램 및 일부 기본 실행 파일을 실행할 수 있습니다.
  • Firefox에 애드온을 설치할 수 있습니다.
  • 루프백 ( localhost) 인터페이스 의 모든 포트에서들을 수 있습니다 . 따라서 위에서 언급 한 프로그램 프록시를 거치지 않고 로컬 포트에 바인딩하여 임의의 네트워크 I / O를 수행 할 수 있습니다 .
  • 모든 공용 인터넷 액세스는 많은 사이트를 차단하고 신중하게 상태를 점검하는 제한적인 HTTP 프록시를 통해 라우팅됩니다. 포트 80에서는 HTTP (TLS / SSL 없음)를 독점적으로 허용합니다. 포트 443에서는 CONNECT도메인 이름 / IP 주소로 차단되지 않은 원격 호스트에 대한 SSL / TLS 기반 을 허용 합니다.
  • 제한적 HTTP 프록시 프록시를 통해 허용되는 TLS 연결에 대한 심층 패킷 검사를 수행 하지 않으며 해당 연결에 대한 중간 공격을 수행 하지 않습니다 .
  • 위에서 언급 한 서버 는 프록시에 의해 차단 되지 않습니다 .

골:

Firefox에서 생성 한 모든 HTTP 및 HTTPS 요청을 SSL / TLS를 통해 위의 서버를 통해 라우팅하고 싶습니다 .

"목표"에 대한 기타 참고 사항 :

  • 엔드 포인트 사이트 (예 http://superuser.com:)가 서버에 SSL / TLS를 사용하지 않더라도 클라이언트에서 서버로 SSL / TLS를 사용 하고 서버 에서 암호화 여부에 관계없이 HTTP 요청을 수행하려고합니다. -내가 원하는 목적지로.
  • 나는 상관 없어 내 서버가 "맑은의"SSL 트래픽에보고됩니다. 즉, 예를 들어 원격 서버에 액세스하는 경우 로컬 클라이언트에서 원격 서버로의 전체 종단 간 SSL 암호화가 필요하지 않습니다 https://google.com. 즉, 서버가 데이터를 기밀로 유지한다고 신뢰 합니다.
  • 관리자 권한이 필요없고 32 비트 Windows 7에서 실행할 수있는 소프트웨어 또는 Firefox 애드온을 설치하려고합니다.
  • 오픈 소스 소프트웨어는 독점 소프트웨어보다 선호되며 프리웨어는 라이센스 비용이 필요한 소프트웨어보다 선호됩니다.
  • 기존 소프트웨어가 새로운 소프트웨어를 코딩하는 것보다 선호되지만, 이것이 유일한 방법이라면 코드를 작성하려고합니다.

나는 느슨하게 설명 된 "솔루션"을 찾고 있습니다.

  • 클라이언트에 어떤 소프트웨어가 필요합니까? 알고있는 특정 소프트웨어 패키지가 있으면 이름을 지정하십시오. 그렇지 않으면 클라이언트 소프트웨어가해야 할 일을 설명하십시오 .
  • 서버에 어떤 소프트웨어가 필요합니까? 알고있는 특정 소프트웨어 패키지가 있으면 이름을 지정하십시오. 그렇지 않으면 서버 소프트웨어가해야 할 일을 설명하십시오 .
  • 위에서 특정 소프트웨어 패키지의 이름을 지정한 경우 목표를 달성하기 위해 어떤 구성 매개 변수를 설정해야하는지 설명하십시오.
  • 어떤 이유로 당신이 믿는 경우에 가능하지 , 설명 하는 이유 .

내가 시도한 것들이 작동하지 않습니다

  • squid서버에 설치 하면서 서버에 표준 HTTP 프록시를 설정하려고했습니다. 일반 HTTP를 통해 Firefox의 웹 사이트를 요청할 때 Firefox도 일반 HTTP를 통해 서버에 액세스하려고 시도하기 때문에 문제가 해결되지 않았습니다 ! 로컬 네트워크의 프록시는 물론 클라이언트와 서버 간의 정기적 인 HTTP 트래픽을 관찰 및 / 또는 차단할 수 있기 때문에 이는 허용되지 않습니다.
  • 로컬 컴퓨터에 tun레이어 3 라우팅을 수행 할 수 있는 네트워크 어댑터 를 설치할 수있는 권한이 없거나 레이어 2 라우팅을 수행 할 수 없기 때문에 VPN이 작동 하지 않습니다. (예 :) tap. 한마디로 : OpenVPN을 설치하려면 관리자 권한이 필요하며, 해당 관리자 권한이 일시적으로 있어도 회사가 설치되어 있다는 사실을 기쁘게 생각할 것입니다. Java 또는 .NET 프로그램은 특히 프로그램 추가 / 제거에 설치되어 있지 않고 OpenVPN과 같은 커널 드라이버 구성 요소가없는 경우 눈에 띄지 않습니다.

당신은 양말을 시도합니까? 서버의 포트 443에서 정의 할 수 있습니다.
Ashian

이 기사에서 설명하는 솔루션을 사용할 수 있습니까 : 가난한 사람의 HTTP VPN ? HTTPTunnel에 대한 링크 가 올바르지 않습니다.
harrymc

1
delegate.org 가 도움이 될 수 있습니다.
Arjan

@Ashian 아니오, SOCKS는 TLS에 싸여 있지 않으면 작동하지 않습니다. SOCKS는 HTTP 기반 프로토콜이 아니므로 내부 프록시에 도달하면 차단됩니다. 내가 만약 했다 TLS를 통해 실행할 수, 나는 아마 다른 프로토콜을 사용합니다. 첫 번째 문제는 Firefox에서 사용할 수있는 방식으로 TLS 터널을 설정하는 것입니다. 나는 아직도 그것을하는 방법에 대한 설명을 보지 못했습니다.
allquixotic

@harrymc : 질문 제목은 TLS를 통해 말합니다 . HTTP 터널 은 암호화 되지 않고 TLS를 사용 하지 않는 HTTP를 통해 IP 패킷을 라우팅 합니다. 기사 자체에 따르면 연결이 암호화되지 않았습니다. 내 대리자가 그렇게 할 방법이 없습니다. 또한 Windows 클라이언트 상자에 대한 관리자 권한 이 없습니다 . socat
allquixotic

답변:


5

나는 그것을 알아. : D 이 솔루션은 모든 요구 사항을 충족하고 모든 목표를 완벽하게 충족 합니다 . 이를 달성하는 데 필요한 간접 수준을 고려할 때 성능도 나쁘지 않습니다.

따라서 일반적인 접근 방식은 다음과 같습니다.

  1. 로컬 인증 기관 (CA)을 설정하고 RSA "서버 키"및 "클라이언트 키"를 생성합니다 (256 비트 암호화 사용). 이를 위해 Easy-RSA 버전 3.0.0-rc2를 사용했습니다.

  2. "데비안 박스"(공용 인터넷의 서버)에서 bog 표준 HTTP 프록시를 실행하여 로컬 호스트 에서만 수신 하도록하십시오 (공용 인터넷에 노출되어서는 안 됨). 내 목적으로을 사용 Privoxy했지만 Squid잘 작동했을 것입니다. 그것은 단지 로컬 호스트에서 수신 이후로 (신뢰하지 않는 것이 당신의 상자에서 실행중인 프로세스가없는 한,있는 경우, 인증이 필요하지 않습니다 ...)

  3. stunnel을 다운로드 하여 클라이언트와 서버 모두에 설치하십시오. 이 작업을 수행하는 프로세스는 OS에 따라 다릅니다. 필자의 경우 Windows 용 소스 (파라노이아 ...)에서 stunnel을 컴파일하기로 결정했습니다.이 과정은 여기에서 자세히 설명하지 않는 다소 관련된 프로세스였습니다. 서버 측에서는 패키지 관리자에서 사용할 수 있습니다 :)

  4. Stunnel의 구성은 처음에는 상당히 어려웠지만 생각보다 간단합니다! 기본적으로 서버에는 아래 "server 's stunnel.conf"와 같은 것이 필요합니다. 클라이언트에서는 아래 "client 's stunnel.conf"와 같은 것이 필요합니다.

  5. Privoxy를 시작하십시오. 서버에서 stunnel을 시작하여 구성 파일을 가리 킵니다. 클라이언트에서 stunnel을 시작하여 구성 파일을 가리 킵니다. Privoxy의 설정에는 특별한 것이 없습니다. 기본값은 저에게 좋았습니다.

  6. 클라이언트 측에서 선택한 브라우저 인 Firefox의 경우 HTTP 및 HTTPS 프록시를 클라이언트의 stunnel이 수신하는 포트와 동일하게 설정하십시오 (localhost : 8080 등).

로컬 네트워크의 프록시가 어떤 종류의 인증을 요구하는 경우, stunnel을 인증하거나 다른 로컬 가로 채기 프록시를 사용하여 서로 연결해야합니다 (Firefox-> stunnel-> local). 프록시 인증-> LAN 프록시 / 게이트웨이-> 인터넷-> 서버의 stunnel-> privoxy.

그것은 많은 복사 작업이지만 작동합니다!

;This is the *client's* stunnel.conf.
[https]
accept = localhost:9020
connect = your.lan.proxy:80
client = yes
protocol = connect
;protocolHost should be the same as the "accept" for the server
protocolHost = 1.2.3.4:443
;Same CAfile, different cert and key pair
CAfile = ca.crt
cert = client.crt
key = client.key
;VERY IMPORTANT!!! Make sure it's really your server and not a MITM attempt by your local network by making sure that the certificate authority "ca.crt" really signed the server's cert
verify = 2
;More performance tweaks...
sessionCachetimeout = 600
sessionCacheSize = 200
TIMEOUTidle = 600

.

;This is the *server's* stunnel.conf.
[https]
;1.2.3.4 is a publicly-routable, static IP address that can be connected to by your box that's under the firewall
accept = 1.2.3.4:443
;localhost:8118 is an example of where your local forwarding HTTP(S) proxy might reside.
connect = localhost:8118
CAfile = ca.crt
cert = server.crt
key = server.key
;VERY IMPORTANT!!! Without this, anyone in the world can use your public stunnel port as an open proxy!
verify = 2
;Set some timeouts higher for performance reasons
sessionCacheTimeout = 600
sessionCacheSize = 200
TIMEOUTidle = 600

모든 것이 구성되면 최종 결과는 다음과 같습니다.

  1. 웹 브라우저는 localhost:9020(터널)에 연결하여 HTTP 및 / 또는 HTTPS 연결을 수락 할 수있는 프록시로 취급합니다.
  2. stunnel이 브라우저에서 연결되면 방화벽의 프록시 / 게이트웨이를 통해 원격 서버와의 TLS 세션을 설정합니다. 이 시점에서 클라이언트는 서버의 PKI 인증서를 확인하고 그 반대도 마찬가지입니다.
  3. 원격 서버와의 TLS 세션이 설정되면 stunnel은 브라우저에서 오는 데이터 (예 : HTTP 요청 또는 SSL 터널 요청)를 로컬 프록시를 통해 서버로 직접 전달합니다. 이 채널은 암호화되어 있으므로 로컬 네트워크는 데이터에 포함 된 내용을 알 수 없으며 트래픽 분석을 통해서만 추측 할 수 있습니다.
  4. 일단 stunnel실행중인 인스턴스 서버에이 데이터를 수신 시작, 그것은 예에 연결 개방 localhost:8118하여 HTTP (S) 프록시 서버는, 내 경우 것이냐에 듣기 곳이 될 것입니다.
  5. 그런 다음 Privoxy는 일반 전달 HTTP 프록시 서버처럼 작동하고 서버의 ISP를 통해 공용 인터넷에 요청을 전달합니다.

소켓과 버퍼의 양이 많으면 특히 프록시를 통해 SSL 연결을 중첩하는 경우이 방법이 오버 헤드가 높아지지만 로컬 네트워크가 SSL을 통해 어떤 사이트 를 방문 하는지 없다는 이점이 있습니다 . 내 말은, 당신이 당신의 서버를 방문한다는 것을 알고 있지만, 그 외에도, 당신이 Gmail이나 수퍼 유저를 방문하고 있는지를 알지 못합니다. 로컬 게이트웨이에는 필터링 또는 차단 방법이 없습니다.


2

로컬 컴퓨터에서이 설정을 시도했지만 "제한적 프록시"가을 얻을 수 CONNECT DEBIAN_IP:443 HTTP/1.1있지만 인증서가 표시되지 않으므로 이것이 작동하는지 확실하지 않습니다.

가정 해 봅시다 : 데비안은 프록 싱 SSH 서버 를 가지고 Apache있거나 Squid할 것 입니다. 클라이언트 PC에는 관리자 권한이 필요없고 설치가 필요 없으며 pendrive에서 실행할 수있는 프로그램 인이 필요합니다.putty

먼저 데비안 :

포트에서 수신하여 SSH를 확인 443, 단지 추가 (또는 현재 포트를 대체)는 Port 443/etc/ssh/sshd_config또한 TCP 전송을 허용 (추가 AllowTcpForwarding yes해당 파일에)

프록시를 수행하도록 Squid 또는 Apache를 구성하십시오. 이것은 SSH 터널을 통해 사용될 것이므로 루프백 인터페이스에서만 수신하면됩니다. Apache를 사용하는 경우 :

Listen 127.0.0.1:8080
ProxyRequests On
<Proxy *>
  Order deny,allow
</Proxy>

서버 완료, 클라이언트 PC를 구성 해 봅시다 :

퍼티에서로 데비안의 공용 IP를 구성 Host하고 443포트로. SSH여전히 선택되어 있는지 확인하십시오 . Connection -> Proxy설정으로 변경하고 HTTP"제한 프록시"설정을 선택 하고 채 웁니다. Connection설정을 변경하고 30-를 유지하십시오 60. 로 변경하십시오 Connection -> SSH -> Tunnels. 에 source portstablish 8080,과에 Destination, localhost:8080. 두고 Local선택하고 Enter 키를 누릅니다 Add. 당신은 같은 공간 위의 공간에서 볼 수 L8080 locahost:8080있습니다. 변경받는 뒤 Session의 첫 번째 행에 이름 아래 설정, 쓰기 Saved sessions이 지루한 설정 저장 도움말 재건 (?)에 다음과 같은 일에 연결.

이제 Open데비안과 연결을 시도 할 수 있습니다 . 사용자 프롬프트가 표시되면이 단계를 마치는 단계입니다. 그렇지 않다면 ... 다른 방법을 찾아야합니다.

이제 Firefox에서는 localhost포트에서 8080프록시로 설정 하십시오.


불행히도 SSH 프로토콜은 SSL / TLS를 기반으로하지 않기 때문에 작동하지 않습니다. 클라이언트 측의 제한 프록시가 포트 443을 통과하는 연결을 스니핑 하면 TLS 소켓 이 아니라는 것을 즉시 인식 하여 삭제합니다. 물론 TLS로 포장 할 수 는 있지만 귀하의 답변이 아닙니다.
allquixotic

HTTP 프록시 (BURP)로 테스트를 해보니 시험해 볼만한 가치가있었습니다. TLS를 통해 SSH를
감싸고

TLS를 통한 SSH는 불필요한 간접적입니다. 이미 TLS 소켓을 사용하고 있다면 실제로 SSH가 필요하지 않습니다. 아래 답변을 참조하십시오. (참고 : 최근까지이 답변에 대해 알지 못 했으므로 답을 쫓아 내고 해결책을 게시 한 것과 같지 않습니다. 문자 그대로 약 25 분 전에 이것을 발견했습니다.)
allquixotic

기쁜 마음으로 해결
NuTTyX

1

서버에서 프록시를 설정하는 중반 쯤입니다. 나머지 절반은 서버에서 SSL을 사용하고 클라이언트에서 로컬 프록시로 putty를 사용하여 SSL 사용 HTTP 프록시에 연결하고 Firefox가 모든 것을 프록시로 설정하여 127.0.0.1로 설정합니다.

방금 퍼티 설정을 위해 빠른 Google을 수행했으며 이것을 발견했습니다 : https://mariobrandt.de/archives/technik/ssh-tunnel-bypassing-transparent-proxy-using-apache-170/


공정하게, 그는 그의 직책을 통해 훨씬 더 자세하게 들어갔다. 투표 해 주셔서 감사합니다.
joe

@ krowe 내 대답에는 "Apache"또는 "PuTTY"가 없습니다.
allquixotic

아뇨, 당신이이 대답을지지했다고 귀찮게하지 않습니다! 나는 당신의 의견을 어떻게 든 그의 대답에 흠집을 내거나 그것을 찢어 버렸다고 말한 것으로 해석했습니다. 돌이켜 보면 링크 된 블로그 는 내가 게시 한 답변의 대안으로 괜찮은 것처럼 보이지만 성능, 기능 등이 어떻게 다른지 잘 모르겠습니다 (더 좋거나 나쁠 수 있음).
allquixotic

+1 어쨌든 웹 서버를 실행하기 때문에 이것을 좋아합니다.
krowe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.