繁体   English   中英

在Linux上修改传出UDP数据包中的数据

[英]Modify data in outgoing UDP packets on linux

RADIUS部分对于查询而言并不重要,但是我认为我将解释上下文:

我有一台基于Linux的Radius服务器,该服务器始终在“ Access-Accept”数据包中包含某个属性,我的网络设备之一不喜欢该属性。 服务器没有禁用该属性的选项。 我正在研究使用脚本修改传出访问接受以删除属性并重新计算校验和和Radius身份验证器字段的可能性。

我将能够编写一个python脚本,该脚本创建一个UDP套接字进行侦听,然后根据需要修改radius数据包。 我坚持的部分是:
(A)如何将传出的流量重定向到脚本的套接字?
(B)如何确保源IP和目标IP /端口保持相同?

对(A)进行一些研究, 看来我们可以使用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 /端口在修改后的数据包中保持不变的一种选择。 如果有更简单的选择,我想知道。

以上任何帮助将不胜感激。

您必须使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM