diff --git a/main.go b/main.go index a66612b..39ae74d 100644 --- a/main.go +++ b/main.go @@ -14,6 +14,7 @@ import ( "github.com/armon/go-socks5" "github.com/libp2p/go-libp2p" dht "github.com/libp2p/go-libp2p-kad-dht" + "github.com/libp2p/go-libp2p/core/host" // EKLENDİ "github.com/libp2p/go-libp2p/core/network" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/p2p/discovery/routing" @@ -109,11 +110,8 @@ func main() { } // ========================================== - // ROLLERE GÖRE AYRIŞMA (SERVER vs CLIENT) + // SERVER (EXIT NODE) MANTIĞI // ========================================== - - // EXIT NODE (SERVER) MANTIĞI: - // Gelen tüm stream isteklerini SOCKS5 sunucusuna yönlendir. socksConf := &socks5.Config{} socksServer, err := socks5.New(socksConf) if err != nil { @@ -122,9 +120,12 @@ func main() { h.SetStreamHandler(protocolID, func(s network.Stream) { fmt.Println("\n[->] Tünelden yeni bir internet isteği geldi!") - // Gelen libp2p akışını doğrudan SOCKS5 sunucusuna teslim et - // SOCKS5 sunucusu internete bağlanıp cevabı stream'e geri yazacak. - socksServer.ServeConn(s) + + // HATA ÇÖZÜMÜ 1: Stream'i net.Conn uyumlu hale getiren Wrapper kullanıyoruz + conn := StreamConn{Stream: s} + + // Artık socksServer bunu kabul eder + socksServer.ServeConn(conn) }) // Discovery Başlat @@ -132,17 +133,19 @@ func main() { dutil.Advertise(ctx, routingDiscovery, *rendezvousString) fmt.Printf("[*] '%s' kanalında dinleniyor.\n", *rendezvousString) - // CLIENT (KULLANICI) MANTIĞI: - // Eğer -proxy 1080 bayrağı verildiyse, yerel portu dinle ve trafiği tünele at. + // ========================================== + // CLIENT (KULLANICI) MANTIĞI + // ========================================== if *proxyPort != "" { + // HATA ÇÖZÜMÜ 2: host.Host tipini doğru gönderiyoruz go startLocalProxy(ctx, h, routingDiscovery, *rendezvousString, *proxyPort) } - select {} // Sonsuz bekleme + select {} } -// startLocalProxy: Tarayıcıdan gelen trafiği yakalar ve tünele atar -func startLocalProxy(ctx context.Context, h network.Network, discovery *routing.RoutingDiscovery, rendezvous, port string) { +// startLocalProxy: HATA ÇÖZÜMÜ 3: h değişkeninin tipi 'host.Host' olarak düzeltildi +func startLocalProxy(ctx context.Context, h host.Host, discovery *routing.RoutingDiscovery, rendezvous, port string) { fmt.Println("------------------------------------------------") fmt.Printf("[CLIENT MODU] Yerel Proxy Başlatıldı: 127.0.0.1:%s\n", port) fmt.Println("Tarayıcının SOCKS5 ayarını buraya yönlendir.") @@ -152,18 +155,18 @@ func startLocalProxy(ctx context.Context, h network.Network, discovery *routing. var targetPeer peer.AddrInfo found := false - // 1. Çıkış Düğümü Bul (Sadece bir tane bulmak yeterli) + // 1. Çıkış Düğümü Bul for !found { peerChan, err := discovery.FindPeers(ctx, rendezvous) if err != nil { panic(err) } for p := range peerChan { - if p.ID == h.LocalPeer() { + if p.ID == h.ID() { // LocalPeer yerine h.ID() kullandık continue } - // Bulunan kişiye bağlanmayı dene - if err := h.DialPeer(ctx, p.ID); err == nil { + // HATA ÇÖZÜMÜ 4: DialPeer yerine Connect kullanıyoruz + if err := h.Connect(ctx, p); err == nil { fmt.Printf("[+] Çıkış Düğümü Bulundu ve Bağlandı: %s\n", p.ID) targetPeer = p found = true @@ -175,35 +178,30 @@ func startLocalProxy(ctx context.Context, h network.Network, discovery *routing. } } - // 2. Yerel TCP Portunu Dinle (Örn: 1080) + // 2. Yerel TCP Portunu Dinle listener, err := net.Listen("tcp", ":"+port) if err != nil { log.Fatal(err) } for { - // Tarayıcıdan gelen isteği kabul et conn, err := listener.Accept() if err != nil { log.Println("Accept hatası:", err) continue } - // Her yeni istek için tünel üzerinden yeni bir stream aç go func(browserConn net.Conn) { defer browserConn.Close() - // Çıkış düğümüne stream aç + // HATA ÇÖZÜMÜ 5: Artık h host.Host olduğu için NewStream 3 argümanı kabul eder stream, err := h.NewStream(ctx, targetPeer.ID, protocolID) if err != nil { - log.Println("Tünel açma hatası (Arkadaşın düştü mü?):", err) + log.Println("Tünel açma hatası:", err) return } defer stream.Close() - // Veriyi İki Yönlü Kopyala (Pipe) - // Browser -> Tünel -> Arkadaş -> İnternet - // İnternet -> Arkadaş -> Tünel -> Browser var wg sync.WaitGroup wg.Add(2) @@ -219,4 +217,21 @@ func startLocalProxy(ctx context.Context, h network.Network, discovery *routing. wg.Wait() }(conn) } +} + +// ========================================== +// HATA ÇÖZÜMÜ: Wrapper (Kapsayıcı) Struct +// libp2p Stream'ini net.Conn gibi davranmaya zorlar. +// ========================================== +type StreamConn struct { + network.Stream +} + +// SOCKS5 kütüphanesi bu metodları arar, biz de sahte/boş cevaplar döneriz. +func (c StreamConn) LocalAddr() net.Addr { + return &net.TCPAddr{IP: net.IPv4zero, Port: 0} +} + +func (c StreamConn) RemoteAddr() net.Addr { + return &net.TCPAddr{IP: net.IPv4zero, Port: 0} } \ No newline at end of file