Назад | Перейти на главную страницу

iptables несколько исходных IP-адресов в одном правиле

Я хотел бы создать одно правило в iptables (если возможно), которое использует несколько исходных IP-адресов. Это возможно?

Чтобы добавить несколько источников в одну команду, я бы сделал следующее:

iptables -t filter -A INPUT -s 192.168.1.1,2.2.2.2,10.10.10.10 -j ACCEPT

iptables автоматически переведет его в несколько правил.

Первоначальный вопрос был задан в мае 2009 года, но с мая 2011 года в ядре Linux появилась функция для решения этой проблемы, которая называется ipset.

Вот пример создания ipset, добавления к нему адресов и последующего использования в правиле брандмауэра:

ipset -N office365 iphash

ipset -A office365 132.245.228.194
ipset -A office365 132.245.77.34
ipset -A office365 132.245.48.34
ipset -A office365 132.245.68.242
ipset -A office365 132.245.55.2
ipset -A office365 40.101.17.98
ipset -A office365 132.245.48.18
ipset -A office365 132.245.229.114
ipset -A office365 132.245.196.34
ipset -A office365 132.245.56.114

iptables -A OUTPUT -m set --match-set office365 dst -j ACCEPT

Видеть man iptables и man ipset для получения дополнительной информации.

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

iptables -A INPUT -s 192.168.0.0/24 -d 192.168.0.5 -p tcp -j ACCEPT

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

Существует несколько фреймворков iptables, которые могут справиться с низким уровнем написания правил iptables, позволяя вам определять свои правила на более символическом уровне. Shorewall распространен в большинстве последних дистрибутивов Linux.

вы можете использовать модуль iprange в сочетании с '--src-range', как для e.x .:

-A INPUT -i eth0 -m iprange --src-range 192.168.1.90-192.168.1.101 -j ACCEPT

Источник: страница руководства iptables 1.4.7

   iprange
   This matches on a given arbitrary range of IP addresses.

   [!] --src-range from[-to]
          Match source IP in the specified range.

   [!] --dst-range from[-to]
          Match destination IP in the specified range.

(я знаю, что это как вопрос четырехлетней давности, но просто чтобы ответить для всех, кто ищет это в сети)

Помимо комментария Bòss King, вы также можете просто указать несколько адресов через запятую:

[!] -s, --source address[/mask][,...]
      Source specification. Address can be either a network name, a hostname, a network IP address (with /mask), or a plain IP address. Hostnames will be resolved once only, before the rule is submitted to the kernel.  Please note  that  specifying
      any  name  to  be resolved with a remote query such as DNS is a really bad idea.  The mask can be either a network mask or a plain number, specifying the number of 1's at the left side of the network mask.  Thus, a mask of 24 is equivalent to
      255.255.255.0.  A "!" argument before the address specification inverts the sense of the address. The flag --src is an alias for this option.  Multiple addresses can be specified, but this will expand to multiple rules (when adding with  -A),
      or will cause multiple rules to be deleted (with -D).

Вы можете определить несколько цепочек, чтобы вы могли комбинировать независимые списки требований. Сомневаюсь, что это именно то, что вам нужно, но все же довольно удобно. Мы используем это, чтобы определить списки допустимых типов пользователей по IP, а затем применить ограничения портов к исходным сетям. Так, например:

# Allow SMTP from anywhere
-A tcp_inbound -p tcp -m tcp -s 0/0 --dport 25 -j allowed
#
# Define the set of IP ranges we'll send to the tcp_user_inbound chain
-A tcp_inbound -p tcp -m tcp -s 172.19.1.0/24 -j tcp_user_inbound
-A tcp_inbound -p tcp -m tcp -s 172.19.6.0/23 -j tcp_user_inbound
-A tcp_inbound -p tcp -m tcp -s 172.19.8.0/24 -j tcp_user_inbound
-A tcp_inbound -p tcp -m tcp -s 172.19.10.0/23 -j tcp_user_inbound
-A tcp_inbound -p tcp -m tcp -s 172.19.12.0/23 -j tcp_user_inbound
-A tcp_inbound -p tcp -m tcp -s 172.19.4.0/23 -j tcp_user_inbound
#
# Ports we allow access to based on a source-address prereq.
# SSH
-A tcp_user_inbound -p tcp -m tcp --dport 22 -j allowed
# VNC
-A tcp_user_inbound -p tcp -m tcp --dport 5950:5958 -j allowed
# https
-A tcp_user_inbound -p tcp -m tcp --dport 443 -j allowed

Предположим, например, что вы хотите принимать только SMTP-пакеты, поступающие из 10.0.0.2 или 192.168.1.2. Вы можете использовать следующие правила:

  # create a new chain
  iptables --new-chain multiple_sources_smtp
  # send all SMTP connections to the new chain
  iptables --append INPUT --protocol tcp --dport 25 --jump multiple_sources_smtp
  # use the default INPUT rules for packets coming from allowed sources
  iptables --append multiple_sources_smtp --source 10.0.0.2 --jump RETURN
  iptables --append multiple_sources_smtp --source 192.168.1.2 --jump RETURN
  # drop packets from anywhere else
  iptables --append multiple_sources_smtp -j DROP

Или как результат iptables-save

  # Generated by iptables-save v1.4.14 on Sat Dec  6 09:17:11 2014
  *filter
  :INPUT ACCEPT [32:13325]
  :FORWARD ACCEPT [0:0]
  :OUTPUT ACCEPT [25:3084]
  :multiple_sources_smtp - [0:0]
  -A INPUT -p tcp -m tcp --dport 25 -j multiple_sources_smtp
  -A multiple_sources_smtp -s 10.0.0.2/32 -j RETURN
  -A multiple_sources_smtp -s 192.168.1.2/32 -j RETURN
  -A multiple_sources_smtp -j DROP
  COMMIT
  # Completed on Sat Dec  6 09:17:11 2014