Яндекс.Метрика

    Песочница

    Удаленная поддержка компьютера на 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/ifconfig 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.*:.*:.*:.*:.*:.*',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