Как добавить несколько IP-адресов в одну командную строку iptables? sudo iptables -A INPUT -p tcp --dport 22 ! -s 1.2.3.4 -j DROP

Как добавить несколько IP-адресов в одну командную строку iptables? sudo iptables -A INPUT -p tcp --dport 22 ! -s 1.2.3.4 -j DROP

Обновлять:

Я пробовал sudo iptables -A INPUT -p tcp --dport 22 ! -s 1.2.3.4,11.22.33.44 -j DROP, но не работает, выдает ошибку

iptables v1.8.2 (nf_tables): ! не допускается с несколькими исходными или целевыми IP-адресами


Например, моя цель — разрешить только 1.2.3.4подключение 11.22.33.44по ssh (порт 22) моего сервера.

И я предпочитаю этот подход/команду другим.

sudo iptables -A INPUT -p tcp --dport 22 ! -s 1.2.3.4 -j DROP

Но я не знаю, как добавить еще один разрешенный IP 11.22.33.44в этой команде,

Не могли бы вы мне немного помочь или дать совет?

Спасибо.

решение1

Определениенесколькоадреса, использующие толькоодин iptablesиспользование команды ! --sourceневозможно.

Адрес может быть либо сетевым именем, либо именем хоста (вероятно, это действительно плохая идея использовать имена хостов), либо сетевым IP-адресом (с /mask), либо простым IP-адресом. Маска может быть либо сетевой маской, либо простым числом.

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

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
... your other rules goes here ...
iptables -A INPUT -m state --state NEW -p tcp --dport 22 -s 1.2.3.4,11.22.33.44 -j ACCEPT
iptables -P INPUT DROP

Преимущество/красота в том, что такой набор правил будет гораздо более производительным, поскольку учитывается состояние пакетов. Плюс он допускает желаемый синтаксис. Плюс также является рекомендуемым способом определения правил брандмауэра.

Однако, пожалуйста, имейте в виду, что при использовании синтаксиса, как показано выше: -s 1.2.3.4,11.22.33.44все равно создаются 2 отдельные записи таблицы, как вы можете видеть с помощью команды iptables -L INPUT. Кроме того, это работает не со всеми версиями iptables. Кроме того, лично мне это трудно читать и поддерживать. Вот почему я стараюсь избегать этого, предпочитая использовать 2 отдельные команды.

Если вы хотите минимизировать количество правил, то самое близкое, что вы можете сделать, это использоватьодин iptablesправило, использующее --matchвместо --source. Однако вам все равно придется определять соответствие, используя дополнительные команды. Как это работает, было прекрасно объяснено в другом комментарии, который касается ipset.

решение2

Вы можете использоватьIP-набор.

В зависимости от вашего дистрибутива вам может потребоваться ipsetсначала установить утилиту.

#(For Debian and Debian-derived distros)
sudo apt install ipset-persistent

Затем вы создаете набор с понятным именем.

sudo ipset create ssh_friends iphash

После того, как у вас есть набор, вы можете добавлять в него IP-адреса.

sudo ipset add ssh_friends 1.2.3.4
sudo ipset add ssh_friends 11.22.33.44

Теперь вы можете использовать созданный вами набор в iptablesправиле вместо отдельных IP-адресов.

sudo iptables -A INPUT -p tcp --destination-port 22 -m set ! --match-set ssh_friends src -j DROP

Связанный контент