SSH Socks Proxy с использованием iptables REDIRECT

Вопрос или проблема

Я погуглил и не нашел ответ на свой вопрос. Помогите, пожалуйста.
Есть два сервера:

serverA с публичным IP 12.0.0.10 и приватным IP 10.0.0.5
serverB с публичным IP 20.0.0.11

Я настроил SOCKS-прокси на serverB для serverA:

ssh -D20.0.0.11:2222 [email protected]

Таким образом, когда на моем локальном компьютере в браузере я указываю SOCKS-прокси 20.0.0.11:2222 (serverB:2222) в качестве внешнего IP, я получаю 12.0.0.10 (IP serverA). Это нормально.

Кроме того, если я перейду по адресу http://10.0.0.5 (приватный IP serverA), он также доступен.
Это именно то, что мне нужно. Я хочу, чтобы приватный IP сервера A был доступен через публичный IP сервера B на определенных портах, но без указания SOCKS в моем браузере.

Я мог бы использовать переадресацию портов через ssh, но проблема в том, что мне нужно перенаправить много портов, и я не знаю, каких именно – я знаю только диапазон.

Таким образом, когда я подключаюсь к 20.0.0.11 к любому порту, например, из диапазона 3000:4000, я хочу, чтобы этот трафик перенаправлялся на 10.0.0.5 на том же порту.
Вот почему я решил, что SOCKS-прокси через SSH и iptables REDIRECT могут помочь мне.

Клиент -> serverBPublicIP (любой порт из диапазона 3000:4000) ->
serverAPublicIP -> serverAPrivateIP (порт был запрошен на
serverBPublicIP)

На serverB я делаю:

ssh -D20.0.0.11:2222 [email protected]
iptables -t nat -A PREROUTING -d 20.0.0.11 -p tcp --dport 3000:4000 -j REDIRECT --to-port 2222

Но это не работает – когда я подключаюсь через telnet к 20.0.0.11:3001, например, я не вижу ни одного проксированного трафика на serverA. Что мне еще делать?
Я пытался использовать tcpsocks вот так (в примере я подключаюсь через telnet к 20.0.0.11:3001)

Клиент -> 20.0.0.11:3001 -> iptables REDIRECT с 3001 --to-port 1111 -> tcpsocks с 1111 на 2222 -> SOCKS-прокси с serverB на serverA на порту 2222 -> serverA

Но я не знаю, что делать с трафиком на serverA. Как его направить на его приватный IP.
Помогите, пожалуйста.
Я знаю, что VPN устраняет весь тот ад, который я пытаюсь создать, но у меня нет возможности использовать устройство tun/tap. Оно отключено.

Альтернативой может быть что-то вроде:

ssh -L 3000:10.0.0.5:3000 -L 3001:10.0.0.5:3001 .... -L 4000:10.0.0.5:4000 12.0.0.10

Это создаст тысячу и один отдельный ssh-туннель для каждого порта. Я никогда не пробовал устанавливать более тысячи одновременных ssh-туннелей, поэтому не знаю, какова будет производительность, или будет ли это вообще работать, или нужно ли будет настраивать несколько параллельных ssh-процессов.

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

В целом, я бы не рекомендовал это, если это вообще возможно, настройте VPN.

Есть ли какая-то причина, по которой ваши пользователи не могут просто подключиться к 12.0.0.10 напрямую? Или порты не открыты через брандмауэр? Если нет, не можете ли вы просто открыть порты в брандмауэре для выбранных IP-адресов, или у вас есть соображения по безопасности, которые этого не позволяют?

Я знаю, что VPN устраняет весь тот ад, который я пытаюсь создать, но у меня нет возможности использовать устройство tun/tap. Оно отключено.

Это звучит немного странно, но tun/tap, насколько я знаю, будет использоваться только для SSL VPN (например, openVPN).

