Простий спосіб "редагувати" трафік, що надходить від хоста tcp (linux)


9

Мені потрібно внести невелику модифікацію вхідного трафіку з відомого хоста tcp: port перед процесом обробки з'єднання отримати потік.

Наприклад, нехай 192.168.1.88 - віддалений хост, який запускає веб-сервер.
Мені потрібно , що, коли процес на моєму локальному хості приймає дані від 192.168.1.88:80 (наприклад , браузера), дані спочатку змінений шляхом заміну text-Aз text-B, як це:

  • 127.0.0.1: ... підключається до 192.168.1.88:80
  • 127.0.0.1: ... надсилає на 192.168.1.88:80:

    GET /
    
  • 192.168.1.88:80 надсилає на 127.0.0.1: ...:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-A, some other text
    
  • Ці дані дещо перехоплюються системою і передаються програмі, вихід якої:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-B, some other text
    
  • система надає настільки змінені дані в обробку процесів 127.0.0.1: ..., як якщо б вони надходили від 192.168.1.88:80.

Припустимо, що у мене є потоковий спосіб внесення цих змін ( sedнаприклад,), який найпростіший спосіб попередньо обробити вхідний потік tcp?

Я думаю, це буде пов'язано iptables, але я не дуже добре в цьому.

Зауважте, що програма повинна мати справу з оригінальним хостом, тому налаштування проксі - це, ймовірно, не може бути рішенням.


Це запити HTTP?
поліном

Ваше питання недостатньо чітке. Вам потрібно надати більше деталей.
Халед

1
Ви не можете зробити це на рівні пакетів. Один пакет може містити "text-", а наступний може містити "A". Вам доведеться розробити невидимий проксі, який слід за протоколом. (Ви повинні дотримуватися протоколу, тому що якщо ви отримаєте "text-" і це частина "text-A", вам потрібно дочекатися наступного фрагменту, перш ніж передати його, або ваш фільтр не запрацює. Але якщо це кінець логічного повідомлення, ви не можете чекати, тому що ви будете чекати вічно.) Я вважаю, що немає простого способу зробити це.
Девід Шварц

Уже існують стаціонарні системи перевірки пакетів, які можуть робити, наприклад, переписування трафіку FTP, щоб він працював через NAT. Це таке місце для початку.
pjc50

Мені він потрібен, перш за все, для роботи з http-відповіддю, але було б добре, якщо він працює на будь-якому рівні додатків.
etuardu

Відповіді:


21

Використовуйте netsed та iptables, що наближаються.

iptables -t nat -D PREROUTING -s yourhost -d desthost -p tcp --dport 80 -j REDIRECT --to 10101

Потім запустіть:

netsed tcp 10101 desthost 80 s/text-A/text-B

NetSED - це невелика і зручна утиліта, призначена для зміни в режимі реального часу вмісту пакетів, що передаються через вашу мережу. Це дійсно корисно для зміни, підробки або маніпуляції з мережевими пакетами. NetSED підтримує:

  • Аудит протоколу чорного поля - коли є два або більше фірмових вікон, які спілкуються, використовуючи який-небудь незадокументований протокол. Внісши зміни в поточну передачу, ви зможете перевірити, чи можна перевірити заявку як безпечну.

  • експерименти з генеруванням нечіткості, тести на цілісність - щоразу, коли ви робите тести на стабільність програми, щоб побачити, як вона піклується про цілісність даних;

  • інші поширені випадки використання: оманливі передачі, фільтрація вмісту, перетворення протоколу - все, що найкраще відповідає вашим завданням.


Це дійсно просто і класно.
mbrownnyc

Я не знав netsed, це майже ідеально підходить для моєї мети. Єдине, чого я не отримую - це налаштувати "локальний прозорий проксі" (див. Питання). Можливо, я повинен створити інший (віртуальний) мережевий інтерфейс, щоб отримати це. До речі, наразі це найбільш задовольняюча відповідь.
etuardu

У вас працює загальне ядро ​​розповсюдження? Якщо ви є iptables, підтримка, ймовірно, вже зібрана. Для того, щоб налаштувати прозорий проксі, вам просто потрібно заповнити відповідні дані для вашого хоста / портів. Погляньте на readme і переконайтеся, що воно заповнює деякі деталі. silicone.homelinux.org/git/netsed.git/blob_plain/HEAD:/README
dfc

Я думав, що netsed буде працювати лише на одному пакеті за раз? Отже, якщо http-запит був розділений на два пакети, регулярний вимір заміни не збігається, і запит буде передано на сервер немодифікованим.
paulos

1
нормально зараз, на всякий випадок, коли хтось цього дня потребує: не те, щоб я його повністю розумів, але для того, щоб насправді змінити пакети OUTGOING (що саме НЕ хотів робити), вам доведеться змінювати OUTPUT, ні PREROUTING. також -Dваріант мав бути -A для мене. також для -jваріанту мені довелося використовувати DNAT --to-destination (ip) або REDIRECT --to-port. Нарешті, я не зміг виправити помилку сегментації netsed. дивіться також: ubuntuforums.org/showthread.php?t=2337389
phil294


3

iptables+ використання libnetfilter_qu - це ще один варіант, який виконує те, що ви бажаєте:

"... [reinject] змінено пакети до підсистеми nfnetlink_queue ядра."

Це, швидше за все, дасть вам найбільшу розширюваність, оскільки ви кодувати програмне забезпечення.

Також доступна обгортка пітона .


2
Зразок програми, яка використовує netfilter_queue
rgerganov
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.