URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8715
[ Назад ]

Исходное сообщение
"C/C++ .... system('iptables.......')"

Отправлено ivanches , 03-Май-10 19:00 
Доброго времени суток уважаемые форумчане!
Подскажите, как разрешить одну проблемку. Пытаюсь сделать защиту для игрового сервера, написан клиент и сервер, последний пока тестовый, т.к. может выдавать только строку в консоли :)
Принцип работы - в связке с iptables, последний должен быть настроен. Политика на все входящие:
-P INPUT DROP
Все входящие пакеты отбрасываются, далее цепочки исключений -A INPUT..... -j ACCEPT разрешаеи всё , что нужно, протоколы  и т.п. только порт 2106 не должен быть в исключении(!!!!!), т.к. этот порт игрового сервера авторизации, исключения для этого порта должно выполняться программно учитывая ip(в дальнейшем и MAC) звонящего клиента.
В чём затык? Затык в том, что у iptables нет API, разрабы рекомендуют пользоваться system(), а в system можно прописать лишь строковую константу , т.е. например:
system("iptables -A INPUT -s 10.154.177.45 -p tcp --dport 2106 -j ACCEPT");

Но нужно , что бы IP подставлялся извлекаясь из входящего пакета:
system("iptables -A INPUT -s %s %s\n",  inet_ntoa(ss.sin_addr) ,"-p tcp --dport 2106 -j ACCEPT");

в таком варианте компилятор выдаёт ошибку. Подскажите , есть ли решение и как оно выглядит. Всем заранее спасибо!

Содержание

Сообщения в этом обсуждении
"C/C++ .... system('iptables.......')"
Отправлено ivanches , 03-Май-10 21:04 
>[оверквотинг удален]
>ip(в дальнейшем и MAC) звонящего клиента.
>В чём затык? Затык в том, что у iptables нет API, разрабы
>рекомендуют пользоваться system(), а в system можно прописать лишь строковую константу
>, т.е. например:
>
system("iptables -A INPUT -s 10.154.177.45 -p tcp --dport 2106 -j ACCEPT");

>Но нужно , что бы IP подставлялся извлекаясь из входящего пакета:
>
system("iptables -A INPUT -s %s %s\n",  inet_ntoa(ss.sin_addr) ,"-p tcp --dport 2106 
>-j ACCEPT");

>в таком варианте компилятор выдаёт ошибку. Подскажите , есть ли решение и
>как оно выглядит. Всем заранее спасибо!

Уф... а ларчик просто открывался :))
http://www.developpez.net/forums/d127481/c-cpp/cpp/debuter/c.../
Всё , разобрался наконец...
Может кому пригодится:

char buffer[1024];
sprintf(buffer, "iptables -A INPUT -s %s %s\n", inet_ntoa(ss.sin_addr)," -p tcp --dport 2106 -j ACCEPT");
system(buffer);


"C/C++ .... system('iptables.......')"
Отправлено Андрей , 04-Май-10 00:42 
>Уф... а ларчик просто открывался :))
>http://www.developpez.net/forums/d127481/c-cpp/cpp/debuter/c.../
>Всё , разобрался наконец...
>Может кому пригодится:
>
char buffer[1024]; 
>sprintf(buffer, "iptables -A INPUT -s %s %s\n", inet_ntoa(ss.sin_addr)," -p tcp --dport 2106
>-j ACCEPT");
>system(buffer);

рекомендуется использовать snprintf(buffer, 1024, .....); так как это позволяет предотвратить переполнение buffer если параметры формата очень длинные.


"C/C++ .... system('iptables.......')"
Отправлено phpcoder , 04-Май-10 09:54 
>рекомендуется использовать snprintf(buffer, 1024, .....);

+1 про snprintf().

(Можно даже snprintf(buffer, sizeof(buffer), ...)) чтобы размер буфера вычислялся автоматически.