cppmm 18.03.2010 13:21
Скрипты — Дискриминация по национальному признаку или баним страны.
Так получилось, что понадобилось прикрыть доступ к серверу из некоторых стран. Понимаю, что кровавая гебня и всё такое, но задача есть, надо сделать.Вот здесь находим архивчик с базой IP-адресов и их национальной принадлежностью. Далее за нас работает небольшой скрипт. Для работы скрипта понадобится дополнительно установить замечательную утилиту ipcalc.
Для определения списка стран, которые надо забанить используется файл, в котором просто перечисляются их коды:
# cat country_list
RU US GB
Запускается скрипт очень просто:
# ./geoiptban.sh country_list
P.S. Если кто подскажет способ выбирать из файла определённую строку по номеру без использования конвееров(в моём случае head, tail) буду признателен, а то часто приходится такое делать.
warchief 18.03.2010 15:09 #
+ 0 -
спасибо, как раз хотел создать топик-вопрос.
подскажите, как нужно изменить строку iptables.... , чтобы забанить соедниения из стран только на определённом порту?
iptables -t filter -A INPUT -s $(head -n ${i} ${TMPDIR}/$country_network_list | tail -n 1) -p ${PROTO} --dport ${PORT} -j DROP
И добавить две переменные PROTO и PORT.
Тогда, если выставить, напрмиер PROTO=tcp, а PORT=80, будет закрыт доступ к http-серверу(80-ый порт по протоколу tcp).
А еще можно при помощи модуля geoip (входит в xtables-addons):
iptables -t mangle -I PREROUTING -m geoip --dst-cc UA -j DROP
Сначал я хотел сделать именно так, но скрипт мне показалось, написать проще, чем компилировать пакет с iptables и его модулями.
с установкой конечно придется немного повозиться, но там, помимо geoip, еще много вкусностей:
Цепочки:
DELUDE - при обращении к порту, на котором стоит правило DELUDE, iptables отправляет сообщение SYN-ACK на SYN, но в остальных случаях отправляется RST сообщение. Тем самым вводит в заблуждение сканер атакующей машины, показывая что целевой порт открыт, в то время как на самом деле порт закрыт.
TARPIT - коннект в пустоту. При обращении к порту, на котором стоит правило TARPIT, iptables подтверждает запрос на TCP-соединение отправляя атакующему сообщение SYN-ACK, а так же принудительное установление размера TCP-окна, равным нулю. Это приводит к тому, что атакующая сторона не может передать никаких данных, а все ее попытки разорвать соединение игнорируются. До истечения тайм-аута (12-24 минут)соединение находится в "подвисшем" состоянии.
TEE - при обращении к порту, на котором стоит правило TEE, iptables отправляет копию этого пакета на другую машину сегмента локальной сети. Как бы зеркалирует этот пакет и направляет его по другому маршруту.
Модули:
geoip - используя этот модуль можно строить более гибкие правила iptables основываясь на геоположении IP-адреса в сети Интернет.
ipp2p - используя этот модуль можно осуществить фильтрацию трафика популярных P2P сетей:eDonkey, eMule, Direct Connect, KaZaA, Gnutella, BitTorrent, AppleJuice, WinMX, SoulSeek, Ares.
и еще что-то.
Цепочки:
DELUDE - при обращении к порту, на котором стоит правило DELUDE, iptables отправляет сообщение SYN-ACK на SYN, но в остальных случаях отправляется RST сообщение. Тем самым вводит в заблуждение сканер атакующей машины, показывая что целевой порт открыт, в то время как на самом деле порт закрыт.
TARPIT - коннект в пустоту. При обращении к порту, на котором стоит правило TARPIT, iptables подтверждает запрос на TCP-соединение отправляя атакующему сообщение SYN-ACK, а так же принудительное установление размера TCP-окна, равным нулю. Это приводит к тому, что атакующая сторона не может передать никаких данных, а все ее попытки разорвать соединение игнорируются. До истечения тайм-аута (12-24 минут)соединение находится в "подвисшем" состоянии.
TEE - при обращении к порту, на котором стоит правило TEE, iptables отправляет копию этого пакета на другую машину сегмента локальной сети. Как бы зеркалирует этот пакет и направляет его по другому маршруту.
Модули:
geoip - используя этот модуль можно строить более гибкие правила iptables основываясь на геоположении IP-адреса в сети Интернет.
ipp2p - используя этот модуль можно осуществить фильтрацию трафика популярных P2P сетей:eDonkey, eMule, Direct Connect, KaZaA, Gnutella, BitTorrent, AppleJuice, WinMX, SoulSeek, Ares.
и еще что-то.
хм поставил последнюю версию xtables-addons, потом делаю:
iptables -t mangle -I PREROUTING -m geoip --dst-cc UA -j DROP
>>iptables v1.4.4: Couldn't load match `geoip':/lib/xtables/libipt_geoip.so: cannot open shared object file: No such file or directory
Подскажите, что не так?
iptables -t mangle -I PREROUTING -m geoip --dst-cc UA -j DROP
>>iptables v1.4.4: Couldn't load match `geoip':/lib/xtables/libipt_geoip.so: cannot open shared object file: No such file or directory
Подскажите, что не так?
ок, с этим разобрался, теперь другая ошибка: /var/geoip/LE/DE.iv0: No such file or directory
iptables v1.4.4: Could not read geoip database
Где брать эти базы данных?
iptables v1.4.4: Could not read geoip database
Где брать эти базы данных?
Если кто подскажет способ выбирать из файла определённую строку по номеру без использования конвееров(в моём случае head, tail) буду признателен, а то часто приходится такое делать
sed -n 4p
выбирает четвертую
с диапазоном хуже:
sed -n 4~1p
выбирает c четвертой и с шагом 1 (т.е. каждую) до конца.
Потом head`ить, если нужно не все, т.е. все-таки конвейер :(
Только сейчас коммент заметил.
Респект.
Вот это то, что мне нужно. Если в цикле номер инкрементировать и подставлять в $() получается замечательно.
Спасибо.
Респект.
Вот это то, что мне нужно. Если в цикле номер инкрементировать и подставлять в $() получается замечательно.
sed -n 4p
Спасибо.
22.04.10 01:01
11.01.11 16:29
Только сейчас коммент заметил
11.01.11 16:29
Только сейчас коммент заметил
ответ через границу десятилетий!
мылинукс в веках... эпично...
забавно. теперь я буду искать в гугле:
"site:welinux.ru razum2um диапазон строк"
еще рецепт
диапазон строк (с первой по четвертую)
awk 'NR==1,NR==4' /etc/passwd
выборка (первая и четвертая)
awk 'NR==1;NR==4' /etc/passwd
"site:welinux.ru razum2um диапазон строк"
еще рецепт
диапазон строк (с первой по четвертую)
awk 'NR==1,NR==4' /etc/passwd
выборка (первая и четвертая)
awk 'NR==1;NR==4' /etc/passwd
Ну, вот. Опять ты выдал красивое решение, вместо моего костыля. :)
Просто, если в цикле пускать sed получалось долго и нудно. Поэтому я уже набросал себе под это дело скриптик на perl'е:
Просто, если в цикле пускать sed получалось долго и нудно. Поэтому я уже набросал себе под это дело скриптик на perl'е:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
использовать модуль geoip - тру.
Создавать кучу правил на INPUT/DROP - не тру:
КАЖДЫЙ входящий валидный пакет будет проходить ВСЕ эти DROP правила - непроизводительная нагрузка на ядро.
Создавать кучу правил на INPUT/DROP - не тру:
КАЖДЫЙ входящий валидный пакет будет проходить ВСЕ эти DROP правила - непроизводительная нагрузка на ядро.