# UDP über ne Firewall



## MarcoBehnke (26. Jul 2007)

Argh, ich verzweifel. Ich habe hier einen JavaChat Client, der per UDP Nachrichten an alle bekannten Client schickt.
Meine Firewall habe ich auf ALLOW ALL gestellt und Weiterleitung an meine lokale IP.

So. Der Chat Client verschickt UDP Pakete

```
private void sendNewMessage(){
		try {
			DatagramSocket _msgSocket=new DatagramSocket();
		StringTokenizer chatterList = new StringTokenizer(getChatterList()," ");

		String sender = "<"+_chatName+">";
		String msgBody = _chatLine.getText();
		String msg = sender+" "+msgBody+"\n";

		byte[] sendData = new byte[1024];
		sendData = msg.getBytes();

		DatagramPacket sendPacket;
							

		while(chatterList.hasMoreTokens() ) {
			String nextIP = chatterList.nextToken();
			System.out.println("Send msg to " + nextIP);
			sendPacket = new DatagramPacket( sendData, sendData.length, InetAddress.getByName(nextIP), get_msgPort());
			_msgSocket.send(sendPacket);
			System.out.println("Msg sent to " + nextIP + "/" + get_msgPort());
		}
		
		} catch(SocketException e) {
			System.out.println("Socket Exception beim Versenden aufgetreten.");
		} catch(IOException e) {
			System.out.println("I/O Exception beim Versenden aufgetreten.");
		}
		
		_chatLine.setText("" );
		
	}
```

und ein Empfangthread soll die Nachrichten annehmen

```
public void run() {
		// while-loop to let the listener continue even after
		// shutdown after IOException
		boolean running = true;
		while(running) {
			try {
				System.out.println("Start receiver thread");
				System.out.print("Listening to ");
				System.out.println(_application.get_msgPort());
				_msgSocket = new DatagramSocket(_application.get_msgPort());
				_msgSocket.setBroadcast(true);
				_msgSocket.setReuseAddress(true);
				byte[] receiveData;
				while(true){
					receiveData = new byte[1024];
					_msg =	new DatagramPacket(receiveData, receiveData.length);
					_msgSocket.receive(_msg );
					System.out.println("Message received");
					updateClient((new String(_msg.getData() )).trim()+"\n" );
				}
			} catch(SocketException e){
				JOptionPane.showMessageDialog(null,"Socket error on port "+_application.get_msgPort()+".\nMaybe another chat client already running?\nNo messages can be received.\nCheck for running clients and restart application.","Socket error",JOptionPane.WARNING_MESSAGE );
				running=false;
				e.printStackTrace();
			} catch(IOException e){
				// not that evil to handled.
			}
		}
	}
```


Starte ich das Ganze lokal auf meinem Rechner funktioniert es auch wunderbar, aber sobald er meine externe IP benutzt, grüzt das alles.....

Die SYSOUTs da oben sehen so aus:



> Message received YOURIP: 84.143.163.92
> Set my ip to 84.143.163.92
> set my ip 84.143.163.92
> Start receiver thread
> ...



Empfangen wird jedoch nichts


----------



## MarcoBehnke (26. Jul 2007)

Ach ja, hier der Webstart: http://www.firegate.de/rnp/


----------



## NTB (26. Jul 2007)

sitzt Du vielleicht hinter einem Router und brauchst ncoh ein Portforwarding?


----------



## MarcoBehnke (26. Jul 2007)

jepp, aber das habe ich ja gesetzt (siehe oben)
Alle Fragen von außen sind gestattet und werden an meine interne IP weitergereicht


----------



## tuxedo (26. Jul 2007)

Ich sag nur: UDP Hole-Punching  

Skype macht das sehr gut. Wie's geht steht unter anderem hier: http://en.wikipedia.org/wiki/UDP_hole_punching

und hier:

http://www.heise-security.co.uk/articles/82481


----------



## MarcoBehnke (26. Jul 2007)

Ich verstehe den Zusammenhang leider grad nicht?
Ich verschicke die Pakete auf den richtigen Port an den richtigen Server und habe zudem Broadcast Empfang angeschaltet. Die Firewall schickt alles egal welcher Port oder Dienst an meinen Rechner weiter, der ansonsten keinerlei Schutzmaßnahmen hat.

Warum kommt die Nachricht trotzdem nicht an?


----------



## MarcoBehnke (26. Jul 2007)

ok, wenn man drüber nachdenkt eröffnen sich einem plötzlich die Umstände :-D danke noch mal für den Tip.

Habe ich diese NAT Problem eigentlich nur bei UDP oder auch bei TCP?


----------



## HoaX (26. Jul 2007)

nur bei udp, bzw bei allen verbindungslosen, bei tcp hast du das nicht


----------



## tuxedo (27. Jul 2007)

hab die hole-punching-technik in Java *noch* nicht selbst probiert, war nur "beheistert" von der Möglichkeit. 
Weiß schon jemand obs ne fertige Lib dafür gibt? 

- Alex


----------



## HoaX (28. Jul 2007)

wozu? die anzahl code die du dafür brauchst wird bestimmt nicht geringer, was soll man das groß machen in der lib ...


----------



## tuxedo (28. Jul 2007)

Man benutzt ja auch nicht deshalb libs damit man weniger code hat. Es geht ja drum das rad nicht neu zu erfinden. Mir gehts dabei auch um Zeitersparnis.


----------



## HoaX (28. Jul 2007)

ich sehe dennoch keinen sinn wegen 10 zeilen code ne lib erstellen/einzubinden


----------



## tuxedo (28. Jul 2007)

wenn du das sagst... aber wir schweifen ab.


----------



## MarcoBehnke (9. Aug 2007)

hoax.... irgendwie bringt mich das der Lösung nicht näher?

Ich habe jetzt mal das Internet durchforstet und diese JStun geschicht scheint wohl genau das Richtige dafür zu sein.

Hat schon mal jemand damit gearbeitet? Die Dokumentation ist ja leider etwas dürftig....


----------



## ice-breaker (10. Aug 2007)

ich hatte auch mal das Problem und habe es folgendermaßen gelöst:
Es war eine Client-Server-Applikation, jede Sekunde sendete der Client ein Dummy-Paket an den Server ebenso der Server an den Client (bitte eine fortlaufende id reinpacken, denn mit immer gleichen Daten funzt es net bei jedem Router) und schon war das Problem gelöst, alle Pakete sowohl raus und rein funktionierten


----------

