Как получить доступ к Linux Machine, сидящему за NAT, не имеющим GUI?

693
Arun

Одна из моих коробок Debian не имеет графического интерфейса. Как подключиться к нему через командную строку извне (например, AnyDesk, Teamviewer и т. Д.)?

Я могу использовать SCP и SSH для доступа к этому компьютеру, пока я нахожусь в сети офиса. Но как я могу получить доступ из моего дома? Динамический DNS (DDNS или DynDNS) не применим в моей настройке, поскольку сетевой поставщик не назначает общедоступный IP-адрес для порта WAN маршрутизатора

Публичный IP и Маршрутизатор WAN IP отличается

1
Есть ли статический публичный IP-адрес, который вы можете использовать? (например, назначенный вашему домашнему маршрутизатору или другой машине, к которой у вас есть доступ). Kamil Maciorowski 6 лет назад 0
@KamilMaciorowski, Использование 4G интернет-роутера с сим-картами. Здесь, в Катаре, интернет-провайдер не назначает публичный IP-адрес маршрутизаторам WAN для сетей 4G (я думаю, что они используют прокси-сервер). Arun 6 лет назад 0
_Provider не назначает Public IP_ erm ... Тогда как вы получаете доступ к чему-либо через Интернет? Даже если вы звоните, должен быть адрес для отправки данных. Baldrickk 6 лет назад 0
Вы должны удалить этот вопрос и установить новый: «Как подключиться к машине через NAT, который я не контролирую» Eugen Rieck 6 лет назад 0
@EugenRieck, как вы сказали, вопрос изменен, чтобы отразить тот факт, что он стоит за NAT. Arun 6 лет назад 0

4 ответа на вопрос

3
confetti

Обратный SSH твой друг. Вам нужен SSH-сервер, чтобы это работало. Я дам вам два подхода к этому, первый предполагает, что вы можете открыть и запустить SSH-сервер со своей машины дома. Я предоставлю способ, который пытается автоматически переподключаться ежечасно, чтобы ваш компьютер не всегда был подключен к сети. Поскольку иногда это может быть либо невозможно, либо затруднительно, я добавлю и более простое и безопасное решение, которое требует наличия Linux-VPS. Обычно они составляют всего 2 доллара в месяц.

Решение 1 - Использование только вашего ПК дома - Предполагая статический IP:

Подготовка на сервере Debian:

Я предполагаю, что вы cronустановили и работаете. Создайте новый файл /etc/cron.hourlyсо следующим содержимым: (не забудьте chmod +xо файле!)

#!/bin/bash cstate=$(netstat -na | grep "tcp" | grep "<IP-of-home-machine>:22" | tr -s " " | cut -d " " -f 6 | head -n 1) cdate=$(date "+%Y-%m-%d %H:%M:%S") if [[ $cstate == "ESTABLISHED" ]] || [[ $cstate == "TIME_WAIT" ]] then echo "[$cdate] SSH connection up. ($cstate)" >> /var/log/check-ssh-relay.log else echo "[$cdate] SSH connection broken. ($cstate) Reconnecting..." >> /var/log/check-ssh-relay.log ssh -N -f -R 12122:localhost:22 <username>@<IP-of-home-machine> fi 

Это будет проверять ежечасно, если соединение установлено и пытается повторно подключиться, если это не так. Полезно, когда ваш компьютер дома не всегда включен. Он записывает информацию журнала в /var/log/check-ssh-relay.log. Аутентификация выполняется с помощью SSH-ключей, поэтому убедитесь, что вы правильно настроили эту настройку заранее.

На вашем компьютере дома:

Если вы правильно настроили openssh-сервер, все что вам нужно сделать сейчас:

$ ssh <server-username>@localhost -p 12122 

Чтобы создать соединение SSH. SCP, SFTP и co. тоже работает конечно.

Решение 2 - Использование другого VPS в качестве реле:

Я использую это решение лично. Главным образом потому, что у меня нет статического IP дома.

Подготовка на сервере Debian:

Точно так же, как в решении 1, за исключением того, что вместо <IP-of-home-machine>вас здесь используется IP-адрес VPS.

Подготовка на VPS:

Все, что вам нужно сделать, это запустить следующую команду от имени пользователя root:

$ ssh -g -f -N -L 0.0.0.0:13122:localhost:12122 root@localhost 

Здесь -gважно разрешить глобальные входящие соединения для этого перенаправления портов.

На вашем ПК дома (или буквально где угодно):

Просто подключитесь к вашему VPS, используя порт 13122(как указано выше):

$ ssh <username>@<VPS-IP> -p 13122 
В тестовой настройке я подтвердил, что этот метод работает нормально для меня! Для тестирования использовались только 2 команды. ssh -N -f -R 12122: localhost: 22@ В сервере & SSH @localhost -p 12122 с клиентской машины Arun 6 лет назад 1
2
Eugen Rieck

Если у вас нет графического интерфейса, все, что вам нужно, это удаленная консоль - обычно это достигается с помощью sshочень хорошей безопасности и дополнительных услуг, таких как scp(удаленное копирование файлов).

Я изменил свой вопрос с помощью входных данных из вашего ответа (@EugenRieck) (предложение ssh & scp, которое не применимо в моем случае) Arun 6 лет назад 0
2
Baldrickk

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

Самое простое решение для этого - обратное туннелирование - вы устанавливаете ssh-соединение с машины, которой хотите управлять, с машиной, с которой хотите управлять (эта машина должна быть доступна через ssh)

см. https://unix.stackexchange.com/questions/46235/how-does-reverse-ssh-tunneling-work

Действительно нужна опция, чтобы выбрать более 2-х ответов в качестве ответа. Здесь Baldrickk уже дал подсказку & @confetti, упомянутую очень подробно! Arun 6 лет назад 0
@Arun Не волнуйся, его ответ лучше, у меня не было времени, чтобы написать руководство. Baldrickk 6 лет назад 1
2
Shadowcoder

Вы можете настроить сервер OpenVPN в своем офисе (при условии, что вы можете перенаправить порт из вашей сети в общедоступную глобальную сеть), подключить к нему свой блок без графического интерфейса пользователя (как ответ Baldrickk; обратное туннелирование), а затем ваш сервер должен быть возможность SSH в блок без графического интерфейса, наряду с любыми другими службами, работающими на этом блоке.

Я вижу несколько проблем с таким подходом, одна из которых заключается в том, что если клиент вашего не-GUI-блока истечет время ожидания соединения, будет невозможно без SSH-подключения к нему локально (в той же сети) и перезапуска клиента.

Похожие вопросы