sprawdzenie czy podlaczone ip jest zewnetrzne czy wewnetrzne

0

Jak w temacie, potrzebuje sprawdzic czy podlaczone ip jest zewnetrzne czy wewnetrzne. Znalazlem taka klase Inet4Address ale nie za bardzo rozumiem jej api.

0

Co masz na myśli pisząc ip zewnętrzne / ip wewnętrzne?

0

Teoretycznie można sprawdzić to tylko na podstawie samego adresu IP. Wystarczy wiedzieć jak działa adresowanie i maski oraz znać kilka podstawowych wyrażeń regularnych. Najprostsze reguły dla połączeń wewnętrznych:

/$192\.168\.\d{1,3}\.\d{1,3}^/
/$127\.0{1,3}\.0{1,3}\.0{0,2}1^/

pierwsze to adresy sieci wewnętrznej drugie to pętla lokalna

0

hm hm nie wiem czy to rozwiazuje moj problem. Wystawiam serwer na jakims tam komputerze z ip zewnetrznym i chce na nim sprawdzac czy ip z ktorego klient sie podlacza (do tego serwera) jest zewnetrzne czy wewnetrzne.

0
ServerSocket ss = ...
Socket s = ss.accept();
InetAddress ia = s.getInetAddress();
String ias = ia.getHostAddress();

i masz stringa, ktorego mozesz sprawdzic wyrazeniami tak jak napisal @koziolek.
Pamietaj tylko ze InetAddress tak na prawde bedzie podklasa typu Inet4Address lub Inet6Address - oba by wymagaly osobnego zestawu regexow i testu instanceof zeby odroznic.

0

Dodam, że nieroutowalne, czyli lokalne adresy obejmują też grupę adresów 10.x.y.z.
Poza tym wydaje mi się, że tylko pakiety z adresów publicznych mogą krążyć po internecie. Jeżeli adres jest wewnętrzny, to po wydostaniu się do internetu jako jego nadawca zapisany jest chyba host, który przetłumaczył adres wewnętrzny na zewnętrzny. Podobnie z pakietami wracającymi - to host musi je z powrotem przetłumaczyć na adres wewnętrzny i wysłać już po sieci lokalnej.

0

dokladnie mi o to chodzi. Implementuje sieć p2p i musze rozróżnić czy ktoś mi się nie podpina zza routera.

0

Wszystko sie zgadza (dodam ze rowniez adresy 172.16.x.x do ilustam sa prywatne).
Jesli jestes za routerem we wlasnej sieci lokalnej, to mozna sie do Twojego serwera podlaczyc za pomoca 2 ip: prywatnego, no bo w koncu kompy w sieci wewnetrznej sie widza; oraz publicznego (o ile jest routowanie pakietow z routera do tego serwera). Z calej reszty swiata mozna tylko sie polaczyc za pomoca ip publicznego.
Ty mozesz sprawdzic czy ktos sie laczyl z prywatnego ip w twojej sieci lokalnej. Jesli ktos z jakiejs innej sieci jest za natem, i ma adres prywatny, to gdy jego pakiet wyjdzie na swiat to router zmieni jego ip zrodlowy na swoj (czyli publiczny adres routera natujacego).Czyli jestes w stanie sprawdzic tylko i wylacznie czy jakis komputer laczy sie z Twojej sieci lokalnej na twoj ip z sieci lokalnej. Jesl ktos uzywa twojego ip publicznego, to jest pewnoe ze adres jaki dostaniesz uzywajac opisanej wyzej serii metod bedzie rowniez publiczny.
Pozdro.

0

Idac tym tokiem rozumowania - moglbym (piszac aplikacje klienta korzystajaca z tego serwera) wymusic by klient sprawdzal ip stacji na ktorej jest uruchomiony i to ip wysylac do serwera. Na serwerze sprawdzac zakresy i przypisywac klientowi czy ma ip zewnetrzne czy wewnetrzne.

Zakladam ze serwer bedzie postawiony na ip zewnetrznym wiec czesc przypadkow odpada.

0

