【问题标题】:Modify data in outgoing UDP packets on linux在linux上修改传出UDP数据包中的数据
【发布时间】:2018-06-09 02:51:14
【问题描述】:

它的 RADIUS 部分对查询并不重要,但我想我会解释一下上下文:

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

我将能够编写一个 python 脚本来创建一个 UDP 套接字来监听,然后根据需要修改半径数据包。我坚持的部分是:
(A) 如何将传出流量重定向到脚本的套接字?
(B) 如何保证源IP和目的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/端口在修改后的数据包中保持不变的选项。如果有更简单的选择,我想知道。

我们将不胜感激。

【问题讨论】:

  • 只编辑源代码并重建您的 RADIUS 服务器可能要容易得多。

标签: python linux sockets iptables


【解决方案1】:

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

【讨论】:

  • 谢谢@Simone。这解决了大部分问题。但是,使用 scapy 发送的数据包是否会再次针对 iptables 进行检查(导致它在无限循环中返回到脚本中?)?
  • 数据包会退出 OUTPUT 链,进入 NFQUEUE 然后在 OUTPUT 链后重新注入,所以没有循环。当然,任何匹配的数据包都会在nfqueue中注入一次,您需要在代码中定义哪些数据包需要修改,哪些数据包不需要。
猜你喜欢
  • 1970-01-01
  • 2015-09-12
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
相关资源
最近更新 更多