Удаленная поддержка компьютера на Linux OS

Настройка IPv6-туннеля за симметричным NAT и удаленного управления через VNC


Не так давно я искал решение для удаленного администрирования системой на Linux. Основная проблема в том, что подключен к интернету через провайдеров, использующих симметричный NAT. То есть из internet машины не доступны. Если поискать, то можно найти некоторые программы для удаленного администрирования, но как правило они немало стоят. Опишу, как можно сделать доступ снаружи без таких программ с помощью IPv6-туннеля через gogonet и VNC.

Готовые программы

Просидев немало времени в поисках, нашел некоторые программы. И есть одна бесплатная для некоммерческого использования — это TeamViewer 6 (работает через wine). Работает отлично, функций немало, но у нее есть некоторые недостатки: он сам пытается вычислить коммерческое использование и может ограничить его. Что у меня и случилось, хотя на самом деле я использовал ее только в личных целях. А также программа постоянно показывает предупреждающие о некоммерческом использовании окна, что немного мешает.

Запустить через Wine

Под Windows есть замечательная программа Ammy Admin, которая позволяет подключаться к удаленной системе через интернет и ей не мешают фаерволы и NAT. При этом она может быть установлена как сервис, что избавляет от действий на той стороне: не требуется запуск, передача новых кодов, паролей управляющей стороне, один раз настроили, подключились, разрешили.
Также можно включить звук, передавать файлы и настроить разные параметры.

Первая идея — запустить её под wine в Ubuntu. При запуске появляются ошибки, но дальше программа работает, правда только как оператор (я её так и использую для подключения win-машинам). То есть управлять машиной работающей под linux не получится.

Перепробовав разные программы под wine оказалось, что все они работают, но все с одной проблемой: программы не могут транслировать экран иксов линукса (со звуком тоже беда). Решение нужно другое.

Решение 1 — Teredo

Туннель Teredo

Некоторым повезло с провайдером и им подойдет вариант с туннелем Teredo: IPv6 через IPv4. Под ubuntu есть программа под названием Miredo, который создает туннель и после этого уже имеется свой IPv6-адрес. Для установки нужно просто выполнить:
sudo apt-get install miredo

Теперь можно посмотреть свой адрес:
ifconfig

...
teredo	Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
      	inet6 addr: fe80::ffff:ffff:ffff/64 Scope:Link
      	inet6 addr: 2001:0:53aa:64c:2ca9:1bc4:9253:b1e2/32 Scope:Global
      	UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1280  Metric:1
      	RX packets:0 errors:0 dropped:0 overruns:0 frame:0
      	TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
      	collisions:0 txqueuelen:500
      	RX bytes:0 (0.0 B)  TX bytes:144 (144.0 B)


Можно проверить подключение по IPv6 также открыв сайт Test-ipv6.com.
Teredo работает и через симметричный NAT, но только на исходящие подключения — достучаться снаружи не получится.

Поставив на двух машинах проверил, что сайты мой IPv6-адрес определяют нормально. Далее пробую пинговать сначала гугл:
ping6 -n ipv6.google.com
PING ipv6.google.com(2a00:1450:4001:c01::63) 56 data bytes
64 bytes from 2a00:1450:4001:c01::63: icmp_seq=1 ttl=59 time=85.2 ms
64 bytes from 2a00:1450:4001:c01::63: icmp_seq=2 ttl=59 time=79.8 ms
64 bytes from 2a00:1450:4001:c01::63: icmp_seq=3 ttl=59 time=82.2 ms


А потом друг друга:
ping6 2001:0:53aa:64c:2ca9:1bc4:9253:b1e2
Если пинг в данном случае идет, значит NAT несимметричный и можно пользоваться teredo.
У меня пинг не пошел и пришлось искать другой вариант.

Решение 2 — Freenet6

