Guida Startare con i 40k anche in casa! (ROUTER & HAMACHI!)

Stato
Discussione chiusa ad ulteriori risposte.

XenoZanza

Utente Silver
26 Dicembre 2008
27
2
17
67
Ultima modifica:
Salve a tutti.
Questa guida nasce per divulgare la soluzione per "startare" un "server" in casa utilizzando i files 40k, e far connettere con successo la gente sia dall'esterno che dall'interno!

UPDATE 1:
- IL TUTTO FUNZIONA ANCHE SU SERVER HAMACHI!!


PREMESSA & REQUISITI FONDAMENTALI:
- avere i files 40k con relativa source e saper compilare tale source in modo da produrre il relativo file "game";
- avere un router al quale ci si può connettere via telnet;
- aver sbloccato tutte le porte relative ai propri files (standard 11002, 13000, 13099) sul router;
- NON CONFERMATO: aver messo in DMZ l'ip locale del proprio server;
- un pizzico di pazienza e attenzione!
Inoltre questa è una prima versione della guida, che in futuro potrebbe ricevere aggiornamenti per rendere il tutto più modulare e facile da attuare.
Detto questo, SI COMINCIA!

IL PROBLEMA:
come ben sappiamo tutti, i files 40k sono utili solo in dedicato (o in locale), poichè comportano problemi vari di collegamento dati dal funzionamento dei pacchetti scambiati fra client e server.
In parole povere il server invia al client un pacchetto con l'ip a cui connettersi, che però è locale e quindi dall'esterno non può essere raggiunto.
Cosa comporta ciò? Che viene recisa la possibilità di connettersi dall'esterno, risultando nel fastidiosissimo e famosissimo problema del: SCELTA DEL PG E SUBITO DOPO CRASH (o KICK) ALLA SCHERMATA DI LOGIN!
Cercando sull'internet, possiamo trovare mille soluzioni, quella di applicare dif (cosa che ormai, reputo obsoleta e inattualizzabile data la variegata varietà di files server in circolazione), modificare i sorgenti e magari mettere il bind_ip o il parametro -I al file game. Ebbene (forse sarà solo un problema mio, ma dubito estremamente in quanto ho provato su varie reti etc) tutto ciò non funziona, alcune volte il problema non viene risolto, altre il problema funziona al contrario, ovvero da locale non riesco a connettermi ma da esterno sì, altre invece manco riesce ad avviarsi il game, restituendo l'errore can't connect to socket...
Perfetto, se il problema è vostro, seguite questa guida, testata e funzionante!

TERMINOLOGIA USATA NELLA GUIDA:
Ip Wan, Indirizzo ip esterno, indirizzo ip pubblico = l'ip che ti restituisce il sito http://www.mio-ip.it/
indirizzo ip locale = l'ip LOCALE del server, che ottengo con il comando ifconfig in ambiente freebsd
indirizzo gateway, indirizzo locale del router = generalmente 192.168.1.1, è l'indirizzo locale del vostro router

EBBENE FINALMENTE SI INIZIA:

perfetto, ora si comincia!
Iniziamo subito a recuperare l'ip esterno (o ip pubblico) e salviamocelo, ci servirà durante tutta la durata del processo.
Ora andiamo nei source del game (DIRECTORY DELLE SOURCE\Server\game\src) e apriamo il file
desc_client.cpp
cerchiamo questo codice:
Codice:
if (!bSentBoot)
{
bSentBoot = true;
TPacketGDBoot p;
p.dwItemIDRange[0] = 0;
p.dwItemIDRange[1] = 0;
memcpy(p.szIP, g_szPublicIP, 16);
DBPacket(HEADER_GD_BOOT, 0, &p, sizeof(p));
}
}

TEMP_BUFFER buf;

TPacketGDSetup p;

memset(&p, 0, sizeof(p));
strlcpy(p.szPublicIP, g_szPublicIP, sizeof(p.szPublicIP));
e lo modifichiamo in questo modo:
Codice:
if (!bSentBoot)
{
bSentBoot = true;
TPacketGDBoot p;
p.dwItemIDRange[0] = 0;
p.dwItemIDRange[1] = 0;
memcpy(p.szIP, "MIO IP ESTERNO", 16);
DBPacket(HEADER_GD_BOOT, 0, &p, sizeof(p));
}
}

TEMP_BUFFER buf;

TPacketGDSetup p;

