Pull to refresh

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

Reading time 8 min
Views 30K

Настройка 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
Tags:
Hubs:
+19
Comments 16
Comments Comments 16

Articles