# udp punching



## Andreas999 (16. Jan 2007)

Hallo,
ich sitze hinter einem DSL-Router mit einer Firewall und möchte UDP-Punching implementieren. Ausgehende Dienste sind bei mir erlaubt, Eingehende gesperrt. Skype und gestreamte Filme aus dem Internet funktionieren. Bei UDP punching muß jeder Sender etwas senden, damit er etwas empfangen kann. So habe ich es jedenfalls verstanden:

```
import java.io.*;
import java.net.*;
public class Punching extends Thread{
	DatagramSocket oDatagramSocket;
	
	public Punching(DatagramSocket oDatagramSocket){
		this.oDatagramSocket=oDatagramSocket;
	}
	public void run(){
		if(this.oDatagramSocket==null) return;
		byte[] recBytes=new byte[6];
		DatagramPacket recDatagram;
		recDatagram = new DatagramPacket(recBytes,recBytes.length);
			
		while(true){
		try {
			
			oDatagramSocket.receive(recDatagram);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		recBytes=recDatagram.getData();
		System.out.println(new String(recBytes));
		try {
			sleep(2);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}
			
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//Zielrechner
		String name="localhost";
		//gemeinsamer Port
		int port=8000;
		DatagramSocket oDatagramSocket=null;
		DatagramPacket oDatagramPacket=null;
		try {
			oDatagramSocket=new DatagramSocket(port);
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		String sDaten="Hallo!";
		byte [] bytes=sDaten.getBytes();
		try {
			oDatagramPacket=new DatagramPacket(bytes,bytes.length,InetAddress.getByName(name),port);
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Punching oPunching=new Punching(oDatagramSocket);
		oPunching.start();
		try {
			Thread.sleep(100);
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		while(true){
			try {
				oDatagramSocket.send(oDatagramPacket);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		try {		
			Thread.sleep(100);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	}
	
}
```

Wenn die Ports in der Firewall frei geschaltet sind und man den richtigen Zielrechner einträgt, funktioniert mein Programm sogar übers Internet. Jedoch ist das noch kein UDP punching. Denn wenn die Ports wieder zu sind, kommt nichts an.
Ich vermute, daß bei eingehenden Paketen die Firewall die Ports ändert. Wie bekomme ich dennoch dieses UDP punching hin?

Alles Gute!
Andreas


----------



## Wildcard (16. Jan 2007)

Für diese Technik brauchst du einen 3 Rechner, einen Server der für beide Parteien erreichbar ist.
http://en.wikipedia.org/wiki/UDP_hole_punching
http://www.heise.de/security/artikel/82054/1


----------



## Andreas999 (16. Jan 2007)

Wie kann ich mit Java alle UDP-Ports abklappern?


----------