memset(&p, 0, sizeof(p));
strlcpy(p.szPublicIP, "MIO IP ESTERNO", sizeof(p.szPublicIP));
In alternativa, in caso usaste server hamachi, basta mettere il vostro ip completo (non il .100) al posto di MIO IP ESTERNO.
il mio ip esterno è quello ottenuto dal sito http://mioip.it, mi raccomando le virgolette sono NECESSARIE
questo sarà un esempio:
if (!bSentBoot)
{
bSentBoot = true;
TPacketGDBoot p;
p.dwItemIDRange[0] = 0;
p.dwItemIDRange[1] = 0;
memcpy(p.szIP, "90.250.5.203", 16);
DBPacket(HEADER_GD_BOOT, 0, &p, sizeof(p));
}
}

TEMP_BUFFER buf;

TPacketGDSetup p;

memset(&p, 0, sizeof(p));
strlcpy(p.szPublicIP, "90.250.5.203", sizeof(p.szPublicIP));
PER GLI UTENTI DI HAMACHI: la guida per voi finisce qui, compilate e startate! E tutto funzionerà senza altre modifiche! Ricordatevi solo di aver aperto le porte col PortMap
Perfetto, ora compiliamo il tutto, e se proviamo a startare, scopriremo amaramente che adesso il problema è l'inverso, ovvero gli esterni si riescono a collegare, ma io non riesco!! --PERCHE'?
Perchè adesso bisogna impostare il nat loopback in modo tale permettere di reindirizzare il collegamento al mio ip pubblico sull'ip locale del mio server!
In alcuni router è possibile attivare questa funzione semplicemente andando nelle configurazioni che troviamo se digitiamo l'ip del router nella barra indirizzi di un qualsiasi browser.
Per la maggior parte di router domestici, ciò non è attuabile, per cui procuratevi un client telnet (PuTTY) e collegatevi all'ip del router, dopodichè effettuate il login compilando le informazioni che vi verranno richieste (id e pass, di solito admin admin).
A questo punto digitate
Codice:
sh
la shell cambierà e vi ritroverete in un ambiente simil-linux dove potrete inviare vari comandi e controllare varie cose, ma a noi interessa solo inviare il comando iptables ben parametrizzato, e cioè:
Codice:
iptables -t nat -A POSTROUTING -d 192.168.1.150 -s 192.168.1.0/24 -j SNAT --to-source 192.168.1.1
iptables -t nat -A PREROUTING -d 90.250.5.203 -m tcp -p tcp -j DNAT --to-destination 192.168.1.16
dove:
192.168.1.1 è l'indirizzo gateway (il router in poche parole),
192.168.1.16 è l'indirizzo locale del mio server,
90.250.5.203 è l'indirizzo WAN, ovvero l'indirizzo pubblico (quello che si ottiene andando su mioip)
CAMBIATE OVVIAMENTE CON I VOSTRI INDIRIZZI!!!
premuto invio avremmo risolto il problema! Chiudiamo quindi il client telnet.
Ora tutto funziona, startate il server, e connettetevi con estrema soddisfazione e tranquillità, ovviamente nel serverinfo dovete mettere il vostro IP PUBBLICO!

Ora l'unico problema che potrebbe presentarsi è il post riavvio del router - cambio ip pubblico, se riavvierete il router o cambierete ip pubblico dovrete rimodificare il file desc_client.cpp e rinviare i comandi al router per aprire il nat loopback!
Tempo permettendo, in futuro, vorrei fare una modifica nel desc_client che aggiorna il tutto in automatico, e magari anche una modifica per inviare i comandi iptables all'avvio.
Spero vivamente di aver aiutato tutti coloro che hanno questo fastidioso e bestemmiante problema!!
Il tutto è il risultato di giorni di prove e test. Il tutto è inoltre testato e funzionante.
Ho usato un pc proprio dedicato solo all'host del server di gioco, senza virtual machine, però il tutto dovrebbe funzionare senza problemi se si utilizza una virtual machine in modalità di rete bridge, poichè simula esattamente un computer collegato direttamente al router.
Il router utilizzato è un D-LINK DSL-2740B F1, dovrebbe funzionare con tutti i router, tranne, penso, quelli tipo vodafone station, telecom etc, percui vi invito di cercare guide per entrare nella shell del router.

Un ringraziamento va anche fatto a ErNabbone, che mi ha supportato in questo abisso! :)

Se dopo aver riletto almeno 2 volte suddetta guida, non riusciate a fare qualche passaggio, sarò lieto di aiutarvi nei limiti delle mie capacità!
Detto questo, un bel salutone a tutti!
 
