PDA

View Full Version : [JAVA] Firewall


Dyd87
09-01-2009, 16:57
Salve a tutti
Dopo aver letto questo interessante articolo
http://www.kosmous.com/risorse/articolo.php?id=11
Mi sono deciso di testare questo firewall , solo che sono incappato in un problema... in quanti file .java lo devo suddividere?
Ho creato tre file :

SingoloSocket.java
MyFirewall.java
GestConn.java

Uno per classe quindi
Il primo contenente anche le varie import ecc..ecc...
Solo che non funziona , ovvero digitando il comando
java MyFirewall 5000 &
appare questa scritta:

Microsoft Windows XP [Versione 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\utente>java MyFirewall 5000 &
Exception in thread "main" java.lang.NoClassDefFoundError: MyFirewall
Caused by: java.lang.ClassNotFoundException: MyFirewall
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: MyFirewall. Program will exit.


Non sono praticissimo purtroppo :confused:
Grazie saluti :)

ally
09-01-2009, 17:28
...ciao...

...puo' stare tutto in unica classe...


import java.io.*;
import java.net.*;

class SingoloSocket extends Thread {
private Socket canale;
private BufferedReader in;
private PrintWriter out;
private int porta;

public SingoloSocket(Socket s) throws IOException {
canale = s;
in = new BufferedReader(new InputStreamReader(canale.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(canale.getOutputStream())), true);
start();
}

public void run() {
try {
while (true) {
String str = in.readLine();
porta = canale.getPort();
InetAddress ia = canale.getInetAddress();
if (str.equals(null)) break;
System.out.println("La macchina: " + ia.getHostName() +
" con indirizzo IP " + ia.getHostAddress() +
" dalla porta " + porta + " si e` connessa!");
canale.close();
out.println(str);
}
System.out.println("chiudi... ");
} catch (IOException e) {
} finally {
try {
canale.close();
} catch(IOException e) {}
}
}
}

class GestConn {
public void LanciaPolling(int portaServizio) throws IOException {
ServerSocket s = new ServerSocket(portaServizio);
try {
while(true) {
Socket canale = s.accept();
try {
new SingoloSocket(canale);
} catch(IOException e) {
canale.close();
}
}
} finally {
s.close();
}
}

public static void main(String[] args) throws IOException {
GestConn gs = new GestConn();
gs.LanciaPolling(Integer.parseInt("80"));
}
}



...ho eliminato gli argomenti di lancio...la porta è cablata nel main...

...ciao...

Dyd87
09-01-2009, 17:39
Ciao e grazie innanzitutto
Ho fatto come da te suggerito , ho compilato ed eseguito il programma ma...

--------------------Configuration: <Default>--------------------
Exception in thread "main" java.net.BindException: Address already in use: JVM_Bind
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:359)
at java.net.ServerSocket.bind(ServerSocket.java:319)
at java.net.ServerSocket.<init>(ServerSocket.java:185)
at java.net.ServerSocket.<init>(ServerSocket.java:97)
at GestConn.LanciaPolling(MyFirewall.java:42)
at GestConn.main(MyFirewall.java:59)

Process completed.

ally
09-01-2009, 17:41
...nessun errore...stai cercando di accedere ad una porta già in uso nel sistema...

...ciao Andrea...

Dyd87
09-01-2009, 17:45
...nessun errore...stai cercando di accedere ad una porta già in uso nel sistema...

...ciao Andrea...

Oddio hai ragione , la porta 80 è quella dell'Http :doh:
Ho impostato la 5000 ora e funziona , appena ho tempo accendo l'altro pc e cerco di accedere al mio , per testarlo in pieno...
Domandina: come mai , nonostante abbia reso implicito il passaggio argomenti alla main ("5000") , Jcreator continua a visualizzarmi la casella:


"Set main method arguments:"


:confused:

ally
09-01-2009, 17:47
...non saprei...forse è solo un warning...

...ciao...

Dyd87
09-01-2009, 17:50
Capito , grazie.
Disponibilissimo , mi farò risentire se avrò problemi , ciao :)

Dyd87
09-01-2009, 18:00
Allora , appena eseguita la prova , come indicato nel link.
Dopo aver lanciato il programma sulla mia macchina e aver digitato la telnet verso il mio pc da un'altra macchina , è apparsa una notifica di Sygate , che avvertiva che un'applicazione Java stava tentando di accedere alla mia macchina.
Ho permesso che ciò avvenisse ma non è successo niente , nessun risposta nel prompt del programma.
Ho disattivato allora Sygate , niente ancora...cosa potrebbe essere?

