Home › Forums › Discussions › Support › Фильтр string
Tagged: filter, packet filter, packet sniffer.
- This topic has 19 replies, 2 voices, and was last updated 3 years, 11 months ago by Vadim Smirnov.
-
AuthorPosts
-
December 6, 2020 at 12:45 pm #11411
Доброго времени суток Вадим Смирнов, надеюсь не потрачу много вашего времени попросив помощи в решении вот такой задачки.
Каждый день в силу некоторых обстоятельств мне приходится пользоваться iptables с перепрошитым роутером на DD-WRT.
Правило которое мне необходимо невозможно изобразить ни через powershell ни через любую другую существующую утилиту.
iptables -I FORWARD -s 192.168.1.100 -p udp –dport 21000:21200 –match string –algo kmp –string 76561198923445525 -j ACCEPT
Глядя на ваши труды, я вижу что здесь изображена функция фильтра и вроде тут имеется правильный (-match) параметр определяющий значение в пакетном фильтре.
Задача заблокировать все пакеты в которых НЕ содержится HEX или просто string значение для IP адреса на диапазоне портов.
Хотим заблокировать подключения из общего пула игрового сервера, ограничив разрешенным списком “своих” ребят.December 6, 2020 at 1:02 pm #11414В принципе ничего сложного, в этом примере решается почти подобная задача. Я бы еще добавил фильтр для диапазона портов, чтобы не гонять через user space весь трафик.
Нужна помощь с конкретным кодом?
December 6, 2020 at 1:22 pm #11415Да я сам обычный читатель с бюджетом в 100 баксов ищу фрилансера который напишет по вашему примеру экзешник.
Простой GUI при запуске скачивающий вашу библиотеку и после скачки открывающий диалог с тремя вариантами выбора, на 6 на 8 и на 12 человек.
Выбрав например первый вариант появляется 6 окошек, в каждое вставляем steam id каждого из друзей. Жмем lock и прогич сам парсит ID’ы в сетевые правила для фильтра для каждого ID’а в диапазоне udp портов 27000:27100.
Фильтр просто проверяет пакеты на steam id’ы и если они не подходят под вышеупомянутый список делает drop.Было б здорово если б я сам мог это все сделать, буду искать исполнителя на каких нибудь сайтах 🙂
Буду изучать пример.
December 6, 2020 at 3:05 pm #11417Каждый пакет в стриме содержит строку ID?
Если GUI не принципиален, то наверное могу набросать пример, может еще кому-нибудь будет полезно… ID можно из INI файла подтянуть или в командную строку передать, интерфейс рисовать для такой аппликухи лишняя морока…
December 6, 2020 at 6:10 pm #11418Я был бы признателен и мог бы заплатить, за рабочий вариант правила разрешающего конкретный HEX или циферный ид(значение) на диапазон портов. Тоесть нужен конкретно аналог вот этой команды.
iptables -I FORWARD -s 192.168.1.100 -p udp –dport 21000:21200 –match string –algo kmp –string 76561198923445525 -j ACCEPT
таким образом мы использовав 6 таких правил получаем запрет всех остальных участников на подключение.
iptables -I FORWARD -s 192.168.1.100 -p udp –dport 21000:21200 –match string –algo kmp –string 7656119892654674567 -j ACCEPT iptables -I FORWARD -s 192.168.1.100 -p udp –dport 21000:21200 –match string –algo kmp –string 765611989246576445525 -j ACCEPT iptables -I FORWARD -s 192.168.1.100 -p udp –dport 21000:21200 –match string –algo kmp –string 7656119892344677525 -j ACCEPT iptables -I FORWARD -s 192.168.1.100 -p udp –dport 21000:21200 –match string –algo kmp –string 76561198924665525 -j ACCEPT iptables -I FORWARD -s 192.168.1.100 -p udp –dport 21000:21200 –match string –algo kmp –string 7656119892377725 -j ACCEPT iptables -I FORWARD -s 192.168.1.100 -p udp –dport 21000:21200 –match string –algo kmp –string 76561198923433325 -j ACCEPT
Все остальные идут таким правилом в DROP
iptables -I FORWARD -s 192.168.1.100 -p udp --dport 27000:27200 --match string --algo kmp --hex-string '|73 74 65 61 6d 69 64 3a 37 36 35 36|' -j DROP
December 6, 2020 at 6:12 pm #11419Итогом получается, мы залетаем в рандомный пул противников, но разрешаем только игрокам из своего листа к нам подключится, а остальных обрубаем.
Извините если увлек вас своими игрульками, я уверен тема будет интересна и в контексте фаерволла, если настраивать ваш драйвер как цензор или фильтр пакетов по определенным значениям.
December 7, 2020 at 2:14 am #11420В принципе ничего сложного, надо только подумать как сделать что-то более-менее универсальное и при этом не слишком сложное. Писать парсер для IPTABLES как-то не хочется, наверное проще будет определить собственные правила в JSON формате. Поразмыслю на досуге над спецификацией…
December 8, 2020 at 5:43 pm #11421Я тогда буду мониторить этот тред с надеждой 🙂
December 9, 2020 at 3:16 am #11422Я начал потихоньку накидывать прототип, постараюсь сделать что-то несложное, но расширяемое. Как будет что-то рабочее – напишу в этой ветке.
December 9, 2020 at 11:38 am #11423В правиле ‘76561198923445525’ это ASCII строка в теле пакета?
December 9, 2020 at 12:32 pm #11424На деле это текст из пакета. Тоесть мы разрешаем все пакеты содержащие вот эти цифры на заданном диапазоне портов. И дропаем все пакеты на этих портах если там нету этих цифр, как ключ.
December 9, 2020 at 12:59 pm #11425Хорошо, спасибо. Я уже частично набросал формат правил навроде упрощенного IPTABLES в JSON формате, чтобы можно было загрузить массив правил из файла. Если будет время, то может закончу до выходных, сам фильтр на готовых правилах сделать несложно.
December 12, 2020 at 2:57 am #11427Еще очень сырой, но попробуйте.
Для работы требуется последний WinpkFilter. Правила загружаются из файла config.conf, пример одного правила есть в архиве: блокирует TCP пакеты по подстроке ntkernel.com, соответственно не дает зайти на https://www.ntkernel.com, так как имя домена находится в SNI.
Для примера, другое правило, блокирует http://www.ntkernel.com по IP:
{ "direction":"forward", "interface_name":"{C0420ADB-B1CD-4B01-845F-5BB41EE08687}", "source_ip_address":null, "destination_ip_address":{"address":"40.122.67.8","mask":"255.255.255.255"} "ip_protocol":"tcp", "source_port_range":null, "destination_port_range":[443,443], "string_match":null, "action":"drop" }
direction: возможные значения input, output, forward
FORWARD имеет несколько иной смысл чем в никсах, здесь он означает что правило будет примененно как к исходящим так и к входящим пакетам.interface_name: GUID сетевого интерфейса, если null – применяется ко всем доступным сетевым адаптерам.
source_ip_address и destination_ip_address указываются в формате как в примере выше.
ip_protocol: допустимые значения кроме null:
enum class ip_protocol :uint8_t { /* dummy for IP */ ip = 0, /* control message protocol */ icmp = 1, /* group management protocol */ igmp = 2, /* gateway^2 (deprecated) */ ggp = 3, /* tcp */ tcp = 6, /* pup */ pup = 12, /* user datagram protocol */ udp = 17, /* xns idp */ idp = 22, /* UNOFFICIAL net disk proto */ nd = 77, /* raw IP packet */ raw = 255 };
source_port_range и destination_port_range – диапазоны портов, с ними все понятно
string_match: ASCII строка для поиска в пакете
action: допустимые значения accept и drop
December 15, 2020 at 10:23 am #11428Простите, отмечал день рождения, затянулось, сегодня буду тестить.
December 16, 2020 at 1:38 am #11430Вернулся сегодня к этому коду, в предыдущей версии была ошибка в поиске подстроки. Здесь поправил.
-
AuthorPosts
- You must be logged in to reply to this topic.