2010-03-20 3 views
0

Я проектирую простой c-код для вызова команды iptables в соответствии с потребностью. Я просто хочу отбросить пакеты из определенного ipaddress, используя мой код c. Вот почему я должен использовать команду iptables в соответствии с введенным вводом. Можно ли вызвать команду с помощью c-кода? если это тогда как ??? заранее.Я просто хочу использовать команду iptables в моей программе c

ответ

2

Предполагая, что ваша программа работает от имени пользователя 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-адрес, а не какой-либо другой команды оболочки. Вы можете использовать следующий вопрос для справки, если источник строки еще не известно, действительно:

how to validate an ip address

+1

Вместо использования системы(), затем используйте fork, за которым следует execl/sbin/iptables, и поместите IP-адрес в свой собственный элемент массива args. Таким образом, вы не запускаете процесс оболочки, и нет возможности запуска оболочки (кстати, это немного более эффективно, но это не имеет значения). – MarkR

+0

У меня были проблемы с вызовом system() с suid exec и пришлось вернуться к execl(). Даже с execl мне пришлось добавить usleep (5000) после каждого вызова iptables для обхода ошибки «ресурс временно недоступен». – anttir

1

Можно сделать это без использования системы() или EXEC *() семейство команд, однако я уверен, что вы также заинтересованы в фактическом завершении вашего проекта :)

Если вам нужна только рудиментарная функциональность от iptables внутри вашей программы или нужна точность обработки ошибок, вы можете получить источник для пакета iptables.

Продвинутое предупреждение: изучение iptables ioctl-крючков и соответствующих модулей netfilter, как известно, является задачей разжижения ума.

+0

+1 для упоминания базового интерфейса ОС, то есть правильный способ сделать это. –

+0

Вызов/sbin/iptables - это ПРАВОЙ способ сделать это, однако, согласно веб-сайту Netfilter. Интерфейсы ядра (или, действительно, C-библиотека) не предназначены для стабильного API. – MarkR

+0

Linux имеет стабильный ABI, независимо от того, что может сказать этот веб-сайт. Linux говорит: «Мы никогда не нарушаем пользовательское пространство». Так что хорошо использовать этот API. –