Edit: in teoria sembrerebbe funzionare il firewall , dato che la connessione viene bloccata con Sygate attivato , ma non mi da neanche un messaggio di avviso sul prompt...

Dyd87
15-01-2009, 15:56
Allora , appena eseguita la prova , come indicato nel link.
Dopo aver lanciato il programma sulla mia macchina e aver digitato la telnet verso il mio pc da un'altra macchina , è apparsa una notifica di Sygate , che avvertiva che un'applicazione Java stava tentando di accedere alla mia macchina.
Ho permesso che ciò avvenisse ma non è successo niente , nessun risposta nel prompt del programma.
Ho disattivato allora Sygate , niente ancora...cosa potrebbe essere?

Edit: in teoria sembrerebbe funzionare il firewall , dato che la connessione viene bloccata con Sygate attivato , ma non mi da neanche un messaggio di avviso sul prompt...

Mi quoto , sperando che qualcuno sappia risolvere , dato che ancora continua a dar problemi...
In più aggiungo:

out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(canale.getOutputStream())), true);

Come mi sta ad indicare la condizione TRUE?
Ho cercato sui JavaDocs ma non ho trovato nulla :confused:

ally
15-01-2009, 15:59
...piu' che un firewall mi sembra un semplice socket server in ascolto su una porta...il che implica che la porta "monitorata" venga impegnata quindi resa non piu' disponibile...

...ciao Andrea...

Dyd87
15-01-2009, 16:03
...piu' che un firewall mi sembra un semplice socket server in ascolto su una porta...il che implica che la porta "monitorata" venga impegnata quindi resa non piu' disponibile...

...ciao Andrea...

Ciao Andrea
Si avevo notato anch'io l'effettiva utilità del "firewall" in questione , sto pian piano cercando di fargli un upgrade in modo che possa anche gestire protocolli e simili...
Il tuo intervento , comunque , era riferito al mio problema di lancio dell'applicazione e di "conflitto" con Sygate?
Se si , scusami ma non ho capito :confused:
EDIT: altro errore mio , ho visto che la clausola TRUE fa parte della classe PRINTWRITER e , da come leggo sul JavaDocs
Parameters:
out - An output stream
autoFlush - A boolean; if true, the println, printf, or format methods will flush the output buffer

In pratica permette la gestione del flusso di dati alle varie funzioni di stampa a video?
Grazie ciao , Riccardo :)

ally
15-01-2009, 16:10
Ciao Andrea
Si avevo notato anch'io l'effettiva utilità del "firewall" in questione , sto pian piano cercando di fargli un upgrade in modo che possa anche gestire protocolli e simili...
Il tuo intervento , comunque , era riferito al mio problema di lancio dell'applicazione e di "conflitto" con Sygate?
Se si , scusami ma non ho capito :confused:
Per quanto riguarda invece il TRUE del , mi correggo , BufferedWriter , sai dirmi qualcosa?
Grazie ciao , Riccardo :)

...il true è riferito al secondo parametro del PrintWriter...è riferito all'autoflush dell'output di tale metodo...attento alle parentesi...

...ciao Andrea...

Dyd87
19-01-2009, 12:21
Salve a tutti di nuovo
Ho aggiunto in alternativa alla TELNET , per verificare se effettivamente blocca le connessioni su porte indicate , questo programmino socket lato client

import java.io.*;
import java.net.*;


public class ThreadAttack {
public static void main(String[] args ) {
try {
Socket canale = new Socket("localhost",5000);
ObjectOutputStream oos=new ObjectOutputStream(canale.getOutputStream());
oos.writeObject("Ciao,come va?");
canale.close();
} catch (Exception e) { System.err.println(e); }
}
}


Che mi dovrebbe , eventualmente , instaurare una connessione sulla porta 5000 la quale è monitorata dal Firewall sopra descritto...
Il problema è che , al momento del lancio (stavolta con Sygate disabilitato) , non succede assolutamente nulla...
La scritta presente nel lato Client non viene , giustamente , visualizzata ma neanche quella di "tentato attacco" posta nel programma Firewall...
Quale potrebbe essere il problema? :confused:

P.s.: al momento del lancio il firewall di Windows mi ha ribloccato l'applicazione Java alche gli ho detto di sbloccarla...

EDIT: Rettifico , ho ricontrollato or ora (avevo lasciato il prompt aperto) e l'avvertimento di tentata intrusione sembra esserci stato!
Incollo qui il messaggio:

La macchina: localhost con indirizzo IP 127.0.0.1 dalla porta 4594 si e` connessa!

Perchè sulla 4594 però?
Inoltre non è stato visualizzato il messaggio "chiudi...", strano.