Предполагая для простоты, что у вас есть только один клиент (но у которого могут быть произвольные IP-адреса), что VNC-сервер работает за брандмауэром, где вы не можете открыть порты, но у клиента нет таких проблем, обходной путь должен был бы сделать это введите в сценарий загрузки на сервере:
while sleep 100; do ssh vnc_user@$client -R 5900:127.0.0.1:5900; done
Это открывает обратный туннель от сервера к клиенту. Это возможно из-за брандмауэра.
Убедитесь, что вы создали на сервере ssh-ключ без пароля (ssh-keygen
и пару раз нажмите return), чтобы вы могли поместить его в загрузочный скрипт.
Теперь, чтобы сделать это из "произвольного подключения к Интернету", просто получите бесплатную учетную запись на dyndns.org и обменяйте $ client в приведенной выше команде на этот адрес dyndns (например, myvpnclient.dyndsn.org). На клиенте запустите sshd и создайте пользователя с очень небольшим доступом:
sudo useradd -m -s /bin/false vnc_user
Скопируйте файл-сервер:~/.ssh/id_rsa.pub в клиент:~ vnc_user/.ssh/authorized_keys, чтобы у сервера vnc был ssh-доступ к клиенту (-ам) vnc. (/Bin /false гарантирует, что сервер vnc на самом деле не может запускать команды на клиенте, только открыть порт; если вы не доверяете серверу, вы можете усилить защиту в sshd_config.)
Теперь, пока вы запускаете на клиенте демон dyndns (или обновляете свой IP-адрес вручную на dyndns.org), вы можете подключаться к серверу. Если ваш клиент меняет IP-адрес, соединение ssh должно прерваться, и сервер попытается восстановить соединение.
(Если клиент также находится за брандмауэром, я думаю, что и клиент, и сервер могут открыть туннели к третьей машине, у которой нет проблем с брандмауэром, но в любом случае вам нужен хотя бы один сервер, который может запускать sshd в открытом Интернете.)