Заблокируйте Китай с помощью iptables

10

Я только что вошел на сервер GitLab и заметил, что у него было 18,974 неудачных входа с момента последней проверки сервера - почти 5 дней. Я проверил Ip, и похоже, что почти все они были из Китая и пытались получить доступ с помощью SSH и Brute Force. Я начал блокировать некоторые IP-адреса, но потом понял, что это огромная трата времени, и лучшей идеей будет заблокировать всю страну.

Есть ли способ, которым я могу заблокировать ВСЕЙ Китай или любую другую страну с iptables?

Я нашел несколько статей в интернете, но почти все они - скрипты bash. Я новичок в Linux, поэтому я не совсем понимаю все эти сценарии. Я нахожу iptables действительно интересным и хочу узнать об этом больше.

Есть идеи ? Спасибо!

Каранфил Алегзандру
источник
4
Я решил ту же проблему по-другому. Я укрепил SSH на сервере GitLab моего клиента, отключив пароль и аутентификацию на основе запросов, и разрешил вход только с ключами SSL. Может быть, это будет работать в вашей ситуации? Блокировка диапазонов IP-адресов может уменьшить «шум», но это не даст вам реальной защиты от перебора.
blendenzo
до сих пор это не сработало. сервер gitlab все еще работает, и у меня было 0 взлома. Доступ по ssh осуществляется только с помощью ssh-ключей, и я отключил root-логин. Просто я так хочу выучить iptables ..
Каранфил Алегзандру
1
Вы также можете переключить ваш SSH на порт не по умолчанию в вашем маршрутизаторе. Это снизило количество попыток атаки ssh-бота с сотен в день до нуля.
Органический мрамор

Ответы:

7

Используя iptables для автоматической идентификации, а затем и блокировки, плохие парни для ssh могут быть сделаны с помощью recentмодуля. Следующий сегмент должен идти после вашей общей ESTABLISHED,RELATEDстроки:

...
$IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT
...
# Secure Shell on port 22.
#
# Sometimes I uncomment the next line to simply disable external SSH access.
# Particulalry useful when I am rebooting often, thereby losing my current BADGUY table.
# $IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 22 -j DROP

# Dynamic Badguy List. Detect and DROP Bad IPs that do password attacks on SSH.
# Once they are on the BADGUY list then DROP all packets from them.
# Sometimes make the lock time very long. Typically to try to get rid of coordinated attacks from China.
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j LOG --log-prefix "SSH BAD:" --log-level info
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j DROP
$IPTABLES -A INPUT -i $EXTIF -p tcp -m tcp --dport 22 -m recent --set --name BADGUY_SSH -j ACCEPT

Теперь, недавняя (последний год или два) проблема с Китаем состоит в том, что они стали очень умными и очень часто, когда они блокируются с одного IP-адреса, они просто переключаются на другой в той же подсети и продолжают. Это может привести к нехватке последних записей таблицы по умолчанию (я думаю, что по умолчанию 200). Я наблюдаю за этим, а затем просматриваю фактический сегмент IP и навсегда блокирую весь сегмент. В моем случае меня не волнует сопутствующий ущерб, т.е. блокировка кого-то невинного

#
# After a coordinated attack involving several sub-nets from China, they are now banned forever.
# List includes sub-nets from unknown origin, and perhaps Hong Kong
#
$IPTABLES -A INPUT -i $EXTIF -s 1.80.0.0/12 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.148.0.0/14 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.152.0.0/13 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.229.0.0/16 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.255.0.0/16 -d $UNIVERSE -j DROP
...

Где в приведенном выше:

# The location of the iptables program
#
IPTABLES=/sbin/iptables

#Setting the EXTERNAL and INTERNAL interfaces and addresses for the network
#
EXTIF="enp4s0"
INTIF="enp2s0"
EXTIP="...deleted..."
INTNET="192.168.111.0/24"
INTIP="192.168.111.1/32"
UNIVERSE="0.0.0.0/0"

Вы можете получить полный список IP-адресов для Китая или любой страны в формате iptables или в другом формате здесь . Однако список удивительно длинный и довольно динамичный. Я сам решил не блокировать весь список.

Дуг Смитис
источник
Это ^! Может быть, лучший ответ, который я когда-либо получал. Это может быть глупый вопрос, но я думаю, все эти правила входят в сценарий bash, верно? У меня все еще есть некоторые проблемы с пониманием iptables, но я нахожу это увлекательным.
Каранфил Алегзандру
Да, я использую скрипт bash. Некоторые, и я тоже использовал, используют прямой метод восстановления iptables, который быстрее загружается. Я изменил, потому что я включаю некоторые не-iptables команды в тот же скрипт.
Дуг Смитис
12

Китай блок с помощью ipset

Вы не можете вручную добавить несколько тысяч IP-адресов в ваши iptables, и даже делать это автоматически - плохая идея, потому что это может вызвать большую нагрузку на процессор (или я так читал). Вместо этого мы можем использовать ipset, который предназначен для такого рода вещей. ipset обрабатывает большие списки IP-адресов; вы просто создаете список и затем указываете iptables использовать этот список в правиле.

Заметка; Я предполагаю, что все следующее сделано как root. Отрегулируйте соответственно, если ваша система основана на sudo.

apt-get install ipset

Затем я написал небольшой Bash-скрипт для выполнения всей работы, который вы сможете понять из комментариев. Создать файл:

nano /etc/block-china.sh

Вот что вы хотите вставить в него:

# Create the ipset list
ipset -N china hash:net