Данный туннель работает и через симметричный NAT, но тут немного всё сложнее.
Заходим на сайт gogonet.gogo6.com и регистрируемся в gogoNET. Далее скачиваем клиент gogoCLIENT для linux. Там же регистрируемся уже для доступа к серверам. Если кто не нашел ссылку: gogonet.gogo6.com/page/freenet6-registration
Там есть и анонимный доступ, но я зарегистрировался и не зря. В конце статьи объясню почему.

Переходим к установке программы gogoc:
tar -xzf gogoc-1_2-RELEASE.tar.gz
cd gogoc-1_2-RELEASE/


Для компиляции у меня не хватает пакета libssl-dev:
sudo apt-get install libssl-dev

Компилируем:
make all
sudo make installdir=/usr/local/gogoc install


Теперь нам надо подправить конфигурацию клиента gogo:
sudo gedit /usr/local/gogoc/bin/gogoc.conf

В userid и passwd заполняем свои данные, полученные во время второй регистрации (там где имя, а не ящик).

Меняем сервер: server=amsterdam.freenet6.net
или montreal.freenet6.net (со стандартным иногда проблемы).
Меняем метод аутентификации: auth_method=any
Остальное оставляем, как есть. И можно проверять:
cd /usr/local/gogoc/bin/
sudo ./gogoc

Клиент нам говорит, что не знает такого сервера и спрашивает о добавлении ключа: amsterdam.freenet6.net is an unknown host, do you want to add its key?? (Y/N), соглашаемся: Y.

Теперь проверяем интерфейсы командой ifconfig:
tun   Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
      	inet6 addr: 2001:5c0:1000:b::9f29/128 Scope:Global
      	UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1280  Metric:1
      	RX packets:5 errors:0 dropped:0 overruns:0 frame:0
      	TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
      	collisions:0 txqueuelen:500
      	RX bytes:336 (336.0 B)  TX bytes:56 (56.0 B)


Проверяем, что пинг со второго компа идет: ping6 2001:5c0:1000:b::9f29
Туннель готов.

X11VNC

Теперь для управления нужен VNC-сервер, который поддерживает IPv6.
Устанавливаем: sudo apt-get install x11vnc

А на подключающейся машине поставим клиент VNC — remmina: sudo apt-get install remmina

Запускаем x11vnc на сервере. Я запускаю такой строчкой:
x11vnc -display :0 -forever -unixpw -noxrecord -noxfixes -ncache 10

Такие параметры исправляют глюки с ATI (сеанс вылетал), также сервер продолжает работать после отключения клиента и используется авторизация unix.

И пробуем подключиться со второй системы через реммину, указав тип VNC и адрес 2001:5c0:1000:b::9f29.
Вот и готово первое подключение. Осталась одна проблема.

Автозагрузка и как узнать IPv6-адрес машины

Здесь я приведу своё решение, хотя я думаю оно далеко от идеала, но работает.

Автозагрузка gogoc после подключения интернета и перезапуск в случае завершения по ошибке с помощью shell-cкрипта, запуск которого я прописал в /etc/rc.local строкой /etc/autostart_gogoc &.
Содержимое файла autostart_gogoc:
#!/bin/sh

cd /usr/local/gogoc/bin

while [ true ]; do
	gogoc=`ps ax|grep gogoc|grep -P -o "\d:\d\d\s\./gogoc"`
	if [ "$gogoc" = "" ]; then
	
		#echo "Процесс gogoc не найден, запускаем"

		IP="0"
		while [ $IP = "0" ]
		  do 
			ping -c 3 www.ya.ru
			if [ $? -eq 0 ]; then
				echo "pinged_ok"
				IP="OK"
			fi
		 sleep 10
		done	
	
	
		./gogoc
	fi	
	#echo "Ждем"
	sleep 10
done


Можно убрать комментарии перед эхо и, запустив от рута (через sudo), посмотреть, как работает.
Для автозагрузки x11vnc я добавил команду (см. выше) в автозапуск (Startup Applications).

