
Обновлять:
Я пробовал 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