免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3650 | 回复: 4
打印 上一主题 下一主题

[C++] UDP被iptables的DNAT转换目的地址后,有没有办法获取原始目的地址? [复制链接]

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-11-12 17:34 |只看该作者 |倒序浏览
TCP类型的可以用getsockopt(sock, SOL_IP, SO_ORIGINAL_DST, ...)获取原始目的地址,但是UDP却不行。
我找了一些资料,看似最有用的应该是http://stackoverflow.com/questio ... irected-udp-message,我按照他说的方法做好以后测试了一下,发现获取的仍然是重定向以后的IP地址,而不是重定向之前的地址。不过那个帖子我有点看得不是很懂,他的意思是否是说,不要直接用iptables重定向,而是通过TProxy重定向,这样才能通过他说的方法得到原始目标地址呢?
请问,我遇到的这个问题,有解决方法吗?

论坛徽章:
6
酉鸡
日期:2013-11-04 15:30:02巳蛇
日期:2014-01-23 10:36:23双鱼座
日期:2014-01-23 13:08:332015亚冠之鹿岛鹿角
日期:2015-09-03 14:36:002015亚冠之武里南联
日期:2015-09-18 10:48:1315-16赛季CBA联赛之山西
日期:2016-05-05 00:05:33
2 [报告]
发表于 2015-11-12 22:06 |只看该作者
  1. Depends on the redirection mechanism. If you are using REDIRECT (which is NAT under the hood), then you need to use SO_ORIGINAL_DST, or libnetfilter_conntrack to query the original destination of the connection before NAT was applied. However since you can serve several connections with the same listener socket, this lookup has to be done for every packet.
复制代码
你自己发的链接上不是写得很清楚么?

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
3 [报告]
发表于 2015-11-13 09:51 |只看该作者
回复 2# Dannysd


    不太了解它说的什么意思,似乎它说与重定向的机制有关。我现在的疑问是用iptables重定向这个机制,有没有办法做到呢?SO_ORIGINAL_DST只能获取TCP的原始目标地址。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
4 [报告]
发表于 2015-11-18 10:55 |只看该作者
找了很多资料,还是没有找到可以获得重定向前的目的地址的方法。
最终还是只能上socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP)),通过raw socket自己分析得到IP包头的目的地址。不过raw socket的原理是要复制一份数据出来的,效率肯定没有直接udp socket的高。

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
5 [报告]
发表于 2015-11-20 11:21 |只看该作者
SO_ORIGINAL_DST在内核里被限定到TCP/SCTP,其实是可以支持UDP的。
背后是conntrack+nat,conntrack的5tuple里面有转换前的信息。
想支持UDP的话,放开内核的限制就可以了。

不想改内核的话,就像so里建议的那样,改用tproxy实现重定向(而不是使用REDIRECT)。
高版本的tproxy应该已经集成到内核里了,不过tproxy的使用很绕,好在网上也很多例子。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP