Założenia:
Serwer:
- Mam serwer Debian Squeeze, który można routować w publicznym Internecie, ze statycznym adresem IPv4.
- Mam nieograniczony dostęp do modyfikowania oprogramowania na serwerze.
- Serwer może nasłuchiwać na dowolnych portach, rekonfigurować reguły zapory, w zasadzie nie ma ograniczeń co do tego, co serwer może zrobić.
Klient:
- Mogę uruchamiać Firefox, programy Java, programy .NET i niektóre natywne pliki wykonywalne, które nie wymagają dostępu administratora w moim systemie lokalnym (zablokowany pulpit systemu Windows bez uprawnień administratora).
- Mogę zainstalować dodatki w przeglądarce Firefox.
- Mogę nasłuchiwać na dowolnym porcie
localhost
interfejsu loopback ( ). Tak więc wspomniane programy mogą łączyć się z portem lokalnym i wykonywać dowolne sieciowe operacje we / wy, bez przechodzenia przez serwer proxy. - Cały publiczny dostęp do Internetu jest kierowany przez restrykcyjny serwer proxy HTTP, który blokuje wiele witryn i dokładnie kontroluje stan. Na porcie 80 pozwala wyłącznie na HTTP (bez TLS / SSL). Na porcie 443 umożliwia
CONNECT
oparte na SSL / TLS zdalne hosty, które nie są blokowane przez nazwę domeny / adres IP. - Ograniczający serwer proxy HTTP nie przeprowadza głębokiej kontroli pakietów połączeń TLS, które są dozwolone przez serwer proxy, i nie wykonuje ataków typu Man in the Middle na te połączenia.
- Wyżej wymieniony serwer, do którego mam dostęp, nie jest blokowany przez proxy.
Cel:
Chcę kierować wszystkie żądania HTTP i HTTPS wysyłane przez Firefox przez powyższy serwer przez SSL / TLS.
Inne uwagi na temat „celu”:
- Nawet jeśli witryna punktu końcowego (na przykład
http://superuser.com
) nie korzysta z SSL / TLS na moim serwerze, nadal chcę używać SSL / TLS od mojego klienta do mojego serwera i zlecić serwerowi wykonanie żądania HTTP - zaszyfrowanego lub nie - - do mojego pożądanego celu. - Nie dbam o to, czy mój serwer patrzy na ruch SSL „w sposób oczywisty”. Innymi słowy, nie wymagam pełnego szyfrowania SSL od mojego lokalnego klienta, aż do zdalnego serwera, jeśli dostęp do zdalnego serwera uzyskuje się np
https://google.com
. Innymi słowy, ufam serwerowi, że zachowa poufność moich danych. - Jestem skłonny zainstalować dowolne oprogramowanie lub dodatki do Firefoksa, które nie wymagają uprawnień administratora i mogą działać w 32-bitowym systemie Windows 7.
- Oprogramowanie typu open source jest lepsze od praw własności, a freeware jest lepsze od oprogramowania wymagającego opłaty licencyjnej.
- Istniejące oprogramowanie jest lepsze niż konieczność kodowania nowego oprogramowania, chociaż jestem gotów napisać kod, jeśli jest to jedyny sposób.
Szukam luźno opisanego „rozwiązania”, które opisuje:
- Jakie oprogramowanie będzie wymagane na kliencie? Jeśli znasz konkretny pakiet oprogramowania, nazwij go; w przeciwnym razie opisz, co musiałoby zrobić oprogramowanie klienckie .
- Jakie oprogramowanie będzie wymagane na serwerze? Jeśli znasz konkretny pakiet oprogramowania, nazwij go; w przeciwnym razie opisz, co musiałoby zrobić oprogramowanie serwera .
- Jeśli wyżej wymieniono konkretne pakiety oprogramowania, opisz, jakie parametry konfiguracji byłyby konieczne, aby skonfigurować je, aby osiągnąć mój cel.
- Jeśli z jakiegoś powodu uważasz, że nie jest to możliwe , opisz dlaczego .
Rzeczy, które próbowałem, które nie działają
- Instalując
squid
na moim serwerze, próbowałem skonfigurować własne własne proxy HTTP na moim serwerze. To nie zadziałało, ponieważ kiedy żądam stron internetowych w Firefoksie przez zwykły HTTP, Firefox próbuje również uzyskać dostęp do mojego serwera przez zwykły HTTP! Jest to niedopuszczalne, ponieważ serwer proxy w mojej sieci lokalnej może oczywiście obserwować i / lub blokować regularny ruch HTTP między moim klientem a serwerem. - Sieci VPN nie działają , nawet OpenVPN przez nasłuchiwanie TLS na porcie 443, ponieważ nie mam uprawnień na komputerze lokalnym do zainstalowania
tun
karty sieciowej, która może wykonywać routing w warstwie 3, ani nie mogę wykonywać żadnego rodzaju routingu w warstwie 2 (nptap
.). Krótko mówiąc: potrzebuję uprawnień administratora, aby zainstalować OpenVPN, a nawet gdybym miał te uprawnienia tymczasowo, firma nie byłaby zbyt zadowolona, gdyby dowiedziała się, że został zainstalowany. Program Java lub .NET jest znacznie mniej zauważalny, szczególnie gdy nie jest zainstalowany w Dodaj / Usuń programy i nie ma komponentu sterownika jądra, jak robi to OpenVPN.
socat
uprawnień ani uprawnień administracyjnych do skrzynki klienta Windows.Odpowiedzi:
Rozgryzłem to. : D To rozwiązanie spełnia wszystkie moje wymagania i doskonale spełnia wszystkie moje cele. Wydajność też nie jest zła, biorąc pod uwagę poziom pośredni niezbędny do osiągnięcia tego.
Ogólne podejście jest zatem następujące:
Skonfiguruj lokalny ośrodek certyfikacji (CA) i wygeneruj RSA „klucz serwera” i „klucz klienta” (użyłem szyfrowania 256-bitowego). W tym celu użyłem Easy-RSA w wersji 3.0.0-rc2.
Uruchom dowolny standardowy serwer proxy HTTP na „Debian Box” (serwer w publicznym Internecie), upewniając się, że nasłuchuje tylko na lokalnym hoście (NIE powinien być narażony na publiczny Internet). Do moich celów wykorzystałem
Privoxy
, aleSquid
równie dobrze działałby. Ponieważ słucha tylko na localhost, uwierzytelnianie nie jest konieczne (chyba że istnieją procesy uruchomione w oknie, które się nie ufasz; w takim przypadku, Jezu ...)Pobierz stunnel i zainstaluj go zarówno na kliencie, jak i serwerze. Proces tego będzie zależał od systemu operacyjnego; w moim przypadku zdecydowałem się skompilować stunnel ze źródła (paranoja ...) dla Windows, co było raczej zaangażowanym procesem, którego tutaj nie będę szczegółowo opisywał. Po stronie serwera był dostępny w menedżerze pakietów :)
Konfiguracja Stunnela była początkowo dość zniechęcająca, ale jest prostsza niż się wydaje! Zasadniczo na serwerze potrzebujesz czegoś takiego jak „stunnel.conf serwera” poniżej. Na kliencie potrzebujesz czegoś w rodzaju „stunnel.conf klienta”.
Uruchom Privoxy; uruchom stunnel na serwerze, wskazując go na plik konfiguracyjny; uruchom stunnel na kliencie, wskazując go na plik konfiguracyjny. Tak naprawdę nie ma nic specjalnego w konfiguracji Privoxy; domyślnie było dla mnie w porządku.
W przeglądarce Firefox, z której wybierasz przeglądarkę po stronie klienta, ustaw HTTP i HTTPS proxy tak, aby były portem, na którym nasłuchuje twój stunnel - prawdopodobnie coś takiego jak localhost: 8080.
Powinienem prawdopodobnie zauważyć, że jeśli serwer proxy twojej sieci lokalnej wymaga pewnego uwierzytelnienia, albo będziesz musiał uzyskać stunnel, aby się uwierzytelnić, albo użyj innego lokalnego serwera przechwytującego proxy i połącz je razem - coś w rodzaju Firefox -> stunnel -> local proxy uwierzytelniające -> proxy LAN / brama -> internet -> stunnel twojego serwera -> privoxy.
To dużo kopiowania, ale działa!
.
Po skonfigurowaniu wszystkiego wynik końcowy wygląda mniej więcej tak:
localhost:9020
(stunnel) i traktuje ją jak serwer proxy, który może akceptować połączenia HTTP i / lub HTTPS.stunnel
instancja działająca na serwerze zacznie odbierać dane, otworzy połączenie np. Z miejscemlocalhost:8118
, w którym serwer proxy HTTP (S), w moim przypadku Privoxy, nasłuchuje.Ilość gniazd i buforów powoduje, że ta metoda jest bardzo obciążona, szczególnie jeśli zagnieżdżasz połączenie SSL przez proxy, ale ma tę zaletę, że twoja sieć lokalna nie ma możliwości sprawdzenia, które strony odwiedzasz przez SSL. To znaczy, wie, że odwiedzasz swój serwer, ale poza tym nie wie, czy odwiedzasz Gmaila, SuperUser czy cokolwiek innego. Twoja lokalna brama nie ma możliwości filtrowania ani blokowania cię.
źródło
Wypróbowałem tę konfigurację na moim komputerze lokalnym i mogę zapewnić, że „restrykcyjny serwer proxy” otrzyma
CONNECT DEBIAN_IP:443 HTTP/1.1
certyfikat, ale nie zobaczy żadnego certyfikatu, więc nie jestem pewien, czy to zadziała.Chodźmy asume: Twój Debian ma
Apache
lubSquid
zrobić proxy i serwer SSH. Na komputerze klienckim potrzebujeszputty
, który jest programem, który nie wymaga uprawnień administratora do uruchomienia, nie wymaga instalacji i może działać z pendrive'a.Najpierw twój Debian:
Spraw, aby Twój SSH nasłuchiwał na porcie
443
, po prostu dodaj (lub zamień swój obecny port)Port 443
na,/etc/ssh/sshd_config
a także zezwól na przekazywanie TCP (dodajAllowTcpForwarding yes
do tego pliku)Skonfiguruj Squid lub Apache, aby wykonywać proxy. Ponieważ będzie to wykorzystywane przez tunel SSH, wystarczyłoby nasłuchiwać na interfejsie pętli zwrotnej. W przypadku korzystania z Apache:
Serwer gotowy, skonfigurujmy komputer kliencki:
Na Kit skonfiguruj publiczny adres IP Debiana jako
Host
i443
jako port. Upewnij się, żeSSH
jest nadal wybrany. ZmieńConnection -> Proxy
ustawienia, wybierzHTTP
i wypełnij ustawienia „restrykcyjnego proxy”. Przejdź doConnection
ustawień i ustal relację z30
-60
. Zmień naConnection -> SSH -> Tunnels
. Onsource port
utwierdzi8080
i naDestination
,localhost:8080
. PozostawLocal
zaznaczone i naciśnijAdd
. Powinieneś widzieć w przestrzeni nad czymś takimL8080 locahost:8080
. Wróć doSession
ustawień, zapisz nazwę w pierwszym rzędzieSaved sessions
i zapisz wszystkie te żmudne ustawienia, aby przywrócić połączenie w kolejnych dniach.Teraz możesz spróbować
Open
połączyć się z twoim Debianem. Jeśli zobaczysz monit użytkownika, jesteśmy o krok od zakończenia tego. Jeśli nie ... będziemy musieli szukać innej drogi.Teraz w przeglądarce Firefox ustaw
localhost
port8080
jako serwer proxy.źródło
Jesteś w połowie drogi do skonfigurowania serwera proxy na swoim serwerze. Druga połowa to SSL na serwerze, a lokalny serwer proxy na kliencie używa putty do łączenia się z serwerem HTTP obsługującym SSL i ustaw Firefox na proxy wszystko na 127.0.0.1.
Właśnie zrobiłem szybkie google dla zestawu kit i znalazłem to: https://mariobrandt.de/archives/technik/ssh-tunnel-bypassing-transparent-proxy-using-apache-170/
źródło