Proxy Türleri ve Charles Web Proxy
- Protokol Nedeniyle Farklı Proxy Türleri
- HTTP Proxy
- HTTPS Proxy (HTTP + SSL = HTTPS)
- SOCKS Proxy (SOCKet Secure)
- Charles, Putty, SSH İle Proxy Uygulamaları
- Charles ile HTTP Proxy Uygulaması
- Charles ile HTTP Vekaleti SOCKS Üstünden SSH Tünele Yönlendirmek
- Putty ile SSH Tünel ve SOCKS Proxy
- cUrl Proxy Argümanları
- cUrl Sorgularını Proxy Sunucu Üstünden Çalıştırma
- SOCKS Proxy Üstünden cUrl ile Sorgu Çalıştırma
- Charles Nasıl Vekalet Ediyor?
- SSH Tünelin SOCKS Vekil Sunucusunu Kimlik Doğrulama ile Başlatmak
- curl ile SOCKS Proxy Üstünden Kendinde İmzalı Sertifika Otoritesinden Üretilmiş İstemci Sertifikası Olan Bir Siteye SSL Hatası Almadan İstek Yapabilmek
- Charles İle SOCKS Vekilin Arasına Girmek
- Birden Fazla DNS ve IP için Aynı Sertifikayı Kullanabilmek
Charles ile https isteklerinin arasına girip içeriği okumak üstüne yaptıklarımı not ediyorum. Bu sayede mümkün olursa POSTMAN, INSOMNIA gibi araçları http/2 çalışan sunucularla konuşturabilir miyim diye bakacağım.
Öncelikle Charles bir kaç proxy çalışma prensibine hizmet ediyor. Vekalet tipleri için bu videoyu izlemek isteyebilirsiniz.
Vekil sunucular sizin ile istek yaptığınız sunucular arasındaki aradaki sunuculardır.
Protokol nedeniyle farklı proxy türleri
- HTTP Proxy
- HTTPS Proxy (SSL Proxy)
- SOCKS proxy
Anonimlik seviyesine göre farklı proxy türleri:
- Transparent Proxy
- Anonymous Proxy
Verilerin değiştirilmesine dayalı proxy türleri:
- Forward proxy
- Reverse proxy
Protokol Nedeniyle Farklı Proxy Türleri
HTTP Proxy
HTTP proxy, web sunucusuna veya istemciye (tarayıcı) bağlanmak için HTTP kullanan herhangi bir proxy sunucusudur. İnternette HTTP’nin yaygın kullanımı nedeniyle, proxy’lerin çoğu HTTP proxy’leridir.
Bu proxy’ler internette gezindiğiniz web sayfalarına erişebilir. Güvenli HTTP (HTTPS) kullanarak web sitelerine de erişebilmelerine rağmen, maliyet, işlem sırasında orijinal SSL Sertifikasını kaybediyor.
HTTP bağlantısı verileri SOCKS protokolünden daha kolay yorumlayabildiğinden, botlar ve kazıyıcılar HTTP proxy’leriyle daha iyi performans gösterir.
HTTPS Proxy (HTTP + SSL = HTTPS)
Verilerin sizin bilgisayarınızdan ziyaret ettiğiniz sitenin bilgisayarına giderken şifrelenmesi için SSL (yeni adıyla TLS) kullanıyoruz. Yani sizin verilerinizi bir bilgisayardan bir başkasına taşıyabilmek için HTTP yi açık metin halinde götürürken bu verinin şifrelenmesi için şimdilerde 1.2 versiyonu kullanılan TLS sayesinde bir şifreleme düzeneğinin bilgisayarlar arasından alınıp verildiği, verilerin şifrelendiği sistemi işleterek HTTPS protokolünü bize sunar.
SSL veya Güvenli Yuva Katmanı, HTTP’yi HTTPS yapmak için uygulanan ek bir güvenlik katmanıdır. Bu katman, veri aktarımı sırasında gizli dinlemeyi önlemek için uçtan uca şifreleme için kullanılan güvenlik sertifikalarını ekler.
SSL ile donatılmış bir proxy sunucusu, herhangi bir dış müdahaleyi önlemek için istemciye ve ayrıca web sunucusuna güvenli bir bağlantı kurar. HTTPS Proxy’leri, kullanıcı adı ve parola kullanarak işlem yaparken veya web sitelerinde oturum açarken güvende kalmanıza yardımcı olur.
SOCKS Proxy (SOCKet Secure)
SOCKet Secure, bir istemci adına ağ trafiğini gerçek sunucuya yönlendirerek bir güvenlik duvarı üzerinden sunucularla iletişimi kolaylaştıran bir ağ protokolüdür. SOCKS, herhangi bir protokol veya program tarafından üretilen her tür trafiği yönlendirmek için tasarlanmıştır.
Bir SOCKS proxy sunucusu, istemci adına güvenlik duvarının arkasındaki başka bir sunucuya bir TCP bağlantısı oluşturur, ardından istemci ile gerçek sunucu arasında ağ paketlerini değiştirir. SOCKS proxy sunucusu, istemci ile sunucu arasındaki ağ trafiğini hiçbir şekilde yorumlamaz; Genellikle, istemciler bir güvenlik duvarının arkasında olduğundan ve bunu SOCKS proxy sunucusu aracılığıyla yapmadıkları sürece dış sunuculara TCP bağlantıları kurmalarına izin verilmediğinden kullanılır. Bu nedenle, bir SOCKS proxy’si bir kullanıcının TCP ve UDP oturumunu güvenlik duvarı üzerinden aktarır.
SOCKS, 5. katman protokolüdür ve OSI modelinde bu katmanın altındaki hiçbir şeyi umursamaz (bu, katman 5'in altında çalışan protokolleri tünellemek için kullanamayacağınız anlamına gelir). SOCKS, SSL (katman 7) ve TCP/UDP (katman 4) arasında 5. katmana oturduğundan, HTTP, HTTPS, POP3, SMTP ve FTP dahil olmak üzere çeşitli istek türlerini işleyebilir. Sonuç olarak, SOCKS e-posta, web’de gezinme, eşler arası paylaşım, dosya aktarımları ve daha fazlası için kullanılabilir.
İstemci ile sunucu arasındaki HTTP veya HTTPS trafiğini yorumlamak ve iletmek için kullanılan bir HTTP proxy’si gibi, 7. katmanda belirli protokoller için oluşturulan diğer proxy’ler, genellikle uygulama proxy’leri olarak adlandırılır.
SOCKS Proxies, trafiği yönlendirmek için istemci adına bir TCP bağlantısı oluşturur. Bu, güvenlik duvarları üzerinden tünel açma yöntemidir ve proxy sunucusu bile verileri yakalayamaz.
Biraz daha açalım durumu»
- Diyelim bilgisayarınızın IP adresi
10.10.10.10
ve erişmek istediğiniz adreshttp://50.50.50.50
olsun. Bu 50'li IP bloğuna erişiminiz de yooook ;) - Bir başka bilgisayarın ise (diyelim ki
20.20.20.20
IPli olsun) hem 30 hem 50 li bloğa erişebilsin ama 40 lı bloğa erişemesin. Ve farz edelim ki siz bu 20 li makineye SSH ile bağlanabiliyorsunuz. ssh -D 4500 kullanıcı_adı@20.20.20.20
komutuyla SSH bağlantısı sağlayıp firefox seçeneklerinizden proxy (vekil) ayarlarında manual proxy seçeneği, SOCKS5, sunucuya kendi bilgisayarınızı (localhost) ve port olarak 4500 yazabilirsiniz.
Olan şey ise aşağıdaki grafikteki gibidir. SSH tüneli bilgisayarınızla uzak sunucu arasına kurduktan sonra internet gezgininize SOCKS proxy bağlantısı kurarak HTTP isteklerinizi bu tünele yönlendirebilirsiniz. Tünele düşen istek uzak sunucuya gelir ve doğrudan hedefe yönlendirilir. SSH Tünel içinden geçtiği için kimse bu akışı dinleyemez.
SOCKS 4 TCP desteklerken SOCKS 5 ayrıca UDP protokolünü de destekler, bu nedenle SOCKS proxy çok daha fazla uygulamayı destekler.
ssh -D 4500 kullanıcı_adı@20.20.20.20
komutuna ek olarak:
-N
uzak komutları çalıştırmayın, sadece portları iletmek için kullanışlıdır-C
tüneldeki verileri sıkıştırıp bant genişliğinden tasarruf edin-q
sessiz mod, yerel olarak herhangi bir çıktı üretmez-f
(fork kelimesinin kısaltması olup arka plan komutunu çatallamak)arka planda çalışmasını tercih ediyorsanız kullanmalısınız
Charles, Putty, SSH İle Proxy Uygulamaları
Charles ile HTTP Proxy Uygulaması
Charles ile HTTP Vekaleti SOCKS Üstünden SSH Tünele Yönlendirmek
Putty ile SSH Tünel ve SOCKS Proxy
cUrl Proxy Argümanları
- Ortam değişkenlerinde
- cUrl ayarlar dosyasında
vekil sunucu ayarlarınızı saklayabilirsiniz. http_proxy’nin küçük harf olduğunu, diğer ikisinin büyük harf olduğunu unutmayın.
http_proxy=socks5h://localhost:8001
HTTPS_PROXY=socks5h://localhost:8001
ALL_PROXY=socks5h://localhost:8001 PROGRAM [OPTION]...
Kalıcı olarak cUrl
uygulamasının vekil sunucu ayarlarını .curlrc
dosyasından okuyabilir. Bu dosyayı
- Windows için
echo %APPDATA%
ile gördüğünüz dizine kaydetmenizgerek örneğin:C:\Users\<kullanıcınız>\AppData\Roaming
dizininin altında_curlrc
adında, - Linux altında ev dizininde (
cd ~
).curlrc
dosya adıyla kaydedeceğiz - Dosyanın içeriği
proxy="http://user:pwd@127.0.0.1:1234"
şeklinde olacak
Hata giderme
C:\Users\cem.topkaya>curl --help | grep proxy
--noproxy <no-proxy-list>
Proxy kullanmayan ana bilgisayarların listesi--preproxy [protokol://]host[:port]
Önce bu proxy'yi kullanın-x, --proxy [protokol://]host[:port]
Bu proxy'yi kullanın
protokoller: http, https, socks4a, socks4, socks5, socks5h--proxy-anyauth
Herhangi bir proxy kimlik doğrulama yöntemi seçin--proxy-basic
Proxy üzerinde Temel kimlik doğrulamasını kullan--proxy-cacert <file>
Yetkili sunucuya karşı eş doğrulamak için CA sertifikası--proxy-capath <dir>
proxy için eş doğrulamak için CA dizini--proxy-cert <cert[:passwd]>
Proxy için istemci sertifikasını ayarlayın--proxy-cert-type <tür>
HTTS proxy'si için istemci sertifika türü--proxy-ciphers <list>
Proxy için kullanılacak SSL şifreleri--proxy-crlfile <file>
Proxy için bir CRL listesi ayarlayın--proxy-digest
Proxy üzerinde Özet kimlik doğrulamasını kullanın--proxy-header <header/@file>
Özel üstbilgileri proxy'ye iletin--proxy-insecure
Proxy'yi doğrulamadan HTTPS proxy bağlantılarını yapın--proxy-key <key>
HTTPS proxy'si için özel anahtar--proxy-key-type <tür>
Proxy için özel anahtar dosya türü--proxy-negotiate
Proxy üzerinde HTTP Pazarlık (SPNEGO) kimlik doğrulamasını kullanın--proxy-ntlm
Proxy üzerinde NTLM kimlik doğrulamasını kullanın--proxy-pass <phrase>
HTTPS proxy'si için özel anahtar için parola dizgesi--proxy-service-name <ad>
SPNEGO proxy hizmet adı--proxy-ssl-allow-beast
HTTPS proxy'si için birlikte çalışma için güvenlik açığına izin ver--proxy-tlsauthtype <tür>
HTTPS proxy'si için TLS kimlik doğrulama türü--proxy-tlspassword <string>
HTTPS proxy'si için TLS şifresi--proxy-tlsuser <name>
HTTPS proxy'si için TLS kullanıcı adı--proxy-tlsv1
HTTPS proxy için TLSv1 kullanın-U, --proxy-user <kullanıcı: parola>
Proxy kullanıcısı ve parolası--proxy1.0 <host[:port]>
Verilen bağlantı noktasında HTTP / 1.0 proxy kullan-p, --proxytunnel
Bir HTTP proxy tüneli aracılığıyla çalıştırın (CONNECT kullanarak)--socks4 <host[:port]>
Verilen ana bilgisayar + bağlantı noktasında SOCKS4 proxy'si--socks4a <host[:port]>
Verilen ana bilgisayar + bağlantı noktasında SOCKS4a proxy--socks5 <host[:port]>
Verilen ana bilgisayar + bağlantı noktasında SOCKS5 proxy'si--socks5-gssapi-service <ad>
GSS-API için SOCKS5 proxy hizmet adı--socks5-hostname <host[:port]>
SOCKS5 proxy, ana bilgisayar adını proxy’ye geçir--suppress-connect-headers
Proxy CONNECT yanıt üstbilgilerini bastır
cUrl Sorgularını Proxy Sunucu Üstünden Çalıştırma
Charles’ı SOCKS Proxy olarak çalıştırıyoruz:
Aşağıdaki cUrl
ifadesinin ayrıntısını biraz daha aşağıda yazıyor olacağım ama önce bir göz atalım nasıl olduğuna.
curl -x "socks5://127.0.0.1:5000" "http://httpbin.org/ip"
- Charles’ı SOCKS protokolüyle çalışabilen vekil sunucu olarak araya sokuyoruz.
- cUrl ifademize “http://httpbin.org/ip” isteğimizi SOCKS vekil sunucu üstünden göndermek istediğimizi söyledik
- Hem Charles üstünde hem cUrl komutu sonucunda görüyoruz.
SOCKS Proxy Üstünden cUrl ile Sorgu Çalıştırma
Aşağıdaki doğrudan curl komutu ile istek yaptığımız adres bilgisayarımızın internete ulaştığı IP adresini verir.$ curl "http://httpbin.org/ip"
cUrl eğer bir proxy üstünden çalışırsa bu kez internete eriştiği IP adresi vekil sunucunun IP adresi olacaktır$ curl -x "socks5://127.0.0.1:5000" "http://httpbin.org/ip"Eğer bir kullanıcı doğrulaması varsa proxy'nin üstünde:$ curl -x "socks5://kullanici_adi:sifresi@127.0.0.1:6000" "http://httpbin.org/ip"
Transparent Proxy
Ön bellekleme (caching), web isteklerini süzme (web filtering) veya gateway sunucular olarak çalışan, istemci olan size bir ayar yaptırtmayan vekil sunuculara Transparent Proxy Server denir. Siz farkında olmadan şirketinizde sizin haberiniz olmadan tüm istekleriniz bir şeffaf vekil sunucu üstünden akıyor, bu veriler günlükleniyor olabilir. Bu proxy’ler istenen veya yanıtlanan verileri değiştirmez, bu nedenle anonimlik söz konusu değildir ve web siteleri IP adresinizi okuyabilir.
Transparent proxies are also termed as intercepting proxy, inline proxy, or forced proxy.
Reverse proxy
Reverse proxy en çok güvenlik amaçlı kullanılır. Aşağıdaki gösterimde bir App Server, bir Database Server var. Dış dünyadan bu sunuculara doğrudan erişim sağlayamasınlar diye önlerine Reverse Proxy Server koyup, gelen istekleri portlarına bakarak arkasındaki sunuculara yönlendiriyor. Böylece dış dünya, korumak istediğimiz sunucuların IP bilgilerini hiç bilmiyor olacaklar.
Charles Nasıl Vekalet Ediyor?
Önce charles’ın sertifikasını bilgisayara yükleyeceğiz. Böylece istemci ile kendi sertifikası üstünden konuşsun, sunucuylada sunucudan gelen sertifika üstünden konuşsun. Bir nevi hem Almanca hem Fransızca bilen bir Türk çevirmenin her ikisinin arasında (man-in-middle) söylediklerini bilip ve aktarması gibi.
SSH Tünelin SOCKS Vekil Sunucusunu Kimlik Doğrulama ile Başlatmak
Böyle bir özellik yokmuş ama Dante diye bir uygulama buna imkan veriyormuş.
curl ile SOCKS Proxy Üstünden Kendinde İmzalı Sertifika Otoritesinden Üretilmiş İstemci Sertifikası Olan Bir Siteye SSL Hatası Almadan İstek Yapabilmek
Öncelikle komut şu:
curl -vvv --socks5-hostname 127.0.0.1:5000 https://10.10.31.111:8103/nssf-settings/v1/db --cacert ca-crt.crt
---v
Her adımı tek tek anlatsın
--socks4
/ --socks4a
/ --socks5
/ -socks5-hostname
Hangi SOCKS vekil üstünden curl
isteğimizi yapmak istediğimizi belirtiriz. Kendi makinemizde (localhost
veya 127.0.0.1
) açık bir SOCKS hizmeti mevcut ve bu hizmet 5000 port’undan verilmekte. ssh.exe Uygulaması aynı zamanda açtığı Secure Shell (SSH) tünelini başka uygulamalar için SOCKS Proxy olarak kullandırabilir. Bunun için ssh -D 5000 uzakMakineKullaniciAdi@UzakMakineAdresi
şeklinde bir komut çalıştırılması yeterlidir.
https://10…
ile SOCKS Vekilinin erişebileceği bir adresi veriyoruz.
--cacert
Argümanına vereceğimiz değer ile https://10… adresine kurulacak güvenli soket katmanını (Secure Socket Layer) şifrelemede kullanılacak sertifikayı imzalayan Sertifika Otoritesine (Certificate Authority) ait sertifikanın umuma açık olanını (public) veriyoruz. Böylece sertifikayı tanıyamadım hatasını almamak için -k
anahtarını kullanmamıza gerek kalmaz
curl: (60) SSL certificate problem: unable to get local issuer certificate
Eğer CA’nın açık sertifikasını veremezsek -k anahtarıyla “sertifikaları doğrulamaktan vazgeç, gelen sertifika ne ise ona güven” diyebiliriz.
Charles İle SOCKS Vekilin Arasına Girmek
Bu kez Charles içinde harici bir vekil üstünden gideceğimizi aşağıdaki gibi belirtiriz.
- Proxy > External Proxy Settings > SOCKS Proxy > SOCKS Proxy Server: localhost:5000
- SSL Proxy Olarak Charles çalıştırılır
- İstek bu kez http proxy olarak çalışan Charles üstünden yapılır:
curl -vvv --proxy 127.0.0.1:8888 https://10.10.31.111:8103/nssf-settings/v1/db -k
Sertifika üretip bir sunucuda kullanmak kısmı için bu adres (https://engineering.circle.com/https-authorized-certs-with-node-js-315e548354a2)
Özetle komutlaR:
# CA Sertifikası
openssl genrsa -out server-key.pem 4096wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/ca.cnfopenssl req -new -x509 -days 9999 -config ca.cnf -keyout ca-key.pem -out ca-crt.pem
# Sunucu Sertifikasıopenssl genrsa -out server-key.pem 4096wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/server.cnfopenssl req -new -config server.cnf -key server-key.pem -out server-csr.pemopenssl x509 -req -extfile server.cnf -days 999 -passin "pass:password" -in server-csr.pem -CA ca-crt.pem -CAkey ca-key.pem -CAcreateserial -out server-crt.pem# İstemci Sertifikası
openssl genrsa -out client1-key.pem 4096wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/client1.cnfopenssl req -new -config client1.cnf -key client1-key.pem -out client1-csr.pemopenssl x509 -req -extfile client1.cnf -days 999 -passin "pass:password" -in client1-csr.pem -CA ca-crt.pem -CAkey ca-key.pem -CAcreateserial -out client1-crt.pem
Birden Fazla DNS ve IP için Aynı Sertifikayı Kullanabilmek
Eğer birden fazla DNS adına veya IP adresine yapacağınız isteklerde bu sertifikayı kullanmak istiyorsanız -extensions req_ext
parametresini eklemeniz gerekiyor. Tabi bu parametrenin gereği olarak client.cnf dosyasında aşağıdaki değişiklikleri yapmanız gerekiyor:
[ req_ext ]
subjectAltName = @alt_names[alt_names]
DNS.1 = *.cem.com.tr
DNS.2 = localhost
IP.1 = 127.0.0.1
IP.2 = 10.10.31.111
!!! DİKKAT !!!openssl x509 -req -extfile client1.cnf -extensions req_ext -days 999 -passin "pass:password" -in client1-csr.pem -CA ca-crt.pem -CAkey ca-key.pem -CAcreateserial -out client-crt.pemArtık oluşan sertifika dosyasını doğrulamak için aşağıdaki komutu çalıştıralımopenssl verify -CAfile ca-crt.pem client1-crt.pem
CN bilgilerinin çalışacağı URL ile eşleşmesine dikkat edin
# ca.cnf
[ ca ]
default_ca = CA_default[ CA_default ]
serial = ca-serial
crl = ca-crl.pem
database = ca-database.txt
name_opt = CA_default
cert_opt = CA_default
default_crl_days = 9999
default_md = md5[ req ]
default_bits = 4096
days = 9999
distinguished_name = req_distinguished_name
attributes = req_attributes
prompt = no
output_password = password[ req_distinguished_name ]
C = US
ST = MA
L = Boston
O = Example Co
OU = techops
CN = ca
emailAddress = certs@example.com[ req_attributes ]
challengePassword = test
# client1.cnf
[ req ]
default_bits = 4096
days = 9999
distinguished_name = req_distinguished_name
attributes = req_attributes
prompt = no
x509_extensions = v3_ca[ req_distinguished_name ]
C = US
ST = MA
L = Boston
O = Example Co
OU = techops
CN = 10.10.31.111
emailAddress = certs@example.com[ req_attributes ]
challengePassword = password[ v3_ca ]
authorityInfoAccess = @issuer_info[ issuer_info ]
OCSP;URI.0 = http://ocsp.example.com/
caIssuers;URI.0 = http://example.com/ca.cert
Sunucu:
var fs = require('fs');
var https = require('https'); var options = {
key: fs.readFileSync('server-key.pem'),
cert: fs.readFileSync('server-crt.pem'),
ca: fs.readFileSync('ca-crt.pem'),
requestCert: true,
rejectUnauthorized: true
}; https.createServer(options, function (req, res) {
console.log(new Date()+' '+
req.connection.remoteAddress+' '+
req.socket.getPeerCertificate().subject.CN+' '+
req.method+' '+req.url);
res.writeHead(200);
res.end("hello world\n");
}).listen(4433);
İstemci:
var fs = require('fs');
var https = require('https'); var options = {
hostname: 'localhost',
port: 4433,
path: '/',
method: 'GET',
key: fs.readFileSync('client1-key.pem'),
cert: fs.readFileSync('client1-crt.pem'),
ca: fs.readFileSync('ca-crt.pem') }; var req = https.request(options, function(res) {
res.on('data', function(data) {
process.stdout.write(data);
});
}); req.end(); req.on('error', function(e) {
console.error(e);
});