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

<p>я хотел бы создать одно правило в iptables (если это возможно), которое использует несколько исходных ip-адресов. это возможно?</p>

<p>это возможно только в том случае, если вы можете объединить нужные ip-адреса источника в непрерывный диапазон. например</p><pre><code>iptables -a input -s 192.168.0.0/24 -d 192.168.0.5 -p tcp -j accept </code></pre><p>если вы не можете найти общую маску сети, которая охватывает ip-адреса, которые вы хотите, вам придется написать несколько идентичных правил, чтобы делать то, что вы хотите.</p><p>существует несколько структур iptables, которые могут справиться с низким уровнем написания правил iptables, что позволяет вам определять свои правила на более символическом уровне. <a href="http://www.shorewall.net/">shorewall</a> - это распространенная версия, которая поставляется с большинством современных дистрибутивов linux.</p>

<p>чтобы добавить несколько источников в одну команду, я бы сделал это:</p><pre><code>iptables -t filter -a input -s 192.168.1.1,2.2.2.2,10.10.10.10 -j accept </code></pre><p>iptables автоматически переведет его в <strong>несколько правил</strong>.</p>

<p>первоначальный вопрос относится к маю 2009 года, но с мая 2011 года в ядре linux появилась функция для удовлетворения этой потребности, называемая <strong>ipset</strong>.</p><p>вот пример создания ipset, добавления адресов к нему, а затем использования его в правиле брандмауэра:</p><pre><code>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 </code></pre><p>видеть <code>man iptables</code> а также <code>man ipset</code> для получения дополнительной информации.</p>

<p>вы можете использовать модуль iprange в сочетании с '--src-range', как для e.x .:</p><pre><code>-a input -i eth0 -m iprange --src-range 192.168.1.90-192.168.1.101 -j accept </code></pre><p>источник: страница руководства iptables 1.4.7</p><pre><code> 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. </code></pre><p>(я знаю, что это как 4-летний вопрос, но просто ответить на любой, кто ищет это в сети)</p>

<p>в дополнение к комментарию bòss king вы также можете просто указать несколько адресов, разделенных запятой:</p><pre><code>[!] -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). </code></pre>

<p>вы можете определить несколько цепочек, так что вы можете комбинировать независимые списки требований. я сомневаюсь, что это именно то, что вы хотите, но это все еще довольно удобно. мы используем это для определения списков допустимых типов пользователей по ip, а затем применяем ограничения портов к исходным сетям. так, например:</p><pre><code># 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 </code></pre>