Далее, чтобы узнавать текущий IP, я сделал следующее (каждый может придумать свой вариант).

1. Скрипт на PHP, который лежит на одном из моих сайтов и сохраняет присланные ip-адреса в текстовый документ:
<?php
$d=$_POST['data'];

$x=implode("",file("ipsforme.txt"));
$y=array();
$y=explode("\r\n",$x);

$d=date("d-m-Y H:i ").$d;

array_unshift($y,$d);

if (count($y)>200) {
array_splice($y,190);
}

$z=implode("\r\n",$y);

$a=fopen("ipsforme.txt","w");
fputs($a,$z);
fclose($a);

echo "OK";
?>


2. Скрипт на PHP, через который я смотрю собранное:
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' lang='ru' dir='ltr'>
<head>
<title>Мои IP</title>
<meta http-equiv='content-type' content='text/html; charset=utf-8'>
</head>
<body>
<b>Мои адреса:</b><hr>
<?

#myipsview.php

$x=implode("",file("ipsforme.txt"));
$x=str_replace("\r","",$x);
$x=str_replace("\n","<br>",$x);
print $x;

?>
</body>
</html>


3. Cкрипт на python, который постоянно работает и при изменении ip-адреса отправляет его на сервер вместе с именем машины (работает и под Windows, только python 2.6 установить надо):
#!/usr/bin/python2.6
# -*- coding: utf-8 -*-
import sys
import re
import os
from socket import *
import subprocess
from httplib import HTTPConnection
import time



print "##########################################################"
print "\n\n\n\n\n\n"

lastinfo=""

#sss=raw_input('pausa')

print "Start Cycle"

while 1:

	retcode = os.spawnlp(os.P_WAIT, "sh", "sh", "-c", "uname -n >/home/andrey/sendipinfo.txt")
	retcode = os.spawnlp(os.P_WAIT, "sh", "sh", "-c", "/sbin/ip addr show dev tun | grep inet6 >>/home/andrey/sendipinfo.txt")


	f=file('/home/andrey/sendipinfo.txt','r')
	lines=f.readlines()
	f.close()
	s=''
	for line in lines:
		line=line.strip('\n')
		s=s+' = '+line
	print s

	if (lastinfo != s) and (re.search('inet6.*\w{1,4}:\w{0,4}(:\w{0,4})+',s)):
		print "Закачка"
		lastinfo=s

		BOUNDARY="$Python-Essential-Reference$"
		CRLF='\r\n'
		closing='--'+BOUNDARY+"--\r\n"

		server='www.armavirportal.ru:80'
		xname='data'
		xvalue=s

		section = ['--'+BOUNDARY,'Content-disposition: form-data; name=%s' % xname,'',xvalue]
		st=CRLF.join(section)+CRLF


		content_size=len(st)+len(closing)

		conn = HTTPConnection(server)
		conn.putrequest('POST','/myips.php')
		conn.putheader('Content-type','multipart/form-data; boundary=%s' % BOUNDARY)
		conn.putheader('Content-length', str(content_size))
		conn.endheaders()
		conn.send(st)
		conn.send(closing)
		r = conn.getresponse()
		responsedata = r.read()
		conn.close()

		print "GET RESPONSE: "+responsedata
	time.sleep(10)
print "неожиданный конец"


Вывод print можно везде убрать при использовании, т.к. я его делал для проверки.
Для его запуска с загрузкой иксов, я также добавил в автозапуск команду:
sh -c /home/andrey/sendip.py

Что имеем

Теперь у меня три системы на Ubuntu (Mint), которые при подключении к интернету автоматически восстанавливают туннель, и отправляют адрес на мой сайт, который я могу в любое время посмотреть. Да это добавляет лишние действия, но эта система бесплатна и работает.

