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

IPTABLES nat, поддерживающий исходный IP-адрес с помощью CSF

Мы успешно использовали CSF в виртуализированной (OpenVZ) среде в течение некоторого времени, сочетая Venet и мостовые интерфейсы, поэтому мы можем использовать общедоступные IP + виртуальные системы с локальными адресами.

Kernel IP routing table
Destination       Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.0.100        0.0.0.0         255.255.255.255 UH    0      0        0 venet0
xxx.xxx.xxx.24    0.0.0.0         255.255.255.255 UH    0      0        0 venet0
xxx.xxx.xxx.0     0.0.0.0         255.255.255.0   U     0      0        0 vmbr0
10.0.0.0          0.0.0.0         255.255.255.0   U     0      0        0 vmbr10
0.0.0.0           xxx.xxx.xxx.254 0.0.0.0         UG    0      0        0 vmbr0

Маршрутизируем трафик «локальных» IP-адресов с помощью правила iptables:

iptables -t nat -A POSTROUTING -s "10.0.0.0/24" -o vmbr0 -j MASQUERADE

/ proc / sys / net / ipv4 / ip_forward значение явно установлено на 1

На сетевых машинах хоста и Venet выполняется собственная установка CSF, которая создает все правила брандмауэра для этой настройки, включая возможность создания «перенаправлений» на внутренние IP-адреса.

Благодаря этому мы можем открывать определенные порты на IP-адресе хоста, которые обслуживаются локальными внутренними виртуальными машинами в локальной сети. Среди длинного списка правил брандмауэра, которые создает CSF:

Chain PREROUTING (policy ACCEPT 53M packets, 15G bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 DNAT       tcp  --  !lo    *       0.0.0.0/0            XXX.XXX.XXX.184      tcp dpt:5100 to:10.0.0.100:5000 

Chain POSTROUTING (policy ACCEPT 9700K packets, 615M bytes)
num   pkts bytes target     prot opt in     out     source               destination         

3        0     0 SNAT       tcp  --  *      !lo     0.0.0.0/0            10.0.0.100          to:XXX.XXX.XXX.184 
8       10   600 MASQUERADE  all  --  *      vmbr0   10.0.0.0/24          0.0.0.0/0           

Функция перенаправления на брандмауэре CSF работает, но сообщается IP-адрес хоста, а не исходный IP-адрес, поэтому мы не можем ограничить его другим экземпляром CSF (или простым правилом брандмауэра) в целевой виртуальной системе. Мы понимаем, что, находясь на PREROUTING, они также не могут быть ограничены на CSF хоста.

В файле readme CSF на самом деле говорится «Все перенаправления на другой IP-адрес всегда будут отображаться на целевом сервере с указанием источника этого сервера, а не исходного IP-адреса». так что это стандартная функция.

CSF поддерживает файл postrules.sh, в который мы могли бы включить правила NAT вручную, но мы не уверены, можно ли с помощью IPTABLES SNAT и / или DNAT передать «реальный» исходный IP-адрес назначения IP-адреса NAT.

Единственный способ увидеть "настоящий" исходный IP-адрес, о котором вы упомянули, в пункте назначения - это избегать его натяжения или маскировки. Помните, что SNAT и DNAT обозначают ПЕРЕВОД исходной и целевой сети соответственно, поэтому, как только пакет проходит правила Наттинга, адреса источника / назначения "меняются" навсегда. Вы не можете получить их в пункте назначения.

Вопрос:

Мы не уверены, можно ли с помощью IPTABLES SNAT и / или DNAT передать "настоящий" исходный IP-адрес получателю.

Ответ:

Да, это возможно, и вот как это сделать, если вы используете CSF. Не полагайтесь на функцию перенаправления CSF, то есть на наличие строки, подобной следующей в /etc/csf/csf.redirect:

XXX.XXX.XXX.184|2222|10.0.0.100|22|tcp

Вместо этого поместите следующее iptables команды в /etc/csf/csfpost.sh:

/sbin/iptables -I FORWARD -i vmbr0 -o vmbr10 -d 10.0.0.0/24 -j ACCEPT
/sbin/iptables -I FORWARD -i vmbr0 -o vmbr10 -d 10.0.0.0/24 -j LOCALINPUT
/sbin/iptables -t nat -A PREROUTING -i vmbr0 -p tcp -m tcp --dport 2222 -j DNAT --to-destination 10.0.0.100:22

Тест:

$ ssh xxx.xxx.xxx.184 -p 2222 'netstat -tn'
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0     72 10.0.0.100:22           xxx.xxx.xxx.199:55812   ESTABLISHED

Пояснение:

/sbin/iptables --table nat --append PREROUTING --in-interface vmbr0 --protocol tcp --match tcp --dport 2222 --jump DNAT --to-destination 10.0.0.100:22

Эта линия перенаправляет TCP-трафик, поступающий на внешний интерфейс на порт. 2222 на внутренний адрес 10.0.0.100 в порту 22.

  • /sbin/iptables полный iptables требуется исполняемый файл.
  • --table nat работает над таблицей nat (преобразование сетевых адресов).
  • --append PREROUTING добавьте это правило после всех существующих правил в PREROUTING цепь.
  • --in-interface vmbr0 поймать весь трафик, идущий на vmbr0 интерфейс.
  • --protocol tcp ловит только tcp трафик.
  • --match tcp используйте модуль tcp.
  • --dport 2222 ловить только трафик, направленный в порт 2222.
  • --jump DNAT выполнить преобразование сетевого адреса назначения.
  • --to-destination 10.0.0.100:22 изменить адрес назначения на 10.0.0.100 и порт назначения в 22.
/sbin/iptables --insert FORWARD --in-interface vmbr0 --out-interface vmbr10 --destination 10.0.0.0/24 --jump LOCALINPUT

Эта строка позволяет не пропускать всю фильтрацию CSF только потому, что мы перенаправляем.

  • /sbin/iptables полный iptables требуется исполняемый файл.
  • --insert FORWARD вставьте это правило перед существующими правилами в FORWARD цепь. Именно сюда отправляются перенаправленные пакеты, в отличие от, например, к INPUT цепь.
  • --in-interface vmbr0 соответствовать трафику, поступающему на vmbr0 интерфейс.
  • --out-interface vmbr10 совпадение трафика, выходящего из vmbr0 интерфейс как эффект перенаправления.
  • --destination 10.0.0.0/24 соответствовать только трафику, предназначенному (перенаправленному) во внутреннюю сеть.
  • --jump LOCALINPUT пройти через LOCALINPUT цепь. Здесь CSF выполняет всю известную ему хорошую фильтрацию, предотвращая попадание в систему запрещенных и внесенных в черный список IP-адресов. С помощью этого правила мы расширяем фильтрацию CSF на все хосты во внутренней сети (в отличие от трафика, предназначенного только для хоста, на котором работает CSF).
/sbin/iptables --insert FORWARD --in-interface vmbr0 --out-interface vmbr10 --destination 10.0.0.0/24 --jump ACCEPT

Эта линия передает весь оставшийся перенаправленный трафик внутренним хостам.

  • /sbin/iptables полный iptables требуется исполняемый файл.
  • --insert FORWARD вставьте это правило перед существующими правилами в FORWARD цепь. Это правило будет оценено после того, как вся подача файлов будет выполнена в LOCALINPUT цепь.
  • --in-interface vmbr0 соответствовать трафику, поступающему на vmbr0 интерфейс.
  • --out-interface vmbr10 совпадение трафика, выходящего из vmbr0 интерфейс как эффект перенаправления.
  • --destination 10.0.0.0/24 соответствовать только трафику, предназначенному (перенаправленному) во внутреннюю сеть.
  • --jump ACCEPT после того, как CSF выполнил всю свою фильтрацию (в LOCALINPUT цепочка), мы хотим, чтобы оставшиеся пакеты были ACCEPTизд.