# remove any old list that might exist from previous runs of this script
rm cn.zone

# Pull the latest IP set for China
wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone

# Add each IP address from the downloaded list into the ipset 'china'
for i in $(cat /etc/cn.zone ); do ipset -A china $i; done

# Restore iptables
/sbin/iptables-restore < /etc/iptables.firewall.rules

Сохраните файл. Сделайте его исполняемым:

chmod +x /etc/block-china.sh

Это еще ничего не сделало, но через минуту мы запустим скрипт. Во-первых, нам нужно добавить правило в iptables, которое ссылается на этот новый список ipset, который определяет приведенный выше скрипт:

nano /etc/iptables.firewall.rules

Добавьте следующую строку:

-A INPUT -p tcp -m set --match-set china src -j DROP

Сохраните файл. Чтобы было ясно, мой полный iptables.firewall.rules теперь выглядит так:

*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Block anything from China
# These rules are pulled from ipset's china list
# The source file is at /etc/cn.zone (which in turn is generated by a shell script at /etc/block-china.sh )
-A INPUT -p tcp -m set --match-set china src -j DROP

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT

Прямо сейчас, ничего не изменилось с сервером, потому что не было применено никаких новых правил; Для этого запустите скрипт block-china.sh:

/etc/block-china.sh

Это должно показать некоторый вывод, поскольку он извлекает новый список IP-адресов на китайском языке, а затем, через несколько секунд, он завершит работу и вернет вас обратно в командную строку.

Чтобы проверить, сработало ли это, запустите:

iptables -L

Теперь вы должны увидеть новое правило, блокирующее Китай - результат должен выглядеть следующим образом:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             loopback/8           reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
DROP       tcp  --  anywhere             anywhere             match-set china src
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
ACCEPT     icmp --  anywhere             anywhere
LOG        all  --  anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
DROP       all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

Почти готово! Это работает, и будет продолжать работать над перезагрузкой. Но IP-адреса меняются, и этот список со временем устаревает. Если вы хотите получить и применить обновленный список IP-адресов, вы можете просто снова запустить скрипт block-china.sh.

Мы также можем настроить машину на автоматическое выполнение этого задания cron:

crontab -e

Добавьте такую ​​строку:

* 5 * * * /etc/block-china.sh

Это будет запускать /etc/block-china.sh в 5 утра каждый день. Пользователь, выполняющий сценарий, должен быть пользователем root или иметь права root.

источник

Сурджит Сидху
источник
Зачем ограничивать его только протоколом TCP? Кажется, работает без указания протокола. Предложите использовать более новые агрегированные списки, так как они намного короче:wget http://www.ipdeny.com/ipblocks/data/aggregated/cn-aggregated.zone
Даг Смитис
Здесь нет ничего, что восстанавливает ipset после перезагрузки.
Дуг Смитис
4

Возможно, вы захотите установить что-то вроде fail2ban, чтобы он блокировал ips, которые пытаются зайти на ваш сервер и перестали работать.

Кайл Х
источник
я также мог бы использовать межсетевой экран csf и заблокировать каждую страну, которую я хочу, из файлов конфигурации. Дело в том, что я действительно хочу использовать iptables, чтобы узнать больше об этом.
Каранфил Алегзандру
Вы должны увидеть, в каких странах назначены блоки IP-адресов, чтобы определить, кого блокировать. Не уверен, будет ли это супер точным или нет. Вы можете использовать iptables -L, чтобы показать текущие правила iptables, iptables-save, чтобы показать, какие команды были запущены для создания указанных правил, затем разработать свои собственные правила и провести тестирование на тестовых машинах, чтобы узнать об этом. Вот как я это узнал.
Кайл Х
0

Вы можете использовать geoip-модуль для iptables: https://linoxide.com/linux-how-to/block-ips-countries-geoip-addons/

После обновления нашей системы и установки зависимостей мы теперь установим дополнения xtables на нашем компьютере. Для этого мы загрузим последнюю версию tarball с официального сайта проекта xtables-addons с помощью wget. Как только он будет загружен, мы распакуем архив, затем скомпилируем и установим его на наш компьютер.

wget http://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/xtables-addons-2.13.tar.xz
tar xf xtables-addons-2.13.tar.xz
cd xtables-addons-2.13
./configure
make
make install [...]

Далее мы запустим модуль с именем xt_geoip, который поставляется с расширением xtables-addons, которое загружает базу данных GeoIP из MaxMind и преобразует ее в двоичную форму, распознаваемую xt_geoip. После того, как он загружен, мы будем строить его и переместить их к нужному xt_geoipпути , т.е. /usr/share/xt_geoip.

cd geoip
./xt_geoip_dl
./xt_geoip_build GeoIPCountryWhois.csv
mkdir -p /usr/share/xt_geoip/
cp -r {BE,LE} /usr/share/xt_geoip/

Вот основной синтаксис использования iptables с модулем geoip для блокировки трафика, исходящего из страны или предназначенной для нее. Здесь нам нужно использовать двухбуквенный код ISO3166 вместо страны, например, США для США, IE для Ирландии, IN для Индии, CN для Китая и так далее.

iptables -m geoip --src-cc country[,country...] --dst-cc country[,country...]
Маркус Ленгер
источник
0

Вы используете IP2Location Firewall List для создания iptables для Китая.

Файл в следующем формате. Запустите его в оболочке, и вы должны заблокировать все китайские IP-адреса.

iptables -A INPUT -s 8.8.8.8/24 -j DROP
Майкл С.
источник