Как настроить правила iptables для перенаправления трафика и изменения исходящих IP-адресов с помощью SNAT?

Как настроить iptables на виртуальной машине, чтобы корректно обрабатывать трафик, переадресованный с внешних IP-адресов хостера к нескольким локальным IP-адресам виртуальной машины?
  • 24 декабря 2023 г. 13:57
Ответы на вопрос 2
Для настройки правил iptables для перенаправления трафика и изменения исходящих IP-адресов с помощью SNAT вы можете использовать следующую команду:

```shell
iptables -t nat -A POSTROUTING -s <source_ip> -j SNAT --to-source <new_ip>
```

Где:
- `<source_ip>` - исходный IP-адрес, который нужно изменить
- `<new_ip>` - новый IP-адрес, на который нужно изменить

Например, если вы хотите изменить исходящий IP-адрес с 192.168.1.10 на 10.0.0.20, вы можете использовать следующую команду:

```shell
iptables -t nat -A POSTROUTING -s 192.168.1.10 -j SNAT --to-source 10.0.0.20
```

Однако, чтобы корректно обрабатывать трафик, переадресованный с внешних IP-адресов хостера к нескольким локальным IP-адресам виртуальной машины, вам нужно настроить портовое перенаправление (port forwarding) вместе с SNAT. Вы можете использовать команды iptables подобным образом:

```shell
# Перенаправление порта 80 с внешнего IP 192.168.1.100 на локальный IP 10.0.0.10
iptables -t nat -A PREROUTING -d 192.168.1.100 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.10:80
iptables -t nat -A POSTROUTING -d 10.0.0.10 -p tcp --dport 80 -j SNAT --to-source 192.168.1.100

# Перенаправление порта 443 с внешнего IP 192.168.1.100 на локальный IP 10.0.0.20
iptables -t nat -A PREROUTING -d 192.168.1.100 -p tcp --dport 443 -j DNAT --to-destination 10.0.0.20:443
iptables -t nat -A POSTROUTING -d 10.0.0.20 -p tcp --dport 443 -j SNAT --to-source 192.168.1.100
```

В этих командах мы используем портовое перенаправление PREROUTING для перенаправления входящего трафика с внешних IP-адресов (например, 192.168.1.100) на соответствующие локальные IP-адреса виртуальной машины (например, 10.0.0.10). Затем мы используем POSTROUTING и SNAT для изменения исходящего IP-адреса в ответ на этот трафик, чтобы он выглядел, как будто он исходит от внешнего IP-адреса (например, 192.168.1.100).

Учтите, что эти команды только временные и не сохранятся после перезагрузки системы. Чтобы сохранить правила iptables, вам нужно будет использовать соответствующие методы вашего дистрибутива Linux, например, команду `iptables-save` или редактирование соответствующих конфигурационных файлов.
1. Для редиректа http и https трафика на виртуальные машины проще использовать nginx в режиме reverse proxy и т.п. Можно поднять его на отдельной ВМ и редиректить оттуда. 
2. MASQUERADE и SNAT работают ТОЛЬКО для пакетов, появившихся на виртуальной машине, никакого отношения к пакетам, пришедшим на виртуальную машину извне они не имеют. Если вы настраиваете доступ на сервисы на ВМ для клиентов снаружи через NAT - вам нужно открыть доступ только для PREDOUTING -j DNAT и ну и разрешить прохождение транзитного трафика в ядре и в таблице iptables FORWARD. SNAT здесь никак участвовать не будет.
3. MASQUERADE меняет адрес источника в заголовке уходящего с виртуальной машины пакета на адрес интерфейса, откуда он уходит наружу, и происходит это уже после принятия решения о маршрутизации.
4. Если вы хотите выдавать внешние адреса виртуальным машинам, то зачем вообще нужен NAT? По идее есть возможность создать виртуальный свитч, где будут находиться и сетевой интерфейс самого директора и сетевые интерфейсы ВМ
Похожие вопросы