Мы успешно использовали 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
изд.