Результат работы выглядит так (http://www.armavirportal.ru/myipsview.php):

25-08-2011 19:30 = andrey = inet6 addr: 2001:5c0:1400:b::acdd/128 Scope: Общий
25-08-2011 14:11 = neo = inet6 addr: 2001:5c0:1400:a::1665/128 Scope: Общий
25-08-2011 14:07 = neo = inet6 addr: 2001:5c0:1400:a::11b7/128 Scope: Общий
25-08-2011 09:46 = neo = inet6 addr: 2001:5c0:1400:a::1677/128 Scope: Общий
25-08-2011 09:31 = neo = inet6 addr: 2001:5c0:1400:a::74d/128 Scope: Общий
25-08-2011 08:43 = neo = inet6 addr: 2001:5c0:1400:a::459/128 Scope: Общий
24-08-2011 23:03 = neo = inet6 addr: 2001:5c0:1000:a::233/128 Scope: Общий
24-08-2011 10:26 = neo = inet6 addr: 2001:5c0:1000:a::90f/128 Scope: Общий
22-08-2011 11:18 = = IPv6-адрес............: 2001:5c0:1400:a::819(Основной)
22-08-2011 11:18 = = IPv6-адрес............: 2001:5c0:1400:a::819(Пробный)

Последние две строчки из Windows.

Можно проще

Когда писал эту статью, то еще не знал про одну особенность. Когда мы регистрируемся на freenet6, то дополнительно получаем адрес вида username.broker.freenet6.net, то есть ipv6 адрес можно и не знать, а подключаться прямо по имени. Регистрируем на каждую ось, где будет туннель отдельный аккаунт freenet6 (при этом можно под одним аккаунтом на gogo6) и будут адреса под каждую систему.
Можно проверить созданный туннель теперь просто по имени:
ping6 virtustilus5.broker.freenet6.net
А также посмотреть его на странице ipv6-test.com, где его я собственно и увидел.
В результате скрипт python и php на сайте больше не нужны.

VNC IPv6 под Windows

Туннель поднимается еще быстрее и проще, чем в линуксе через gogoCLIENT.
Под Windows пока не нашел бесплатного VNC-сервера с поддержкой IPv6.
Клиент VNC с IPv6 под Windows Enhanced TightVNC Viewer работает отлично. Отключаю проверку сертификатов, вписываю адрес компа и connect.

Teredo
gogo6
Документация Python: httplib
TeamViewer
AmmyAdmin
Join.me
Miredo
Enhanced TightVNC Viewer
ipv6-test.com
другой test-ipv6.com
Share post

Similar posts

Comments 16

    0
    А зачем так нужен именно VNC? SSH не хватило?
      0
      Для именно удаленной поддержки SSH обычно не хватает, X11 тоннель на удаленке очень не быстр, а консольными приложениями обычно не исчерпывается. Непонятно, почему *именно* VNC. Тот же nomachine NX показывает лучшие результаты.
        0
        Кстати по поводу NX и VNC. Клиент NoMachine NX Free конечно лучше работает, но он не поддерживает подключения по IPv6.
        x11vnc — единственный более-менее нормальный способ подключиться через IPv6 на данный момент. Хотя у него есть свои глюки, например на системе с проприетарным драйвером ATI иногда вылетает сеанс гнома.
      0
      NX+SSH требуют настройки (которая у меня однажды затянулась надолго) в отличие от x11vnc, который достаточно запустить одной командой. Можно еще поставить и openssh-server и подключаться из той же remmina через защищенный туннель SSH к VNC.
      Конечно кому хочется более быстрого соединения и большей безопасности могут повозиться с настройкой NoMachine NX.
        +3
        Не нужно парсить вывод ifconfig, он для этого не предназначен и вообще deprecated. Используйте /sbin/ip.

        re.search('inet6.*:.*:.*:.*:.*:.*',s)
        Это неправильное регулярное выражение для IPv6 адреса.
          0
          Да, действительно с адресом промах. Исправил на inet6.*\w{1,4}:\w{0,4}(:\w{0,4})+ (в первом варианте от 1 до 4, чтобы пустой адрес :: не попал под правило). Это правило не проверят на валидность адрес, но здесь я думаю такая проверка и не нужна.
          Также ifconfig заменил на утилиту ip.
            0
            А ничего, что ip a l dev tun0 | grep inet6 выдает два адреса? Один scope local, а один scope global?
              0
              Я думаю всегда есть, что доработать и практически в любом проекте. На счет global и local — у меня обычно на ununtu 10.10 и на mint 10 показывает только global для интерфейса tun созданного gogoc. А так для других интерфейсов и другие scope есть. Можно опять же доработать рег.выражение например до такого вида: inet6.*\w{1,4}:\w{0,4}(:\w{0,4})+.*scope\s+global
          +1
          Не забываем про dns.he.net.
            0
            Раз уж тут упоминается не только удаленное управление машиной под Linux, но и удаленное управление машиной под Windows с машины с другой ОС — упомяну про свой любимый сервис — join.me
            Вся его прелесть заключается в отсутствии необходимости предварительно что-то ставить на машину, которой хотите поуправлять: достаточно попросить зайти на сайт, нажать на оранжевую кнопку, согласится на запуск программы и продиктовать три группы цифр, появившиеся вверху экрана. «Серверная» часть есть под Win и Mac, «клиентская» — под всё что понимает flash и отдельно (только просмотр, без управления) — для iOS.
              +1
              Я извиняюсь, а hamachi не способ?
              Превосходно ставится и работает на виндовых машинах связка hamachi + TightVNC.
              В Linux — hamachi + VNC на вкус и цвет.
              Админю помаленьку мамин комп :)
                0
                Тоже способ! Причем неплохой.
                Я когда искал способы, то натыкался на hamachi и даже зарегистрировался там. Правда не обнаружив на официальном сайте версии для Linux, отбросил его в сторону. Кстати если сейчас зайти на сайт хамачи под своей учеткой в раздел добавления клиента, то там пишется вот такая фраза: LogMeIn Hamachi в настоящее время не поддерживает вашу операционную систему.
                Вот здесь нашел немного постаревшую инфу как поставить hamachi на linux: masaki-tux.blogspot.com/2007/03/hamachi.html
                А вот тут этого года: Use Hamachi VPN on your Linux clients
                И вот бета-версии уже на сайте самого hamachi: Labs & Betas
                  0
                  Да. В моём дистрибутиве именно beta-версия и представлена.
                  Удобство использования и возможности применения на 5+.
                    0
                    Ах. Да. В плане настройки, мануал и не нужен. На винде всё проще простого.
                    В Linux, если рассматривать консольный вариант, то:
                    1) Запускаем демона logmein-hamachi
                    2) В терминале hamachi --help
                    Небольшое знание английского, вот и вся инструкция.
                  0
                  я правильно понял, что ipv6 принадлежит не машине-серверу, а сайту gogo-чего-то-там? Т.е. весь трафик идет через третий сервер? Это не опасно?
                  Я, например, пробрасывал SSH тоннель на свой сервер, так было надежнее.
                    0
                    Да, туннель идет через чужой сервер. Я тоже на прошлой неделе решил сделать через туннель SSH. Настроил фаервол на прием только SSH-соединения из внешней сети (для ipv6 используется ip6tables). Поставил openssh-server, сделал авторизацию по ключу DSA www.g-loaded.eu/2005/11/10/ssh-with-keys, ну и в remmina поставил в настройках подключения к VNC через SSH туннель (ключ в файле ~/.ssh/id_dsa, а в remmina выбрал публичный ключ).

                    На хабре есть настройка авторизации RSA-ключем: Терминальный сервер для 1С с помощью vnc+ssh на основе fedora 8 или Организация SSH Layer 3 туннеля

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

                  Only users with full accounts can post comments. Log in, please.