2010-10-16 40 views
2

我有使用C++的iptables重定向形成單獨的數據包

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

我聽5050上使用RAW套接從重定向到5050端口50的所有通信,以及我看到的IP分組從0.0.0.0:50爲0.0。 0.0:5050。 原來的目標地址顯然不存在,因爲這似乎是從端口50到端口5050的單獨重定向數據包。

如果原始數據包應該轉到abcd:50,如何獲取該ip地址?我怎樣才能找出郵件應該發送到的目的地址,以便我可以在那裏轉發郵件?

我感謝您的幫助。

P.S .:我不想使用libipq,因爲由於某種原因,它不起作用,我不想浪費更多時間來使它工作。

回答

3

Linux netfilter在<linux/netfilter_ipv4.h>中定義了一個名爲SO_ORIGINAL_DST的套接字選項。

首先,你需要使你的系統端口轉發,使用這些命令之一:

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); 

在任何Linux手冊頁我找不到SO_ORIGINAL_DST。您可能有幸在netfilter網站上找到正式的文檔。

+0

感謝您的回覆。不,它也不起作用。它給my_ip_address:0。我們能否以其他方式完成這項工作? – SkypeMeSM 2010-10-17 02:25:08

+0

@SkypeMeSM:'SO_ORIGINAL_DST'需要您啓用端口轉發。它應該解決你的問題。 – jweyrich 2010-10-17 04:00:38

+0

@jweyrich:謝謝你的回覆。我已經做了。 \t \t \t system(「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 2010-10-17 04:30:06