Selam elimde bir kod var fakeip diye yazmış yazan siteye giren kişinin ipini nasıl çekerim bu kodu bana düzeltebilirmisiniz.
<? function fakeip(){ return long2ip( mt_rand(0, 65537) * mt_rand(0, 65535) ); } function Get_File($url) { $timeout = 30; $cerez = "cookie.txt"; $useragent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0"; $headers = array( 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Cache-Control: private, max-age=0', 'Connection: keep-alive', 'Keep-Alive: 115', 'Accept-Language: en-US;q=0.6,en;q=0.4', ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, array("REMOTE_ADDR: ".fakeip(),"X-Client-IP: ".fakeip(),"Client-IP: ".fakeip(),"HTTP_X_FORWARDED_FOR: ".fakeip(),"X-Forwarded-For: ".fakeip())); curl_setopt($ch, CURLOPT_USERAGENT, $useragent); curl_setopt($ch, CURLOPT_COOKIEJAR, $cerez); curl_setopt($ch, CURLOPT_COOKIEFILE, $cerez); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($ch, CURLOPT_AUTOREFERER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 15); $data = curl_exec($ch); curl_close($ch); return $data; }
Yardımcı olacak üstatlarıma şimdiden teşekkürler
Can sıkıntısından bir cevap yazayım devamına katılamam muhtemelen ;
Öncelikle IP adresleri
255.255.255.255 -> 2^8 x 2^8 x 2^8 x 2^8 kombinasyona sahiptir (v4 için söylüyorum) bu kombinasyon kapsamında
http://www.ipaddressguide.com/ip
0.0.0.1 ip adresinin decimal değeri 1
255.255.255.255 ip adresinin decimal değeri 4294967295 dir . yani (2^8)^4 değerine eşittir.
IP adresleri matematiksel olarak bu şekilde oluşturulur.
Ilk fonksiyonun :
function fakeip(){ return long2ip( mt_rand(0, 65537) * mt_rand(0, 65535) ); }
2^16 * 2^16 = 2^32 = (2^8) ^4 yani dünyadaki 0.0.0.0 dan 255.255.255.255 e kadar ip adreslerinin decimal değerinden herhangi birini seç ve bunu ip ye çevir demiş ;
return long2ip ( random bir değer seç : 4294967295 içinden ) örnek 1283432323 seçti diyelim
https://www.browserling.com/tools/dec-to-ip adresinden bakarsan çevirdiği ip : 76.127.159.131
peki bu arkadaş bunla ne yapmış ;
curl_setopt($ch, CURLOPT_HTTPHEADER, array("REMOTE_ADDR: ".fakeip(),"X-Client-IP: ".fakeip(),"Client-IP: ".fakeip(),"HTTP_X_FORWARDED_FOR: ".fakeip(),"X-Forwarded-For: ".fakeip()));
siteler cloudflare gibi servislerden geçtiği sırada şu şekilde çalışır :
Siz ----> (Sizin IP adresiniz) cloudflare ----------> (Cloudflare ip adresi) sunucu
ancak sunucu ziyaretçilerin ip sini bilmek ister. Cloudflare kendi ipsi yerine sizin ip adresiniz ile istek açsa cevap size döner o da TCP protokolunde bir trafiğin tamamlanmasına müsade etmez ;
Çünkü TCP de
SYN client gönderdiğinde Sunucu ACK cevaplar Client tekrar SYN ACK gönderir bu paketler gönderilirken SYN paketinde Sequnece numarası vardır geriye Sequence numarasına + paket içindeki veri kadar eklenerek Acknowledgement numarasında geri almak ister ve sunucu ACK paketini gönderirken random bir sequence numarası ekler .
Bu sebep ile cloudflare sizin ip niz ile cagrıyı sunucuya iletirise sunucu sizin cloudflare ile aranızdaki siz de cloudflare ile sunucu arasındaki paketlerde yer alan seq / ack_seq numaralarını beklemediğiniz ve bilmediğiniz için protokol kötü trafik olarak dökülecektir.
Bu durumda cloud flare gibi proxyler sitelere sizin ip bilginizi :
curl_setopt($ch, CURLOPT_HTTPHEADER, array("REMOTE_ADDR: ".fakeip(),"X-Client-IP: ".fakeip(),"Client-IP: ".fakeip(),"HTTP_X_FORWARDED_FOR: ".fakeip(),"X-Forwarded-For: ".fakeip()));
bu şekilde Client-ıp / x-client-ip / x-forward-for şeklinde iletir. Sunucu da buradan aaaaaaa arkadaş client bu ama istek proxyden geliyor der. Ziyaretçi ip si olarak paketin içindeki bu header daki ip yi kaydeder ama cevabı proxy e verir
Sizin yazdığınız kod ile acılan istek de sunucu sizi Proxy sanacaktır cloudflare gibi ama ziyaretçi olarak random seçilen ip yi kaydedecektir böylece sunucuda kendi ip iziniz kalmayacak.
Kod bu işe yarıyor paylaştığınız
Bilemiyorum açıklayıcı oldumu ama bu konuya bir ansiklopedi yazılır

o yüzden soru çok açık cevap vermek zor
Edit :
Burada peki sunucu kime cevap verecek nasıl seçiyor diyen olursa ;
PHP bir yazılım dili ve framework dür ona paketi apache / nginx / litespeed / IIS vs iletir. PHP zaten bağlanan ipye değil paket içindeki veriye bakar.
TCP paketleri
Head room + Ethernet Options + IP Options + TCP Options + Payload + Tail room
şeklinde oluşutur . php sadece payload ile ilgilienir
Apache ise IP optionsdan source / destination ip ve tcp options dan dinlediği porta gelen istekleri TCP optionsdan okuyup kaydeder örnek :
37.123.98.12 : 5670 -> 88.12.33.33:80 portuna gelen istek
IP : TCP.OPT -> IP.TCP.opt içerisinde yer alır ve açık 5670 portuna cevabı php işini bitirince geri verir :
88.12.33.33:80 -> 37.123.98.12 : 5670 şeklinde
bu yuzden trafik karışmadan , gerçek bir protokol el sıkışması ile yukarıdaki method sizi sunucuya fake tanıtır
Ama amatörler kanar profesyoneller bunu yemez