change
This commit is contained in:
63
main.go
63
main.go
@@ -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}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user