Non so se è solo un mio problema ma inserendo l'IP di hamachi non riesco a compilare. Inserendo l'IP pubblico si. È normale? Se vi si riuscisse, sarebbe comodo in quanto l'IP resterebbe invariato. Sbaglio?

Grazie per la guida, felice che questa sia stata pubblicata da un utente di questo forum. :D
 
  • Mi piace
Reazioni: @@@
Hai controllato di averlo inserito bene rispettando le virgolette? In teoria ci puoi mettere qualsiasi ip e dovrebbe compilare, il problema te lo darà poi quando lo starti!
 
Non so se è solo un mio problema ma inserendo l'IP di hamachi non riesco a compilare. Inserendo l'IP pubblico si. È normale? Se vi si riuscisse, sarebbe comodo in quanto l'IP resterebbe invariato. Sbaglio?

Grazie per la guida, felice che questa sia stata pubblicata da un utente di questo forum. :D

Che errore ti da il compilatore?
 
Ultima modifica:
Ora sono riuscito a compilare, prima mi dava errore "client_desc.o" e mi sparivano delle librerie dalla cartella OBJDIR.
Ho alcune domande : Nel caso si starti con una VM, come IP locale dovrò inserire quello della scheda impostata? Es. Scheda loopback, Hamachi, NOIP?
Nel FILEGAME va inserito per intero e successivamente nei comandi shell va inserito quello di hamachi con .100 e pubblico senza .100?

Ps: 192.168.1.150 questo che IP è?
 
Per l'hamachi non saprei, però in linea di massima dovrebbe essere così, prova appunto con l'ip completo come ip esterno/pubblico, e per il locale con .100! Quell'ip lascialo così com'è, in teoria non dovrebbe cambiarti nulla.
 
Grazie! Sto cercando di mettere in pratica la guida, purtroppo ho il problema della vodafon station che non permette il telnet.
Che si possibile sfruttare l'opzione: NAT Statico Host?
Oppure la Port Forwarding?
 
Cerca qualche guida, perchè dovrebbe essere possibile sbloccare il telnet! Comunque il port forwarding è l'azione che fai per aprire le porte all'esterno, se non erro con gli hamachi si usa ancora PortMap, perchè sul router non credo ti faccia mettere l'ip hamachi, riguardo invece per quanto riguarda l'opzione NAT Statico Host, sinceramente, non so cosa significhi, hai provato ad accedere al pannello ma in lingua inglese?
 
Al momento sembra non ci sia possibilità di sblocco della station che monta il mio firmware.
Ho anche un modem tp-link, ma a quanto pare con vodafone utilizza una key per le connessioni.
Risolto un problema ne sorge uno nuovo...
 
Prova comunque, ora che ci penso, a rigor di logica, per configurare il loopback con hamachi la procedura non deve per forza passare al router, magari si può fare qualcosa in locale
 
Appena accedo di nuovo al pc ti aggiorno. Nel caso, più tardi, ti addo a Skype se per te non ci sono problemi. (Nel caso mandami il tuo nome su skype). Grazie per l'aiuto.
 
Bravissimo Xeno...appena torno a casa vedo se riesco a modificare il source modo tale che l'indirizzo ip lo configuri da CONFIG modo tale che, se cambia l'IP (nel caso si ha un IP dinamico) basta cambiare il parametro nel CONFIG e startare.
 
  • Mi piace
Reazioni: Hik
Per chi vuole l'opzione nel config:
Utilizzo:
Codice:
CONNECTION_IP: Ip Esterno della guida

Game\config.cpp
Vai alla linea 56 e aggiungi:
Codice:
char        g_ipfix[16] = "0";
Vai alla linea 1169 e aggiungi:
Codice:
    TOKEN("connection_ip")
     {
       strlcpy(g_ipfix, value_string, sizeof(g_ipfix));
     }
Game\config.h
Vai alla linea 56 e aggiungi:
Codice:
extern char     g_ipfix[16];
Game\desc_client.cpp
Vai alla linea 149 e sostituisci:
Codice:
memcpy(p.szIP, g_szPublicIp, 16);
con:
Codice:
memcpy(p.szIP, g_ipfix, 16);
Vai alla linea 159 e sostituisci:
Codice:
strlcpy(p.szPublicIP, g_szPublicip, sizeof(p.szPublicIP));
con:
Codice:
strlcpy(p.szPublicIP, g_ipfix, sizeof(p.szPublicIP));

(Chiedo scusa se ho risposto dopo 4 mesi, forse avrei dovuto fare un nuovo post)
 
  • Mi piace
Reazioni: Hik
Stato
Discussione chiusa ad ulteriori risposte.