рдореИрдВ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдЪрд░реЗ рдФрд░ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЯреНрд░реИрдлрд╝рд┐рдХ рдореЗрдВ рджреЗрдЦрдиреЗ рдпрд╛ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╢рд╛рдпрдж рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдкрдиреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдХреНрд╖рдгрд┐рдХ рддрд┐рдкрд╣рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдХреЛрдбрд┐рдВрдЧ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдареАрдХ рд╣реИ, рдХреЛрдИ рдЫреЛрдЯреА рдЪреАрдЬрд╝реЛрдВ рдХреЗ рддрд╣рдд, рднреА, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рдХ рд▓рдВрдмрд╛ рд╣реИред
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдХрд╛рд░реНрдп рдзреАрдореА рдЧрддрд┐ рд╕реЗ (рд▓рдЧрднрдЧ 5-10kb / s рд▓реИрдЧреНрд╕ рдХреЗ рд╕рд╛рде) рдХрдиреЗрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реА рд╕рд╛рдЗрдЯреЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рдерд╛ред рджреЛ рдореБрдЦреНрдп рдХреНрд╖реЗрддреНрд░ рд╣реИрдВ: 1) рдЙрди рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рдХрд╛рдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИрдВ (рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╡рд┐рдЬреНрдЮрд╛рдкрди), рдФрд░ рдЙрди рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╡рд┐рдЬрд╝рд┐рдЯ рдХреА рдЧрдИ рд╕рд╛рдЗрдЯреЛрдВ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдмрд╣реБрдд рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрд╛рдП рдмрд┐рдирд╛ рдХреИрд╢ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬрдм рд╕рд╛рдЗрдЯреЗрдВ рд╕реНрд╡рдпрдВ http рд╣реЗрдбрд░ рдореЗрдВ рдХреИрд╢рд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреА рд╣реИрдВ, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдереИрддрд┐рдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдпреВрдЖрд░рдПрд▓ рдХреЗ рдмрд╛рдж рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рд╢реНрди рдЪрд┐рд╣реНрди рдЬреЛрдбрд╝рдХрд░ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рддреЗ рд╣реИрдВред
рдЪреЗрддрд╛рд╡рдиреА: рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рдЕрдиреНрдп * рдирд┐рдХреНрд╕ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕реЗ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ)ред
рдбреНрд░рд╛рдлреНрдЯ: nginx + php-fpm
рдореИрдВ рдпрд╣ рд╕рдм рд╕рдордп рдмрд┐рддрд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЬрд▓реНрджреА рд╕реЗ nginx + php-fpm рдмрдВрдбрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкрд╣рд▓реЗ рдкрд╛рд░реНрд╕ рдХрд┐рдП рдЧрдП рдЗрдирдХрдорд┐рдВрдЧ рдХрдиреЗрдХреНрд╢рди, рдЬрд┐рд╕рдореЗрдВ https рдФрд░ рдЙрди рд╕рднреА рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдмрд┐рдирд╛ рд╣реЛрд╕реНрдЯ рдФрд░ URL рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдП, рдПрдХ рд╣реА php рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ред ред рдПрдХ рдЫреЛрдЯрд╛ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рднреА рдерд╛ рдЬрд┐рд╕рдиреЗ http-рдкреНрд░реЙрдХреНрд╕реА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдирд┐рдпрдорд┐рдд http (s) рдЯреНрд░реИрдлрд╝рд┐рдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреБрд░реЛрдз рдХрд░ рджрд┐рдпрд╛, рд╣реИ GET http://host/path HTTP/1.x
рдореЗрдВ GET /path HTTP/1.x
(рд╣реЛрд╕реНрдЯ рдирд╛рдо рдЕрднреА рднреА рд╣реЛрд╕реНрдЯ рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдореЗрдВ рд╣реИ) рдФрд░ рд╕реНрдерд╛рдиреАрдп nginx рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рд╕рднреА https рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдмрд╛рдж рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛, http://host
http- рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рдерд╛, рдирдЧреАрдиреЗрдХреНрд╕ рдЙрдиреНрд╣реЗрдВ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред
PHP рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдмрджрд▓реЗ рдореЗрдВ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдореЗрдВ рд╡рд┐рдШрдЯрд┐рдд рдЕрдиреБрд░реЛрдз рдХреЛ рд╡рд╛рдкрд╕ рд▓рд╛рддреА рд╣реИ, рдЬреЛ fsockopen () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯрд╛рд░рдЧреЗрдЯ рд╕рд░реНрд╡рд░ (рдЗрд╕рдореЗрдВ SSL рд╕рдкреЛрд░реНрдЯ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдПрдХрддреНрд░рд┐рдд http рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рднреЗрдЬреА рдЬрд╛рддреА рд╣реИ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрдард╛рдИ рдЬрд╛рддреА рд╣реИ рдФрд░ рд╣реЗрдбрд░ ()) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдмреНрд░рд╛рдЙрдЬрд░ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЧреВрдВрдЬред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, https://github.com/eslachance/php-transparent-proxy рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд quitevelyne Lachance рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж (рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдХрд┐ рд╕рдВрджрд░реНрдн рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдЙрджреНрджреЗрд╢реНрдп рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХреЙрдкреА рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдерд╛)ред
рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВ-, URL , POST- , Content-Type тАФ php- , $_POST[] , , ( ). php 5.4 enable_post_data_reading тАФ off, 'php://input'. $_POST $_FILES, , , .
-, nginx , " " firefox . , . , . ( ), , .
. , host host/path ( php- ). , ( тАФ ). , . GET 200, тАФ . тАФ , , ( , ) content-type . : http-, content-type . , , , , , .
, , , .
( - , тАФ ).
3-4 - тАФ nginx php C.
( ), -, . https, - ( ), SSL - php .
OpenSSL. , , . , -, ( ), - ( ), - API OpenSSL ( ), API, ( ) ssl- ( , , ).
OpenSSL SSL, - API TLS, , , (, , , , ), ASN1. , API , RFC . .
SSL/TLS-
, , SSL/TLS, , , . : , , , . .
, (accept) , SSL/TLS, ( SSL/TLS-, ), , . http- https-, , .
, : , , .
ssl-server-wrapper
ssl-client-wrapper
. , тАФ , , SSL- , .
$ host ya.ru - ip-
ya.ru has address 87.250.250.242
$ ./ssl-client-wrapper
T/etc/ssl/certs/ca-certificates.crt - RootCA
C87.250.250.242:443/ya.ru - SNI
( , ):
DEBUG: cert[-1] subject = /C=RU/O=Yandex LLC/OU=ITO/L=Moscow/ST=Russian Federation/CN=*.yandex.az
DEBUG: cert[-1] issuer = /C=RU/O=Yandex LLC/OU=Yandex Certification Authority/CN=Yandex CA
DEBUG: cert[0] subject = /C=RU/O=Yandex LLC/OU=ITO/L=Moscow/ST=Russian Federation/CN=*.yandex.az
DEBUG: cert[0] issuer = /C=RU/O=Yandex LLC/OU=Yandex Certification Authority/CN=Yandex CA
DEBUG: cert[1] subject = /C=RU/O=Yandex LLC/OU=Yandex Certification Authority/CN=Yandex CA
DEBUG: cert[1] issuer = /C=PL/O=Unizeto Technologies S.A./OU=Certum Certification Authority/CN=Certum Trusted Network CA
DEBUG: cert[2] subject = /C=PL/O=Unizeto Technologies S.A./OU=Certum Certification Authority/CN=Certum Trusted Network CA
DEBUG: cert[2] issuer = /C=PL/O=Unizeto Sp. z o.o./CN=Certum CA
trusted
DEBUG: cert[-1] issued by cert[1]
DEBUG: cert[1] issued by cert[2]
DEBUG: cert[2]=cert[*0] was not issued by something from trusted-cert-store - chain incomplete, trying to recover
DEBUG: cache miss at ./cert-pin/cache/9nqv0qm41tlxyel95bbods0famxjagbx.0
DEBUG: downloading AIA issuer cert: http://repository.certum.pl/ca.cer
DEBUG: cert[*0] issued by cert[*1]
DEBUG: cert[*1] is self-signed, chain ended
, "Certum CA" Root CA, , (cert[2]) http://repository.certum.pl/ca.cer ; (cert[*1]), . , Root CA "Certum Trusted Network CA", .
:
DEBUG: check wildcard '*.yandex.az' against needed name 'ya.ru'
DEBUG: check wildcard '*.yandex.tm' against needed name 'ya.ru'
DEBUG: check wildcard '*.yandex.com.ua' against needed name 'ya.ru'
DEBUG: check wildcard '*.yandex.de' against needed name 'ya.ru'
DEBUG: check wildcard 'yandex.jobs' against needed name 'ya.ru'
DEBUG: check wildcard '*.yandex.net' against needed name 'ya.ru'
DEBUG: check wildcard '*.xn--d1acpjx3f.xn--p1ai' against needed name 'ya.ru'
DEBUG: check wildcard '*.yandex.com.ge' against needed name 'ya.ru'
DEBUG: check wildcard 'yandex.fr' against needed name 'ya.ru'
DEBUG: check wildcard '*.yandex.fr' against needed name 'ya.ru'
DEBUG: check wildcard 'yandex.kz' against needed name 'ya.ru'
DEBUG: check wildcard 'yandex.aero' against needed name 'ya.ru'
DEBUG: check wildcard '*.yandex.jobs' against needed name 'ya.ru'
DEBUG: check wildcard '*.yandex.ee' against needed name 'ya.ru'
DEBUG: check wildcard 'yandex.com' against needed name 'ya.ru'
DEBUG: check wildcard 'yandex.tm' against needed name 'ya.ru'
DEBUG: check wildcard 'yandex.ru' against needed name 'ya.ru'
DEBUG: check wildcard '*.yandex.ru' against needed name 'ya.ru'
DEBUG: check wildcard 'yandex.lv' against needed name 'ya.ru'
DEBUG: check wildcard '*.yandex.lt' against needed name 'ya.ru'
DEBUG: check wildcard 'yandex.az' against needed name 'ya.ru'
DEBUG: check wildcard 'yandex.net' against needed name 'ya.ru'
DEBUG: check wildcard 'yandex.lt' against needed name 'ya.ru'
DEBUG: check wildcard 'ya.ru' against needed name 'ya.ru'
:
DEBUG: protocol = TLSv1.2
DEBUG: cipher = ECDHE-RSA-AES128-GCM-SHA256
DEBUG: verify_result = 0
DEBUG: server_cert subject: /C=RU/O=Yandex LLC/OU=ITO/L=Moscow/ST=Russian Federation/CN=*.yandex.az
DEBUG: server_cert issuer: /C=RU/O=Yandex LLC/OU=Yandex Certification Authority/CN=Yandex CA
OK: connection to 87.250.250.242:443/ya.ru established
, http-
GET / HTTP/1.0
Host: ya.ru
Connection: close
HTTP/1.1 200 Ok
Accept-CH: Viewport-Width, DPR, Device-Memory, RTT, Downlink, ECT
Accept-CH-Lifetime: 31536000
(...)
, .
nginx , . , \r\n \n , , , Content-Length, . Chunked encoding тАФ , http-, .
, , тАФ , php, . ( , , ..), php- , , "" ( C PHP), " -" . ( ) "" "" include ( ).
, 2 . тАФ - ( ), , .
SSL/TLS-, ssl-telnet. - ( -), . , . OpenSSL ( , - ). .
- : ( ), ( ), (, , тАФ ). ( , ). , , .
- , , trusted root CA .
, , ssh port forwarding ( helpers/remote.c proxy.c "--proxy". . SSL/TLS , "" . , .
: , , , , raw- ( real-time ).
/etc/hosts : - , , .
, , , . ( , ), . " , тАФ ", . , , , " - ".
- тАФ , , . - ( offline.flag , ). , , , ( POST- ), , , тАФ .
, . , handle/inc.rewrite.c
dashboard ( ) .
./dashboard --basedir=/path/to/proxy/base --highlight --loop
. , , , , , . , - тАФ , " ".
(+)
(-) - OpenSSL
(+)
(+-) #define
(+-) IPv6
(-)
(-)
(-) Access-Control-Allow-Origin '*' тАФ .
(-) ,
(-) ( raw ) тАФ , localhost- , , - ( ) 10
/
C-, zlib ( gzip http-), openssl ( ssl-). Debian zlib1g-dev libssl-dev. () .
, ( ) (, Makefile, make) build-all.sh.
: fproxy/build2.sh, fproxy/config.h ( /etc/ssl/certs/ca-certificates.crt
). (helpers/) #define (config.h ), .
, , () . , ( ), тАФ , ( #define-). build-all.sh .
.
. prepare-dir.sh тАФ fproxy-target/ ( ).
тАФ ( fproxy-target/, prepare-dir.sh).
-. , , , . " " , root , 0640 0750. world-readable , , - , , MITM.
dashboard BASE/log/dashboard
.
127.0.0.10:3128. 127.0.0.10 ( ) , - .
тАФ , , .
: .
, , "-", . , .
тАФ (, , , ) , , .
, - .