Простий спосіб "редагувати" трафік, що надходить від хоста 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.