This commit is contained in:
Atakan Özgün
2025-12-04 04:23:28 +03:00
parent 22ef96fc67
commit e152e6509b

63
main.go
View File

@@ -14,6 +14,7 @@ import (
"github.com/armon/go-socks5" "github.com/armon/go-socks5"
"github.com/libp2p/go-libp2p" "github.com/libp2p/go-libp2p"
dht "github.com/libp2p/go-libp2p-kad-dht" 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/network"
"github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/peer"
"github.com/libp2p/go-libp2p/p2p/discovery/routing" "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{} socksConf := &socks5.Config{}
socksServer, err := socks5.New(socksConf) socksServer, err := socks5.New(socksConf)
if err != nil { if err != nil {
@@ -122,9 +120,12 @@ func main() {
h.SetStreamHandler(protocolID, func(s network.Stream) { h.SetStreamHandler(protocolID, func(s network.Stream) {
fmt.Println("\n[->] Tünelden yeni bir internet isteği geldi!") 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. // HATA ÇÖZÜMÜ 1: Stream'i net.Conn uyumlu hale getiren Wrapper kullanıyoruz
socksServer.ServeConn(s) conn := StreamConn{Stream: s}
// Artık socksServer bunu kabul eder
socksServer.ServeConn(conn)
}) })
// Discovery Başlat // Discovery Başlat
@@ -132,17 +133,19 @@ func main() {
dutil.Advertise(ctx, routingDiscovery, *rendezvousString) dutil.Advertise(ctx, routingDiscovery, *rendezvousString)
fmt.Printf("[*] '%s' kanalında dinleniyor.\n", *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 != "" { if *proxyPort != "" {
// HATA ÇÖZÜMÜ 2: host.Host tipini doğru gönderiyoruz
go startLocalProxy(ctx, h, routingDiscovery, *rendezvousString, *proxyPort) go startLocalProxy(ctx, h, routingDiscovery, *rendezvousString, *proxyPort)
} }
select {} // Sonsuz bekleme select {}
} }
// startLocalProxy: Tarayıcıdan gelen trafiği yakalar ve tünele atar // startLocalProxy: HATA ÇÖZÜMÜ 3: h değişkeninin tipi 'host.Host' olarak düzeltildi
func startLocalProxy(ctx context.Context, h network.Network, discovery *routing.RoutingDiscovery, rendezvous, port string) { func startLocalProxy(ctx context.Context, h host.Host, discovery *routing.RoutingDiscovery, rendezvous, port string) {
fmt.Println("------------------------------------------------") fmt.Println("------------------------------------------------")
fmt.Printf("[CLIENT MODU] Yerel Proxy Başlatıldı: 127.0.0.1:%s\n", port) 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.") 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 var targetPeer peer.AddrInfo
found := false found := false
// 1. Çıkış Düğümü Bul (Sadece bir tane bulmak yeterli) // 1. Çıkış Düğümü Bul
for !found { for !found {
peerChan, err := discovery.FindPeers(ctx, rendezvous) peerChan, err := discovery.FindPeers(ctx, rendezvous)
if err != nil { if err != nil {
panic(err) panic(err)
} }
for p := range peerChan { for p := range peerChan {
if p.ID == h.LocalPeer() { if p.ID == h.ID() { // LocalPeer yerine h.ID() kullandık
continue continue
} }
// Bulunan kişiye bağlanmayı dene // HATA ÇÖZÜMÜ 4: DialPeer yerine Connect kullanıyoruz
if err := h.DialPeer(ctx, p.ID); err == nil { if err := h.Connect(ctx, p); err == nil {
fmt.Printf("[+] Çıkış Düğümü Bulundu ve Bağlandı: %s\n", p.ID) fmt.Printf("[+] Çıkış Düğümü Bulundu ve Bağlandı: %s\n", p.ID)
targetPeer = p targetPeer = p
found = true 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) listener, err := net.Listen("tcp", ":"+port)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
for { for {
// Tarayıcıdan gelen isteği kabul et
conn, err := listener.Accept() conn, err := listener.Accept()
if err != nil { if err != nil {
log.Println("Accept hatası:", err) log.Println("Accept hatası:", err)
continue continue
} }
// Her yeni istek için tünel üzerinden yeni bir stream aç
go func(browserConn net.Conn) { go func(browserConn net.Conn) {
defer browserConn.Close() 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) stream, err := h.NewStream(ctx, targetPeer.ID, protocolID)
if err != nil { 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 return
} }
defer stream.Close() defer stream.Close()
// Veriyi İki Yönlü Kopyala (Pipe)
// Browser -> Tünel -> Arkadaş -> İnternet
// İnternet -> Arkadaş -> Tünel -> Browser
var wg sync.WaitGroup var wg sync.WaitGroup
wg.Add(2) wg.Add(2)
@@ -219,4 +217,21 @@ func startLocalProxy(ctx context.Context, h network.Network, discovery *routing.
wg.Wait() wg.Wait()
}(conn) }(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}
} }