Блокуйте Китай за допомогою iptables


10

Я щойно увійшов на сервер GitLab і помітив, що у нього 18.974 невдалих входів, оскільки я востаннє перевіряв сервер - майже 5 днів. Я перевірив Ip і, схоже, майже всі вони були з Китаю і намагалися отримати доступ із SSH та Brute Force. Я почав блокувати деякі Ip, але потім зрозумів, що це величезна витрата часу і кращою ідеєю було б блокувати всю країну.

Чи можу я заблокувати ВСІЙ Китай чи будь-яку іншу країну iptables?

Я знайшов деякі статті в Інтернеті, але майже всі вони є скриптовими сценаріями. Я новачок в Linux, тому я не дуже розумію всі ці сценарії. Я вважаю iptables дійсно цікавими, і я хочу дізнатися більше про нього.

Будь-які ідеї? Дякую!


4
Я вирішив ту саму проблему по-іншому. Я загартовував SSH на сервері GitLab свого клієнта, вимикаючи пароль та оскаржуючи автентифікацію та дозволяючи входити лише з ключами SSL. Можливо, це спрацювало б у вашій ситуації? Блокування діапазонів IP може зменшити "шум", але це не дасть вам реального захисту від грубої форсировки.
blendenzo

поки що це не спрацювало. сервер gitlab все ще працює, і у мене було 0 проривів. Доступ до Ssh робиться лише за допомогою ssh-ключів, і я відключив кореневий логін. Просто я хочу так погано навчитися iptables ..
Caranfil Alegzandru

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, або інші, формат тут . Однак список є напрочуд довгим і досить динамічним. Сам я вирішив не блокувати весь список.


Це ^! Можливо, це буде найкраща відповідь, яку я коли-небудь отримував. Це може бути німим питанням, але я гадаю, що всі ці правила переходять у сценарій баш, правда? У мене все ще є проблеми з розумінням iptables, але я вважаю це захоплюючим.
Каранфіл Алегзандру

Так, я використовую сценарій bash. Деякі, і я теж використовував метод прямого відновлення iptables, який швидше завантажується. Я змінив, тому що я включаю кілька команд, які не використовуються iptables, у той самий сценарій.
Doug Smythies

12

Китай блокують за допомогою ipset

Ви не можете вручну додати кілька тисяч IP-адрес до своїх iptables, і навіть робити це автоматично - це погана ідея, оскільки це може спричинити велике завантаження процесора (або я так читав). Натомість ми можемо використовувати ipset, який призначений для подібних речей. ipset обробляє великі списки ip-адрес; ви просто створіть список і потім скажете iptables використовувати цей список у правилі.

Примітка; Я припускаю, що все наступне зроблено як корінь. Відповідно налаштуйте, якщо ваша система базується на sudo.

apt-get install ipset

Далі я написав невеликий сценарій Баша, щоб виконати всю роботу, яку ви повинні мати змогу зрозуміти з коментарів до неї. Створіть файл:

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
Doug Smythies

Тут ніщо не відновлює ipset після перезавантаження.
Doug Smythies

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-аддони в нашу машину. Для цього ми завантажимо останню тарболу з офіційного сайту 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...]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.