Команда для запуску дочірнього процесу в режимі офлайн (без зовнішньої мережі) в Linux


15

У мене є програма, яку я хотів би протестувати в автономному режимі, не знімаючи фактичної мережі. Ця програма все одно потребуватиме підключення до локальних сокетів, включаючи unix домені sox і loopback. Він також повинен слухати в режимі зворотного зв'язку та бути видимим для інших додатків.

Але спроби підключитися до віддаленої машини повинні провалитися.

Я хотів би мати утиліту, яка працює як strace/ unshare/ sudoі просто запускає команду з Інтернетом (та LAN) таємно, а все інше все ще працює:

$ offline my-program-to-test

На це питання є підказки на відповідь: Блокувати доступ до мережі до процесу?

Тут є кілька пропозицій, наприклад, запустити, як інший користувач, потім маніпулювати iptables, або unshare -n. Але в обох випадках я не знаю бажаності отримати сокети домену Unix та петлю зворотного зв’язку для спільної роботи з основною системою - відповіді на це питання лише підказують мені, як скасувати доступ до всієї мережі.

Програма, яку я тестую, все ще потребує підключення до мого X-сервера та dbus і навіть мати можливість слухати в режимі зворотного зв'язку для підключень інших програм у системі.

В ідеалі я хотів би уникати створення хротонів або користувачів або віртуальних машин тощо, оскільки це стає таким же дратівливим, як і відключення мережного кабелю. тобто сенс питання полягає в тому, як я можу зробити це так просто, як sudo.

Я б хотів, щоб процес запускався нормально на 100%, за винятком того, що мережеві дзвінки із зазначенням не місцевої адреси не зможуть. Ідеально зберігати той самий uid, той же hededir, той самий pwd, те саме, крім ... офлайн.

Я використовую Fedora 18, тому невідповідні відповіді на Linux просто чудові (очікується, навіть).

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

Будь-який розробник, який намагається підтримувати "офлайн режим", мабуть, оцінить цю утиліту!

Відповіді:


9

Традиційна відповідь - запускати програму як інший користувач та використовувати її iptables -m owner. Таким чином, мережева конфігурація є спільною. Однак із появою просторів імен є простіший спосіб.

За допомогою просторів імен ви скасуєте дію мережі, а потім створите віртуальне мережеве посилання, якщо вам потрібен обмежений доступ до мережі.

Для спільного використання роз'ємів домен Unix, вам потрібно мати достатньо недавнє ядро ​​після цього патча 2010 року , тобто 2.6.36 або вище (що стосується всіх поточних дистрибутивів на момент написання, крім RHEL / CentOS).

Запустіть програму у власному просторі імен IP. Перед запуском програми встановіть віртуальний інтерфейс Ethernet. Здається, не так багато документації; Я знайшов правильний заклик у кількох блогах:

У фрагменті нижче, я використовую ns_execце це обгортка навколоsetns перерахованої на сторінці людини , щоб викликати господар сторону мережевого з'єднання від процесу , запущеного в обмеженому просторі імен. Насправді цього вам не потрібно: ви можете налаштувати хост-адресу посилання поза межами обмеженого простору імен. Робити це зсередини просто полегшити контроль потоку, інакше вам потрібна певна синхронізація, щоб налаштувати посилання після його встановлення, але перед запуском програми.

unshare -n -- sh -c '
  # Create a virtual ethernet interface called "confined",
  # with the other end called "global" in the namespace of PID 1
  ip link add confined type veth peer name global netns 1

  # Bring up the confined end of the network link
  ip addr add 172.16.0.2/30 dev confined
  ip link set confined up

  # Bring up the global end of the network link
  ns_exec /proc/1/ns/net ifconfig global 172.16.0.1 netmask 255.255.255.252 up

  # Execute the test program
  exec sudo -E -u "$TARGET_USER" "$0" "$@"
' /path/to/program --argument

Вам потрібно зробити все це як корінь. Введення користувальницьких просторів імен в ядро 3.8 , може зробити це здійснимо без будь - яких спеціальних дозволів, за винятком створення глобального кінця мережевого з'єднання.

Я не знаю, як поділити localhost між двома просторами імен. Віртуальні інтерфейси Ethernet створюють міст "точка-точка". Ви можете використовувати iptablesправила переадресації, щоб перенаправити трафік з / loза бажання.


Хороша додаткова інформація, спасибі Я думаю, що Veth дає мені посилання на "поза" простору імен, але мій новий простір імен все-таки становить окремий мережевий вузол, а не той самий мережевий вузол за мінусом не локальних інтерфейсів. Наслідки є (?): Домен / абстрактні сокети Unix все ще не вдасться, і зворотний зв'язок можна пересилати через iptables, але переадресація не дає спільного доступу - тобто, і оригінальний, і обмежений простір імен можуть прослуховуватись із зворотним циклом та обома наборами (динамічно -змінюючись) порти повинні бути видимими в обох просторах імен ... починати вгадувати те, що я хочу, тут неможливо: - /
Havoc P

1

Цього можна досягти також за допомогою правил iptables, що відповідають групам груп. Я написав інструмент для абстрагування кроків. Хоча для початкових налаштувань він вимагає кореневих дозволів і в іншому випадку є встановленим бінарним файлом, я думаю, що він пропонує досить простий спосіб вирішити проблему в питанні. Для цього потрібна версія iptables, яка є досить недавньою, а також наявні відповідні модулі netfilter.

https://github.com/quitesimpleorg/qsni


0

/ !! \ Це, мабуть, не є коректною відповіддю, оскільки це призведе до зменшення всього вашого трафіку, а не лише до одного трафіку.

Я не використовував його, але думаю, що ви потенційно можете використовувати Comcast:

https://github.com/tylertreat/Comcast

встановити 100% втрати пакету

Знову ж таки, я цього не перевіряв, але теоретично, видозмінений з їхнього читання, ви можете:


Linux

У Linux можна використовувати iptablesдля відкидання вхідних та вихідних пакетів.

$ iptables -A INPUT -m statistic --mode random --probability 1 -j DROP
$ iptables -A OUTPUT -m statistic --mode random --probability 1 -j DROP

Крім того, ви можете використовувати, tcщо підтримує деякі додаткові параметри.

$ tc qdisc change dev eth0 root netem reorder 0 duplicate 0 corrupt 1

Щоб скинути:

$ tc qdisc del dev eth0 root netem
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.