Песочница →
Удаленная поддержка компьютера на 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
31.08.2011 11:58+0400