Назад | Перейти на главную страницу

Поиск способа перенаправления приложения с привязкой портов через SOCKS

Я запускаю программу, которая связывает определенный порт на главном компьютере (под управлением Windows 10) за брандмауэром, и у меня нет разрешения на переадресацию портов напрямую через мою сеть. Вместо этого я пытаюсь перенаправить это соединение через внешний сервер (под управлением Debian) через туннель SOCKS, чтобы сделать его общедоступным.

Проблема, с которой я сталкиваюсь, заключается в том, что команда SSH, которую я использую, связывает порт локально, в результате чего программа не может правильно привязать сам порт и правильно запуститься. (Изменить программу нельзя; она должна быть привязана.)

Я использую следующую команду через SSH для настройки туннеля SOCKS:

ssh -vg -D 8123 meself@[external IP]

Я подтвердил, что этот туннель работает, используя следующий curl, который выгружает индексную страницу Google:

curl --socks5 127.0.0.1:8123 http://www.google.com/

Кроме того, netstat также показывает, что соединение активно:

netstat -t | grep "[external IP]"

TCP    [internal IP]   [external IP]:ssh    ESTABLISHED     InHost

Я пробовал использовать FreeCap для захвата трафика от программы на хосте и принудительного перенаправления через SOCKS, но это, похоже, не работает. FreeCap указывает, что прокси работает, но программа по-прежнему пытается локально привязать порт 8123.

Также стоит отметить, что программа написана на Java. Команда, которую я использую для выполнения программы на хосте:

java -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=8123 -jar [program .jar]

При указанных выше условиях это выдает ошибку, что порт 8123 уже привязан.

Моя конечная цель - создать впечатление, будто программа, работающая на моем главном компьютере, напрямую доступна с внешнего сервера, чтобы, когда клиенты подключаются к серверу, они считают, что подключены напрямую к программе на главном компьютере, и программа на главном компьютере считает, что подключена напрямую к клиентам.

Куда мне идти дальше? Можно ли это сделать без внедрения VPN?

(Примечание: у меня есть разрешение на обход брандмауэра таким образом.) (Также обратите внимание: я выбрал 8123 только в качестве примера порта.)

Если я правильно понимаю вашу проблему, вы хотите запустить программу (сервер) на машине 1. Эта программа прослушивает порт x, к которому нельзя получить доступ удаленно из-за некоторых правил брандмауэра. Теперь вы хотите обойти брандмауэр с помощью ssh-туннеля на машину 2 таким образом, чтобы удаленные клиенты могли подключаться к порту y на машине 2, который перенаправляется на порт x на машине 1.

Чтобы заархивировать это, вам понадобится прослушивающий сокет на машине 2 на порту y, который перенаправляет все соединения на машину 1 и порт x.

Чтобы сделать это с помощью ssh и его функции туннелирования / прокси-сервера SOCKS, вы можете либо запустить ssh-соединение с параметром -L с машины 2 на машину 1:

machine2# ssh -L portY:localhost:portyX user@machine1

или наоборот, с опцией -R с машины 1 на машину 2 (убедитесь, что GatewayPorts включен на машине2):

machine1# ssh -R machine2:portY:localhost:portyX user@machine2

Конечно, порт x и порт y также могут быть одинаковыми. Я просто различил их, чтобы было понятнее.

См. Подробную информацию на странице руководства ssh: https://linux.die.net/man/1/ssh