Определение несколько адреса, используя только один iptables
команда с использованием ! --источник
это невозможно.
Адрес может быть сетевым именем, именем хоста (вероятно,
плохая идея использовать имена хостов), сетевой IP-адрес (с /mask) или обычный IP-адрес.
Маска может быть либо маской сети, либо обычным номером.
Вы можете рассмотреть возможность изменения набора правил по умолчанию с разрешения на удаление. Это позволит вам определить, основываясь только на том, что должно быть разрешено, т.е. примерно так:
iptables -A ВВОД -i lo -j ПРИНЯТЬ
iptables -A ВХОД -m состояние --state СВЯЗАННО, УСТАНОВЛЕНО -j ПРИНЯТЬ
... другие ваши правила идут здесь ...
iptables -A INPUT -m state --state NEW -p tcp --dport 22 -s 1.2.3.4,11.22.33.44 -j ПРИНЯТЬ
iptables -P ВХОД DROP
Преимущество/прелесть в том, что такой набор правил будет гораздо более производительным, поскольку учитывается состояние пакетов. Кроме того, он позволяет использовать желаемый синтаксис. Plus также является рекомендуемым способом определения правил брандмауэра.
Однако имейте в виду, что при использовании синтаксиса, как показано выше: -с 1.2.3.4,11.22.33.44
по-прежнему создает 2 отдельные записи в таблице, как вы можете видеть с помощью команды iptables -L ВВОД
. Кроме того, он работает не со всеми версиями iptables. Кроме того, лично мне трудно читать или поддерживать. Вот почему я стараюсь избегать этого в пользу использования двух отдельных команд.
Если вы хотите свести к минимуму количество правил, самое близкое, что вы можете сделать, это использовать один iptables
правило с использованием --соответствовать
вместо --источник
. Однако вам все равно придется определить совпадение, используя дополнительные команды. Как это работает, было прекрасно объяснено в другом комментарии, посвященном ipset.