Изменить данные в исходящих пакетах UDP на Linux - PullRequest
0 голосов
/ 07 июня 2018

RADIUS-часть не важна для запроса, но я подумал, что я объясню контекст:

У меня есть радиус-сервер на основе Linux, который всегда включает определенный атрибут в пакет «Access-Accept», что одно из моих сетевых устройств не любит.На сервере нет возможности отключить указанный атрибут.Я искал возможность использования сценария для изменения исходящего доступа, принятия, удаления атрибута и пересчета полей контрольной суммы и аутентификатора Radius.

Я смогу закодировать скрипт Python, который создает сокет UDP дляпрослушайте, а затем измените пакет радиуса по мере необходимостиЧасть, с которой я застрял:
(A) Как перенаправить исходящий трафик на сокет моего скрипта?
(B) Как обеспечить, чтобы исходный и целевой 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 / порта в измененном пакете.Если есть более простой вариант, я хотел бы знать, что.

Любая помощь с вышеизложенным будет принята с благодарностью.

1 Ответ

0 голосов
/ 08 июня 2018

Вы должны использовать функциональность iptables NFQUEUE: если пакет соответствует вашему правилу, он будет перенаправлен в пространстве пользователя в определенную очередь.

Например, для перехвата всех пакетов радиуса в ваш "нестандартный""сетевое устройство:

iptables -A OUTPUT -d <device> -p udp --sport <radius_port> -j NFQUEUE --queue-num 1

Затем вам нужно запустить скрипт, который привязывается к Nfqueue и соответственно изменяет пакеты.

Небольшой пример Python с nfqueue иscapy (вам нужно установить зависимости):

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
...