Это означает, что вам может повезти больше с VPN IPSEC, таким как strongswan (https://strongswan.org/), который не использует устройства tun/tap.

Как вы и сказали, работа с десятками или сотнями SSH-туннелей одновременно немного утомительна и ненадежна.

Если VPN IPSEC также не сработает, то вам стоит попробовать установить haproxy на сервере A и создать один SSH-переадресатор (-L) вместо туннеля SOCKS (-D). Таким образом, вы можете настроить (веб)сервер на сервере B использовать этот переадресатор в качестве верхнего уровня и использовать haproxy на сервере A для работы с несколькими сервисами и т.д.

Ответ или решение

SSH Socks Proxy с использованием iptables REDIRECT

Введение

В данной статье мы подробно рассмотрим, как сконфигурировать SSH Socks Proxy с использованием iptables REDIRECT между двумя серверами, чтобы сделать приватный IP одного сервера доступным через публичный IP другого сервера. Мы обсудим необходимые настройки, возможности и альтернативные решения.

Описание задачи

У вас есть два сервера:

  • serverA: публичный IP 12.0.0.10, приватный IP 10.0.0.5
  • serverB: публичный IP 20.0.0.11

Вы настроили SOCKS proxy на serverB:

ssh -D 20.0.0.11:2222 [email protected]

При использовании SOCKS-прокси на клиентском компьютере вы можете получить доступ как к serverA (по публичному IP), так и к его приватному IP. Однако вы хотите, чтобы доступ к приватному IP serverA осуществлялся через публичный IP serverB без необходимости вручную настраивать SOCKS-прокси в браузере.

Проблема

Вы столкнулись с трудностями при использовании iptables для перенаправления трафика с определенных портов на serverB к приватному IP serverA. При попытке использовать правило iptables для перенаправления трафика с портов из диапазона 3000-4000, трафик не доходил до serverA.

Решение с использованием iptables

Для достижения вашей цели рассмотрим настройку редиректа с использованием iptables. Ваша команда для iptables уже выглядит довольно близко к правильной, но может потребоваться некоторая корректировка. Ниже приведены шаги, которые вам необходимо предпринять:

  1. Настройка iptables на serverB:
iptables -t nat -A PREROUTING -d 20.0.0.11 -p tcp --match multiport --dports 3000:4000 -j DNAT --to-destination 10.0.0.5
iptables -t nat -A POSTROUTING -j MASQUERADE

Эти команды делают следующее:

  • PREROUTING: перенаправляет весь трафик на портах 3000-4000, поступающий на публичный IP serverB, к приватному IP serverA.
  • POSTROUTING: позволяет serverA отвечать обратно через serverB, подменяя исходящий IP на публичный IP serverB.
  1. Настройка SSH-соединения с сервером A:

После того, как iptables будет настроен, нужно установить SSH-соединение с serverA, чтобы обеспечить проксирование трафика. Используйте следующую команду:

ssh -L 3000:10.0.0.5:3000 -L 3001:10.0.0.5:3001 ... -L 4000:10.0.0.5:4000 [email protected]

Такой подход будет работать, однако, как вы правильно заметили, если вы хотите избегать создания множества отдельных SSH-шлюзов, тогда использование хранилища для сервисов, таких как HAProxy, может быть хорошим решением.

Альтернатива: Использование HAProxy

Если цель состоит в том, чтобы минимизировать количество SSH-соединений, можно использовать HAProxy на serverB для обработки входящего трафика и перенаправления его на соответствующие порты serverA.

Установка и настройка HAProxy

  1. Установка HAProxy:

    sudo apt-get install haproxy
  2. Настройка конфигурации /etc/haproxy/haproxy.cfg:

    
    frontend http_front
    bind *:3000-4000
    default_backend http_back

backend http_back
server serverA 10.0.0.5:3000-4000



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

В данной статье мы рассмотрели, как настроить SSH Socks Proxy с помощью iptables REDIRECT для перенаправления трафика от одного сервера к другому. Мы также обсудили альтернативы, такие как использование HAProxy, для управления трафиком без необходимости в создании обширной инфраструктуры SSH-соединений. Если у вас возникли дополнительные вопросы или требуется уточнение, не стесняйтесь обращаться за помощью. 

### Важные замечания

- Не забудьте проверить настройки фаервола и разрешение необходимых портов на обоих серверах.
- Регулярно проверяйте настройку безопасности для предотвращения несанкционированного доступа к серверам.

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

Оцените материал
Добавить комментарий

Капча загружается...