- Блог пользователя administrator
- Комментировать
- 184158 reads
Метки: iptables, shell script
если у вас есть необходимость закрыть целиком страну от попыток взлома или ДОС-атак или просто так с помощью iptables необходимо сделать следующее:
Linux as01.test.local 2.6.18-308.4.1.el5 #1 SMP Tue Apr 17 17:08:10 EDT 2012 i686 i686 i386 GNU/Linux
iptables v1.3.5
ipset v4.5, protocol version 4.
Kernel module protocol version 4.
1. установка ipset:
i386:
rpm -ihv http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
rpm -ihv http://centos.alt.ru/repository/centos/5/i386/centalt-release-5-3.noarch...
x86_64:
rpm -ihv http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
rpm -ihv http://centos.alt.ru/repository/centos/5/x86_64/centalt-release-5-3.noar...
[root@as01 ~]#modprobe ip_set
проверяем работу ipset -
iptables v1.3.5: Couldn't load match `set':/lib/iptables/libipt_set.so: cannot open shared object file: No such file or directory
не работает так как не хватает модуля libipt_set.so -
libip6t_ah.so libip6t_length.so libip6t_rt.so libipt_connmark.so libipt_icmp.so libipt_NFQUEUE.so libipt_sctp.so libipt_TOS.so
libip6t_connmark.so libip6t_limit.so libip6t_standard.so libipt_CONNMARK.so libipt_iprange.so libipt_NOTRACK.so libipt_set.so libipt_TRACE.so
libip6t_CONNMARK.so libip6t_LOG.so libip6t_state.so libipt_conntrack.so libipt_length.so libipt_owner.so libipt_SNAT.so libipt_ttl.so
libip6t_DSCP.so libip6t_mac.so libip6t_tcp.so libipt_dccp.so libipt_limit.so libipt_physdev.so libipt_standard.so libipt_TTL.so
libip6t_dst.so libip6t_mark.so libip6t_TRACE.so libipt_DNAT.so libipt_LOG.so libipt_pkttype.so libipt_state.so libipt_udp.so
libip6t_eui64.so libip6t_MARK.so libip6t_udp.so libipt_dscp.so libipt_mac.so libipt_policy.so libipt_statistic.so libipt_ULOG.so
libip6t_frag.so libip6t_multiport.so libipt_addrtype.so libipt_DSCP.so libipt_mark.so libipt_realm.so libipt_string.so libipt_unclean.so
libip6t_hbh.so libip6t_NFQUEUE.so libipt_ah.so libipt_ecn.so libipt_MARK.so libipt_recent.so libipt_TARPIT.so
libip6t_hl.so libip6t_owner.so libipt_CLASSIFY.so libipt_ECN.so libipt_MASQUERADE.so libipt_REDIRECT.so libipt_tcpmss.so
libip6t_HL.so libip6t_physdev.so libipt_CLUSTERIP.so libipt_esp.so libipt_MIRROR.so libipt_REJECT.so libipt_TCPMSS.so
libip6t_icmpv6.so libip6t_policy.so libipt_comment.so libipt_hashlimit.so libipt_multiport.so libipt_rpc.so libipt_tcp.so
libip6t_ipv6header.so libip6t_REJECT.so libipt_connlimit.so libipt_helper.so libipt_NETMAP.so libipt_SAME.so libipt_tos.so
необходимо взять этот модуль из более ранней версии iptables -
[root@as01 ~]# wget http://centos.alt.ru/repository/centos/5/i386/iptables-1.3.5-5.6.1.el5.i386.rpm
[root@as01 ~]# rpm2cpio iptables-1.3.5-5.6.1.el5.i386.rpm |cpio -idmv
[root@as01 ~]# cp /tmp/lib/iptables/libipt_set.so /lib/iptables/
[root@as01 ~]# iptables -m set
iptables v1.3.5: You must specify `--set' with proper arguments
Try `iptables -h' or 'iptables --help' for more information.
теперь iptables и ipset работают вместе, можно указывать параметры --set в правилах.
2. создаем сет адресов и добавляем туда данные:
тут https://www.countryipblocks.net/country_selection.php можно выбрать любую страну и создать адреса в формате CIDR для использования в ipset.
создаем файл - например ipset-usa и заносим в него данные. после этого делаем скрипт для записи данных в сет -
[root@as01 ~]# cat /etc/sysconfig/iptables-ipset
ipset create list-usa nethash
while read IP; do
ipset add list-usa $IP
done < ip-list-file
кладет его в одну папку с файлом данных и запускаем.. после этого должен создаться сет с именем list-usa из файла ip-list-file
Name: list-usa
добавляем правило -
-A INPUT -m set --set list-usa src -j DROP
после этого любые адреса США будут блокироваться при доступе к вашему серверу.
3. восстановление после перезагрузки:
делаем сохранение ipset в файл -
[root@as01 sysconfig]# ipset --save mgmt > iptables-ipset-save
создаем скрипт -
#!/bin/bash
/sbin/ipset --restore < /etc/sysconfig/iptables-ipset-save
/sbin/iptables-restore /etc/sysconfig/iptables
добавляем скрипт в rc.local -
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
/etc/sysconfig/iptables-rc start
и после перезагрузки проверяем, во время загрузки будет ошибка что iptables не смог восстановить правила, но спустя 3 сек после загрузки все стало как надо.
еще конечно, чтобы видеть что блокируется лучше настраивать цепочку LOG, а после этого смотреть что и как.
если есть вопросы или комментарии - пишите nd[ухо]forceit[точка]ру.
материалы:
http://ipset.netfilter.org/ipset.man.html
http://k0st1an.blogspot.ru/2013/01/centos-ipset.html
http://blather.michaelwlucas.com/archives/1679
https://www.countryipblocks.net/country_selection.php
http://serverfault.com/questions/474073/how-to-load-a-list-of-addresses-...