它的RADIUS部分对查询并不重要,但我想我会解释一下上下文:
我有一个基于Linux的半径服务器,它始终在“访问 - 接受”数据包中包含某个属性,这是我的一个网络设备所不喜欢的 . 服务器没有禁用所述属性的选项 . 我正在研究使用脚本修改传出访问接受以删除属性并重新计算校验和和Radius身份验证器字段的可能性 .
我将能够编写一个python脚本,它创建一个UDP套接字来监听,然后根据需要修改radius数据包 . 我坚持的部分是:
(A)如何将传出流量重定向到我的脚本套接字?
(B)如何确保源和目标IP /端口保持不变?
对(A),it looks like做一些研究,我们可以使用iptables将传入的数据重定向到脚本:
上面链接中建议的命令:iptables -t nat -D PREROUTING -s yourhost -d desthost -p tcp --dport 80 -j REDIRECT --to 10101
但是,我需要修改传出数据 . 我猜我需要修改PREROUTING到POSTROUTING似乎还有一个NAT关键字 . 我不确定这将如何影响IP地址 .
我也担心,如果我的脚本确实发送了具有相同IP /端口的修改后的数据包,它是否会再次点击iptable规则,并陷入无限循环?我该如何避免这种情况?
对于查询(B),我认为使用Scapy是一个选项,以确保修改后的数据包中的IP /端口保持不变 . 如果有更简单的选择,我想知道 .
任何有关上述内容的帮助都将非常感激 .
1 回答
您必须使用NFQUEUE iptables功能:如果数据包符合您的规则,它将在用户空间中重定向到特定队列 .
例如,拦截所有半径数据包到您的“非标准”网络设备:
iptables -A OUTPUT -d <device> -p udp --sport <radius_port> -j NFQUEUE --queue-num 1
然后,您必须运行绑定到Nfqueue的脚本并相应地修改数据包 .
一个带有nfqueue和scapy的小python示例(你需要安装依赖项):