Albo ja nie rozumiem, albo ty nie przeczytales dokladnie mojego postu, albo ja zle go napisalem (czesto sie zdarza, nie mam daru przekazywania informacji :-()
Nie odpada Ci zadna czesc przypadkow moim zdaniem - mowisz ze serwer jest na IP zewnetrznym - no ale jesli jakis klient bedzie w tej samej sieci, za tym samym NATem, to moze sie odwolac do serwera po IP wewnetrznym, chyba ze wytniesz taka mozliwosc firewallem, ale nie mozesz ufac ze kazdy kto bedzie chcial uzywac tego serwera to zrobi / bedzie wiedzial jak to zrobic. Klient ktory bedzie za NATem ale innej sieci lokalnej niz Twoja, nigdy nie bedzie mial IP wewnetrznego, zawsze bedziesz widzial je jako IP zewnetrzne jego routera.

0

Co do wymuszania aby klient sprawdzal swoj IP i wysylal je do serwera to troche bez sensu - ip jakie dostanie taki klient bedzie albo zewnetrzne, jesli nie jest za NATem, albo wewnetrzne jesli jest. Teraz ty chcesz wyslac to IP serwerowi, aby serwer na jego podstawie sprawdzic co i jak. Ale co to da? Jesl ktos jest za NATEem (serwer dostanie ip np 192.168.1.100), ale ma dobrze skonfigurowane wszystko (forward portow itp) to wszystko bedzie smigac. Nie wiem co chcesz przez to osiagnac. Poza tym, nawet jesli klient jest za NATem, wysle taki prywatny IP serwerowi, ten zobaczy ze klient ma IP prywatne, to tak czy tak to IP wewnetrzne bedzie w pakietach zmienione na zewnetrze gdy pakiet bedzie wychodzil na swiat.

0

hm to moze w takim razie macie jakies pomysly jak powinna zachowywac sie aplikacja p2p gdy ktos chce pobrac dane z drugiego klienta w przypadku gdy ten jest za zle skonfigurowanym natem i nie moze mu żądanych danych wysłać. W dc++ jest rozrozniony tryb active i passive, od pasywnego nie mozna za bardzo sciagac ( tyle ze trzeba sie doszukac ze jest pasywny bo aplikacja o tym jawnie przy probie sciagania nie ostrzega). Ja chcialbym o takiej sytuacji uzytkownika powiadomic.

0

Chyba się razem nie rozumiecie. Pomper napisał tylko, że jego serwer dowie się o tym, że klient jest za jakimś NATem tylko i wyłącznie od tego klienta. Nawet nie ma większego znaczenia czy w tej samej sieci czy w innej bo jeżeli w tej samej, to serwer może sobie sprawdzić po ip, że jest w tej samej, a jeżeli w innej, to bez pomocy samego klienta serwer nigdy się nie dowie, że klient ma lokalnie adres nie routowalny. Tylko z tego powodu, że ramki przychodzące z poza własnej sieci serwera na pewno będą miały adresy routowalne, czyli publiczne.

0

hm to moze w takim razie macie jakies pomysly jak powinna zachowywac sie aplikacja p2p gdy ktos chce pobrac dane z drugiego klienta w przypadku gdy ten jest za zle skonfigurowanym natem

Zobacz jak robia to inne klienty. Np moj kTorrent, jesli mam cos zepsute, ma mala ikonke za znakiem STOP i tooltip pokazuje: "No incomming connections, possibly NAT-ed". Podobnie eMule - laczysz sie do serwera centralnego, i on sprawdza jakimstam algorytmem twoj status - jesli cos jest nie tak, twoj klient dostaje status LowID, co oznacza, ze inni klienci moga sie do Ciebie polaczyc tylko za posrednictwem serwera centalnego, co jest malo wydajne, dlatego niektore serwery ed2k nie zezwalaja na podlaczanie sie takich klientow. Podobnie przesylanie plikow w gg - jesli ktos chce komus wyslac plik, to gg ma takie mini p2p (osobny port, 8076 domyslnie chyba czy cos takiego) - jesli nie mozesz wyslac bo sie nie chce laczyc, to dostajesz komunikat i tyle. Zauwaz ze wszyscy uzywaja slow: "possibly", "probably" itp. Jak cos nie idzie to nie ma pewnosci ze ten co ma namotane jest za natem, moze byc zupelnie inna przyczyna.

Mozesz to rozwiazac np tak, ze jak klient sie polaczy do innego, to ten z kolei moze wziac jego ip i sprobowac sie polaczyc z nim. Jesli sie uda to cool (aktywny), jesli nie to zle (pasywny), i za pomoca pierwszego polaczenia mozesz wysal temu klientowi informacje ze (byc moze) jest za natem i musi sie poprawic. Nalezy zauwazyc ze s tej samej sieci lokalnej kompy nie powinny miec zadnego problemu nat, cczy nie nat.
Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1