Я проектирую простой c-код для вызова команды iptables в соответствии с потребностью. Я просто хочу отбросить пакеты из определенного ipaddress, используя мой код c. Вот почему я должен использовать команду iptables в соответствии с введенным вводом. Можно ли вызвать команду с помощью c-кода? если это тогда как ??? заранее.Я просто хочу использовать команду iptables в моей программе c
ответ
Предполагая, что ваша программа работает от имени пользователя root, просто используйте fork() и exec() и передайте команду iptables в exec(). Что-то вроде
if (0 == fork()) {
execl("/sbin/iptables", ...); // supply the proper arguments to iptables.
}
Edit: Я вижу, от других людей, что система() это лучший способ, чем вилка/Exec.
Похоже, что Neha не уверен, как использовать sprintf для форматирования команды, чтобы она содержала IP-адрес, который хранится в некоторой другой переменной. Я думаю, что это должно выглядеть следующим образом:
char *host_to_block = ....
char comm[1000];
snprintf(comm, sizeof(comm), "iptables -A INPUT -s %s -j DROP", host_to_block);
system(comm);
Обратите внимание, что это будет уязвимость безопасности, если у вас есть код, чтобы убедиться, что host_to_block содержит IP-адрес, а не какой-либо другой команды оболочки. Вы можете использовать следующий вопрос для справки, если источник строки еще не известно, действительно:
Можно сделать это без использования системы() или EXEC *() семейство команд, однако я уверен, что вы также заинтересованы в фактическом завершении вашего проекта :)
Если вам нужна только рудиментарная функциональность от iptables внутри вашей программы или нужна точность обработки ошибок, вы можете получить источник для пакета iptables
.
Продвинутое предупреждение: изучение iptables ioctl-крючков и соответствующих модулей netfilter, как известно, является задачей разжижения ума.
+1 для упоминания базового интерфейса ОС, то есть правильный способ сделать это. –
Вызов/sbin/iptables - это ПРАВОЙ способ сделать это, однако, согласно веб-сайту Netfilter. Интерфейсы ядра (или, действительно, C-библиотека) не предназначены для стабильного API. – MarkR
Linux имеет стабильный ABI, независимо от того, что может сказать этот веб-сайт. Linux говорит: «Мы никогда не нарушаем пользовательское пространство». Так что хорошо использовать этот API. –
Вместо использования системы(), затем используйте fork, за которым следует execl/sbin/iptables, и поместите IP-адрес в свой собственный элемент массива args. Таким образом, вы не запускаете процесс оболочки, и нет возможности запуска оболочки (кстати, это немного более эффективно, но это не имеет значения). – MarkR
У меня были проблемы с вызовом system() с suid exec и пришлось вернуться к execl(). Даже с execl мне пришлось добавить usleep (5000) после каждого вызова iptables для обхода ошибки «ресурс временно недоступен». – anttir