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:
e lo modifichiamo in questo modo:
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:
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
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è:
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!
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));
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));
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));
{
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));
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
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
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!