C ++ перенаправление iptables, формирующее отдельные пакеты - PullRequest
2 голосов
/ 17 октября 2010

У меня весь трафик с порта 50 перенаправлен на 5050 с использованием

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

Я слушаю, используя RAW Socket на 5050, и вижу IP-пакеты от 0.0.0.0:50 до 0.0.0.0:5050. Исходный адрес назначения, очевидно, отсутствует, поскольку это отдельный пакет перенаправления с порта 50 на порт 5050.

Если исходный пакет должен был перейти на a.b.c.d: 50, как я могу получить этот IP-адрес? Как определить адрес получателя, на который должно было быть отправлено сообщение, чтобы я мог переслать его туда?

Я ценю вашу помощь.

P.S .: Я не хочу использовать libipq, так как по какой-то причине он не работает, и я не хочу тратить больше времени на то, чтобы заставить его работать.

1 Ответ

3 голосов
/ 17 октября 2010

Linux netfilter определяет опцию сокета с именем SO_ORIGINAL_DST в <linux/netfilter_ipv4.h>.

Сначала вам нужно включить переадресацию портов в вашей системе, используя одну из следующих команд:

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

Тогда вы можете использовать это:

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

Я не могу найти SO_ORIGINAL_DST на любой странице Linux. Возможно, вам повезет, найдя официальную документацию на сайте netfilter.

...