2010-10-16 30 views
2

J'ai tout le trafic du port 50 redirigé vers 5050 en utilisantC++ iptables redirection former des paquets séparés

iptables -t nat -A POSTROUTING -p udp --dport 50 -j REDIRECT --to-port 5050 

J'écoute à l'aide d'un RAW Socket sur 5050, et je vois des paquets IP de 0.0.0.0:50 à 0,0. 0,05050. L'adresse de destination d'origine n'est évidemment pas présente, car il semble s'agir d'un paquet de redirection séparé du port 50 vers le port 5050.

Si le paquet d'origine était supposé aller à abcd: 50, comment puis-je obtenir cette adresse IP ? Comment puis-je déterminer l'adresse de destination à laquelle le message était censé être envoyé, afin que je puisse l'y transférer?

J'apprécie votre aide.

P.S .: Je ne veux pas utiliser libipq, car pour une raison quelconque cela n'a pas fonctionné et je ne veux pas perdre plus de temps à le faire fonctionner.

Répondre

3

Linux netfilter définit une option de socket appelée SO_ORIGINAL_DST dans <linux/netfilter_ipv4.h>.

D'abord, vous devez activer la redirection de port dans votre système, en utilisant une de ces commandes:

sysctl net.ipv4.ip_forward=1 
echo 1 > /proc/sys/net/ipv4/ip_forward 

Ensuite, vous pouvez utiliser ceci:

struct sockaddr_in addr; 
socklen_t addr_sz = sizeof(addr); 
getsockopt(fd, IPPROTO_IP, SO_ORIGINAL_DST, &addr, &addr_sz); 

Je ne peux pas trouver SO_ORIGINAL_DST dans une page de manuel Linux. Vous aurez peut-être de la chance de trouver une documentation officielle sur le site netfilter.

+0

Merci de répondre. Non ça ne marche pas non plus. Il donne my_ip_address: 0. Pouvons-nous faire cela autrement? – SkypeMeSM

+0

@SkypeMeSM: 'SO_ORIGINAL_DST' vous demande d'activer la redirection de port. Cela devrait résoudre votre problème. – jweyrich

+0

@jweyrich: Merci d'avoir répondu. Je l'ai fait. \t \t \t système ("sysctl net.ipv4.ip_forward = 1"); addr_len = sizeof (struct sockaddr); getsockopt (sip_socket, IPPROTO_IP_IP, SO_ORIGINAL_DST, & sender_addr, (socklen_t *) & addr_len); cout << inet_ntoa (sender_addr.sin_addr) << ":" << ntohs (sender_addr.sin_port) << endl; – SkypeMeSM