它的RADIUS部分对查询并不重要,但我想我会解释一下上下文:
我有一个基于Linux的radius服务器,它总是在“Access-Accept”数据包中包含某个属性,这是我的一个网络设备不喜欢的。服务器没有禁用所述属性的选项。我正在研究使用脚本修改传出访问接受以删除属性并重新计算校验和和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 /端口保持不变。如果有更简单的选择,我想知道。
对上述任何帮助都会非常感激。
答案 0 :(得分:0)
您必须使用NFQUEUE iptables功能:如果数据包符合您的规则,它将在用户空间中重定向到特定队列。
例如,拦截所有半径数据包到你的非标准"网络设备:
iptables -A OUTPUT -d <device> -p udp --sport <radius_port> -j NFQUEUE --queue-num 1
然后你必须运行一个绑定到Nfqueue的脚本并相应地修改数据包。
带有nfqueue和scapy的小python示例(您需要安装依赖项):
from scapy.all import *
from netfilterqueue import NetfilterQueue
queueId = 1
def doStuff(packet):
[do your packet mangling here]
packet.set_payload(str(modified_packet_payload))
packet.accept()
# bind the callback function to the queue
nfqueue = NetfilterQueue()
nfqueue.bind(queueId, doStuff)
try:
nfqueue.run()
except KeyboardInterrupt:
pass