При использовании POSTROUTING теряется реальный IP-адрес. Какие существуют варианты решения этой проблемы?

У меня есть следующая схема подключения: клиент с публичным IP xxx.xxx.xxx.xxx подключается через VPN (91.91.91.91 и 10.8.0.1), затем проходит через PFSense (192.168.10.1 и 10.8.0.1) и далее до сервера с IP 192.168.10.39. 

Мне нужно открыть доступ к нескольким специфическим портам (44, 77, 11, 1000), не в диапазоне от 44 до 1000. 

На IP 91.91.91.91 применяются правила POSTROUTING и PREROUTING, соединение устанавливается нормально, но сервер 192.168.10.39 не видит клиентский публичный IP, что является важным условием для меня. 

Попробовал использовать правила MARK и CONMARK, но не добился успеха. У меня возникла идея создать прокси-туннель от 91.91.91.91 до 192.168.10.39, однако я не понимаю, как это реализовать. Я пробовал использовать socat, но возникла ошибка.

Проблема, похоже, достаточно распространенная, но я не смог найти ясные и успешные решения.
  • 13 декабря 2024 г. 13:24
Ответы на вопрос 2
Ваша ситуация связана с целью сохранить исходный IP-адрес клиента, который подключается через VPN, при прохождении через PFSense и далее к внутреннему серверу. Использование правил NAT (в частности, POSTROUTING) изменяет исходный IP-адрес, что ведет к потере оригинального IP.

Вот несколько способов решения этой проблемы:

### 1. Использование правила ACCEPT в iptables

Вы можете использовать `iptables` для разрешения трафика без изменения IP-адреса. Вам нужно будет настроить UPD и TCP правила для соответствующих портов, чтобы разрешить доступ от клиентских IP на сервер.

Пример правил:

```bash
# Принять трафик от VPN с оригинальным IP
iptables -t nat -A PREROUTING -i tun0 -p tcp --dport 44 -j ACCEPT
iptables -t nat -A PREROUTING -i tun0 -p tcp --dport 77 -j ACCEPT
iptables -t nat -A PREROUTING -i tun0 -p tcp --dport 11 -j ACCEPT
iptables -t nat -A PREROUTING -i tun0 -p tcp --dport 1000 -j ACCEPT
```

Здесь `tun0` – это интерфейс вашего VPN.

### 2. Сохранение оригинального IP с помощью `conntrack`

Использование `conntrack` может помочь отслеживать соединения. Если вы хотите сохранить оригинальный IP, вам может потребоваться использовать `CONNMARK` в iptables для маркировки соединений.

Пример:

```bash
# Маркируем соединение
iptables -t mangle -A PREROUTING -i tun0 -j CONNMARK --set-mark 1

# Используем эту отметку в POSTROUTING
iptables -t nat -A POSTROUTING -m connmark --restore-mark --mark 1 -j ACCEPT
```

### 3. Прокси-туннель с помощью socat

Если вы хотите использовать `socat`, его можно настроить для создания прокси-туннеля. Вот базовый пример:

```bash
socat TCP-LISTEN:<local-port>,fork TCP:<destination-IP>:<destination-port>
```

Эта команда создаст туннель, принимающий соединения на `local-port` и отправляющий их на `destination-IP` с `destination-port`.

Однако важно помнить, что использование `socat` не сохранит оригинальный IP при маршрутизации через NAT. С помощью этого метода ваш сервер увидит IP 91.91.91.91.

### 4. Использование OpenVPN с маршрутизацией

Если возможно, рассмотрите возможность настройки OpenVPN так, чтобы он не менял оригинальный IP. В параметрах сервера OpenVPN, добавьте:

```
push "route 192.168.10.0 255.255.255.0"
```

Это позволит вашим внутренним устройствам видеть оригинальный IP-клиента. Убедитесь, что ваш клиентский OpenVPN может выполнять маршрутизацию IP.

### Заключение

Каждый из перечисленных методов имеет свои особенности и может потребовать настроек, специфичных для вашей инфраструктуры. Обязательно протестируйте каждую конфигурацию в контролируемом окружении, прежде чем внедрять в продуктив.
и не увидит.. либо надо использовать протокол с поддержкой передачи IP, и это должен уметь и клиент и сервер
Похожие вопросы