первая публикация на ServerFault, так что я постараюсь все исправить :)
У меня есть несколько сред (например, prod, dev, test и т. Д.), И я пытаюсь написать файл IPTables для своих серверов RHEL 6.6, который позволяет определенным группам машин общаться между этими средами через определенные порты.
Первоначально правила для каждой отдельной целевой или исходной подсети, определенной в отдельной строке, работали, однако результирующий файл iptables довольно большой. В попытке упростить / очистить набор правил я попытался объединить правила для нескольких IP-адресов источника или назначения, использующих одни и те же порты.
Я нашел соответствующую статью ServerFault по этому вопросу IPTables с несколькими исходными IP-адресами но, похоже, самый высоко оцененный пример мне не подходит.
Например, попытка объединить следующие два правила:
-A INPUT -i $INTERFACE -m conntrack --ctstate NEW,ESTABLISHED,RELATED -s $CV1 -p tcp --dport 8400:8403 -j ACCEPT -m comment --comment "Source 1"
-A INPUT -i $INTERFACE -m conntrack --ctstate NEW,ESTABLISHED,RELATED -s $CV2 -p tcp --dport 8400:8403 -j ACCEPT -m comment --comment "Source 2"
В это:
-A INPUT -i $INTERFACE -m conntrack --ctstate NEW,ESTABLISHED,RELATED -s $CV1,$CV2 -p tcp --dport 8400:8403 -j ACCEPT -m comment --comment "Not Working!"
У меня также есть правила, которые смешивают как несколько исходных, так и несколько целевых IP-адресов (аналогично безуспешно):
-A INPUT -i $INTERFACE -s $FOO1,$FOO2 -d $FOO1,$FOO2 -p tcp --dport 8400:8403 -j ACCEPT
-A OUTPUT -o $INTERFACE -s $FOO1,$FOO2 -d $FOO1,$FOO2 -p tcp --dport 8400:8403 -j ACCEPT
Примечание. Файл / etc / sysconfig / iptables написан моим настраиваемым сценарием конфигурации (отсюда и переменные $), а IP-адреса определены следующим образом:
CV1=10.1.1.0/27
CV2=10.25.128.128/29
FOO1=10.1.30.140/30
FOO2=10.2.30.140/30
Сбои трафика отслеживаются правилами отклонения / регистрации в нижней части файла IPTables:
-A INPUT -i $INTERFACE -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "Packet Rejected. "
-A FORWARD -i $INTERFACE -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "Packet Forward Rejected. "
-A OUTPUT -o $INTERFACE -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "Packet Dropped. "
-A INPUT -i $INTERFACE -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -i $INTERFACE -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -o $INTERFACE -j REJECT --reject-with icmp-host-prohibited
Ссылаясь на запись на странице руководства IPTables, похоже, что она должна работать:
[!] -s, - адрес источника [/ маска] [, ...]
Спецификация источника. Адрес может быть либо сетевым именем, либо именем хоста, либо сетевым IP-адресом (с / mask), либо обычным IP-адресом. Имена хостов будут разрешены только один раз, прежде чем правило будет отправлено ядру. Обратите внимание, что указывать любое имя, которое будет разрешено удаленным запросом, например DNS, - действительно плохая идея. Маска может быть либо сетевой маской, либо простым числом, определяющим количество единиц в левой части сетевой маски. Таким образом, маска 24 эквивалентна 255.255.255.0. А "!" Аргумент перед спецификацией адреса меняет смысл адреса. Флаг --src - это псевдоним для этой опции.
Можно указать несколько адресов, но это расширится до нескольких правил (при добавлении с -A) или приведет к удалению нескольких правил (с -D).[!] -d, - адрес назначения [/ маска] [, ...]
Спецификация места назначения. См. Подробное описание синтаксиса в описании флага -s (источник). Флаг --dst - это псевдоним для этой опции.
Может ли кто-нибудь объяснить мне, что я здесь делаю не так?
Я скопировал ваше первое комбинированное правило iptables в свой ящик Ubuntu, и у меня оно сработало:
iptables -A INPUT -i wlan0 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -s 172.16.10.0/24,172.16.9.0/24 -p tcp --dport 8400:8403 -j ACCEPT -m comment --comment "Working! :)"
Я не получил никаких результатов после этой команды, что означает успех. Я также успешно выполнил вашу команду multi-source-destination:
iptables -A INPUT -i wlan0 -s 172.16.10.0/24,172.16.9.0/24 -d 172.16.10.0/24,172.16.9.0/24 -p tcp --dport 8400:8403 -j ACCEPT
Единственные изменения, которые я внес в ваши команды, касались интерфейса и исходных сетей, поскольку я не использовал сценарий для тестирования ваших команд.
Вы разместили свои сетевые переменные в своем вопросе, но не опубликовали переменную $ INTERFACE. Его нет в сценарии? Или, возможно, недоступен, если этот сценарий отделен от сценария, в котором объявлена переменная?
Что будет на выходе, если вы запустите сценарий iptables с комбинированными правилами источника / назначения?