Вопрос или проблема
Я погуглил и не нашел ответ на свой вопрос. Помогите, пожалуйста.
Есть два сервера:
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 уже выглядит довольно близко к правильной, но может потребоваться некоторая корректировка. Ниже приведены шаги, которые вам необходимо предпринять:
- Настройка 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.
- Настройка 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
-
Установка HAProxy:
sudo apt-get install haproxy
-
Настройка конфигурации /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-соединений. Если у вас возникли дополнительные вопросы или требуется уточнение, не стесняйтесь обращаться за помощью.
### Важные замечания
- Не забудьте проверить настройки фаервола и разрешение необходимых портов на обоих серверах.
- Регулярно проверяйте настройку безопасности для предотвращения несанкционированного доступа к серверам.
Ваши дальнейшие действия могут зависеть от специфических требований вашей сети, но данное решение должно дать вам сильную основу для работы.