LINUX.ORG.RU

Socket for GPRS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


0

0

Privet vsem. Koro4e, est' problemka ohrenitel'no serioznaia. Est' klient s gprs netom i apache sverhu. Kak mne k nemu dobrat'sia 4erez net, t.k. gprs ne daet real'nij ip. t.e. mne nagno s klienta otkrit' socket, no kak? Na6el pod java non-blockable socket, sigu s4a i razbiraius', ono ili net. U kogo est' real'nie predlogenia- pi6ite suda: virgin13@rambler.ru Vsem spas'ki. Virgin

короче, я именно эту пробему решил написав клиент на серваке за мобильным телефоном, а сервер на перле в инете... если хошь скину скрипт. Только это пи3дец скрипт.

vilfred ☆☆
()
Ответ на: комментарий от vilfred

Super Villfred. Ti nastoias4ij. Ckin' na po4tu virgin13@rambler.ru To ko ne zatiagivaj s etim, gelatel'no, potomu kak sil'no nugno. Budu s neterpeniem gdat' mila. Za pizdec script ne peregivaj, u menia vihoda netu :) Virgin

virgin13
() автор топика
Ответ на: комментарий от virgin13

файлы выслал, только они под мою задачу. А вообще попасть снаружи на
 сервер за GPRS можно через ssh туннель, только он пабает очень 
часто(и отследить это не преставляется возможным просто кроме как 
пинговать что-то, собственно пиздец в этой проге в том, что 
отслеживание существования соединения по TCP,а он устанавливает 
соединение и держит, больше никак нельзя, т.к. инициатором отправки 
сообщения в моем случае был сервер извне и решить проблему можно было 
только подсоединившись клиентом). Собственно настройки для ssh туннеля
 делал не я, но файлы вроде такие были:

1) на стороне машины, которая в нормальном интернете ssh слушает (и 
принимает ssh туннель от машины за GPRS) определенный порт(на автомате
 бутится через rc.local при загрузке):

кусок текста из rc.local запускается демон sshd, который слушает 
определенный порт:

touch /var/lock/subsys/local
/usr/local/sbin/sshd_1.2.33 -f /etc/sshd_config -h /etc/ssh/ssh_host_key

cat sshd_config:

==========begin==========
[root@tv /root]# cat /etc/sshd_config
# This is ssh server systemwide configuration file.

Port 223
ListenAddress 0.0.0.0
HostKey _ETCDIR_/ssh_host_key
RandomSeed _ETCDIR_/ssh_random_seed
ServerKeyBits 768
LoginGraceTime 600
KeyRegenerationInterval 3600
PermitRootLogin yes
IgnoreRhosts no
StrictModes yes
QuietMode no
X11Forwarding yes
X11DisplayOffset 10
FascistLogging no
PrintMotd yes
KeepAlive yes
SyslogFacility DAEMON
RhostsAuthentication no
RhostsRSAAuthentication yes
RSAAuthentication yes
PasswordAuthentication yes
PermitEmptyPasswords yes
UseLogin no
# CheckMail no
# PidFile /u/zappa/.ssh/pid
# AllowHosts *.our.com friend.other.com
# DenyHosts lowsecurity.theirs.com *.evil.org evil.org
# Umask 022
# SilentDeny yes
[root@tv /root]#

===========end===========

joe /etc/ssh/ssh_host_key
(неполный, как генерировать - не знаю)

==========begin==========
SSH PRIVATE KEY FILE FORMAT 1.1
@@@@@@@@D@D@°NUKшрq§ўЃexgЛz™юЙBB9&#11
68;[VП@ri±№К.1)AЗъ9›Zѓѕd&#8
230;%®pЋчДFlбУwДЇЭQ@йDD”ЃЧt&
;#174;ЇЬD°§,нZБ€9 4u  ™aю
ћFk€@Цбщ\l[їЫЏН„MЙ·\&#1028
;+х!5Й@F#@@@@XoXoCяs
===========end===========

2) настройки ssh-туннеля на машине, находящейся за gprs:

[root@observ root]# grep -r -H "ssh_channel" /etc/
/etc/ppp/ip-up:/root/up_ssh_channel &
/etc/ppp/ip-up~:/root/up_ssh_channel &
/etc/ppp.bee.gprs.irda.nokia/ip-up:/root/up_ssh_channel &
/etc/ppp.bee.gprs.irda.nokia/ip-up~:/root/up_ssh_channel &
[root@observ root]#

соответственно то, что поднимает ssh-туннель:

cat up_ssh_channel:

==========begin==========
/usr/bin/nohup ssh -C -g -R 222:0.0.0.0:22 -p 223 -f 212.92.50.55 /root/keepalive.pl
===========end===========

соответственно скрипт  keepalive.pl такой

#!/usr/bin/perl

$|=1;
$i=0;
while (1){
        print "$i\n";
        sleep 60;
        $i++;
}

его смысл в том, чтобы валить каждые 60 секунд что-то, иначе 
ssh-туннель по своим внутренним причинам отваливается(не изза GPRS!!!)

Но ssh туннель не подошел, потому что GPRS часто падал и не обладал 
свойством при падении самовосстанавливаться(т.к. в моем случае падение
 GPRS было очень похоже на выдергивание кабеля из сетевой карточки и 
исходил из этого когда ничего неизвестно и проверить что-то можно 
разве что делая пинг)...

p.s. самоя большая хрень этого GPRS в том, чтобы автоматом 
перезапускать GPRS в случае падения связи, которых, на мой взглдя 
бывает два типа:

1) автоматический перезапуск работает только в том случае, если 
оператор BEELINE или какой там у тебя оператор, присылает сообщение о
 том, что соединение разорвано  - тогда внутренние настроки pppd сами
 перезапускают все что нужно(в том числе там надо гдето в стартовых 
скриптах, поднимающих ssh-туннель вписать запуск скрипта 
up_ssh_channel).

2) связь на GPRS в подавляющем большинстве случаев падает вообще без 
всяких внешних признаков(т.е. оператор не присылает сообщения о том,
 что связь потеряна и pppd не может перезапустить всю систему). И 
узнать о том, что произошло падение - можно только в том случае, если 
пустить пинг на какойннить удаленный сайт. 

в первом случае автоматика восстанавливает ssh-туннель, во втором нет 
- нужно подойти и перезагрузить телефон. Это происходит тогда, когда 
по GPRS происходит скачивание одновременно в несколько потоков, или 
GPRS зависает когда качаешь больше мегабайта, так что там надо 
пользоваться wget -c (и то wget -c работает на 20 повторов, хотя 
апустив его вновь на тотже файл оно само все начнет докачивать с 
нужной позиции).

Вобщем если у тебя получится настроить ssh-channel, логин на сервер за
 GPRS происодит так:

заходишь на машину в нормальном интернете и пишешь что-то вроде 
ssh -C -p 223 root@localhost (я точно не помню как это писать, не 
сохранилось правильной командной строки запуска, не сохранил к 
сожалению). После этого она логиниться на порт на машине в интернете,
 на который по 223 порту прокинут ssh-туннель(запущенный командой 
up_ssh_channel) с машины за GPRS.

вот. Надеюсь, понятно, что я описал то хоть....

как настраивать http протокол с удаленного сервера через нормальный - не знаю, 
недоходило до того. наверное, чтобы вызвать apache с сервера за GPRS
 необходимо писать что-то вроде http://www.server.ru:223 может быть 
так...

vilfred ☆☆
()
Ответ на: комментарий от vilfred

УРА!!! Я вспомнил!!! надо писать на клиентской машине

ssh -C -p 222 root@localhost и тогда логинишься по ssh туннелю на удаленную машину.

гы, вот так вот...

Еще, те самые перлскрипты предназначены только для того, чтобы отлавливать падение соединения для случая 2) почему на перле - потому что была идея следать некую систему серверов, которые сидят в нете только через gprs соединение(в сибирь не проложишь сетевой кабель, а тарелка очень дорогая) и все эти серверы имеют кроссплатформенную систему восстановления коннекта(ssh под windows совершенно реально есть, нужно только найти драйвер для соответствующего протокола). И еще, скрипт под мою задачу написан, так что вызвать http тебе может и удастся, если ты настроишь port-forwarding через ssh (мне просто это не было нужно). либо на если на перле сделаешь этот самый форвардинг для http или что тебе там необходимо сделать, почему на перле, потому что он опять таки кросплатформенный и ты всю свою работу можешь сделать так, что она будет одинаково работать как под windows, так и под *nux.

vilfred ☆☆
()
Ответ на: комментарий от vilfred

Ok, pas'ki te bol'6oe za informaciu, budu kopat'. Edinstvennoe 4to hotel bi tebe rasskazat' o moej zada4e, moget tak ti pojme6 4to mne imenno nada. Kstati, na s4et proslu6ivania kanala ssh eto o4en' interesnaia zatea. Voobs4im tak. Ia uge napisal progu pod javoj kotoraia mne otkrivaet soket na vse klienti i dergit postoia nnoo otkritimi. I v principe commandi na client ia posilat' mogu bez problem 4erez moj sosket, t.e. ssh zapustit' na remote ia mogu, ostaetsia tol'ko podumat' horo6en'ko o realizacii canala proslu6ivania ssh na servere, t.k. ia ge ne mogu postoianno sluhat' vse ip vseh klientov, k tomu ge oi dinami4eskie. No po idee to 4to ti skazal dolgno srabotat'. Esli ne v padlo skin' mne tvoj email, napi6um 4to polu4ilos'. I esli ug na to po6lo est' k tebe es4e odin voprosik, moget ti s etim stalkivalsia. U menia est' GPRS modem siemens mc35 so vstroennim tcp-ip stackom. Ves4' ohuititel'naia, t.k. gprs ne teriaet dage pri vhodias4em zvonke, edinstvennoe 4to- kogda chat posilaet komandi, on ih ne vidit. t.e. pod terminalom gprs zapustit' mogu, a vot avtomatizirovat' process nu nikak. Moget posovetue6 4to. Zaranee blagodaren. S menia bol'6oe pivo. Virgin.

virgin13
() автор топика
Ответ на: комментарий от vilfred

I es4e hotel dobavit'. To 4to ti govori6, 4to ssh padaet- huj s nim, pust' padaet. Mne on nugen bukval'no na 2-3 min, i potom ia ego zakroiu. Kstati, mogno s takim ge uspehom ispol'zovat' vnc v regime listen. Gal', 4to apache etogo delat' ne moget :( mne v principe eta zateia tol'ko dlia apache i nugna...

virgin13
() автор топика
Ответ на: комментарий от virgin13

хм, я тебе выше писал про настройку именно ssh-туннеля...

а то что ты зайдешь на 2-3 минуты, это да, но один раз, в следующий раз тебе придется бежать кнопку на GPRS нажимать, чтобы был поднят ssh-туннель

vilfred ☆☆
()
Ответ на: комментарий от vilfred

1) http://www.linux-community.de/Neues/story?storyid=9523 http через ssh-туннель.

вот вся дискусия, правда на немецком 
http://www.linux-community.de/Neues/story?storyid=9954

я тебе в принципе описал как пускать ssh туннель(правдя не я его делал, но конфиги все вроде работают)

вот еще чето нашел в гугле по запросу http ssh-tunnel

<html>
<head>
</head><body><pre>#!/usr/local/bin/perl
#
# ssh-tunnel.pl	
#
# Usage: ssh-tunnel.pl ssl-proxy port destination_host port
#
# This script can be used by ssh as a &quot;ProxyCommand&quot; to 
# traverse a www-proxy/firewall that supports the http CONNECT 
# command described in
# <a href="http://home.netscape.com/newsref/std/tunneling_ssl.html">http
://home.netscape.com/newsref/std/tunneling_ssl.html</a>
#
# Example, connect to host named &quot;remote&quot; outside of your firewall:
#
# $ ssh remote -o&#39;ProxyCommand ssh-tunnel.pl www-proxy 80 remote 22&#39;
#
# Better yet, insert the ProxyCommand definition for host &quot;remote&quot; in 
# your $HOME/.ssh/config file:
#
#      .
#      .
#    Host remote
#      ProxyCommand /usr/local/bin/ssh-tunnel.pl www-proxy 80 %h %p
#      .
#      .
#
# Written by Urban Kaveus &lt;urban@statt.ericsson.se&gt;

require &#39;sys/socket.ph&#39;;

# Parse command line arguments

if ( $#ARGV != 3 ) {
    print STDERR &quot;Usage: $0 ssl-proxy port destination port\n&quot;;
    print STDERR $#ARGV, &quot;\n&quot;;
    exit(1);
}

$sslproxy    = shift;
$proxyport   = shift;
$destination = shift;
$destport    = shift;

# Set up network communication

($protocol) = (getprotobyname(&quot;tcp&quot;))[2];
($proxyip)  = (gethostbyname($sslproxy))[4];
$localaddr  = pack(&#39;S n a4 x8&#39;, &amp;AF_INET, 0, &quot;\0\0\0\0&quot;);
$proxyaddr  = pack(&#39;S n a4 x8&#39;, &amp;AF_INET, $proxyport, $proxyip);

socket (PROXY, &amp;AF_INET, &amp;SOCK_STREAM, $protocol) or
    die(&quot;Failed to create cocket&quot;);
bind (PROXY, $localaddr) or
    die(&quot;Failed to bind socket&quot;);
connect (PROXY, $proxyaddr) or
    die(&quot;Failed to connect to $sslproxy port $proxyport&quot;);

# Force flushing of socket buffers

select (PROXY);  $| = 1; 
select (STDOUT); $| = 1;

# Send a &quot;CONNECT&quot; command to proxy:

print PROXY &quot;CONNECT $destination:$destport HTTP/1.0\r\n\r\n&quot;;

# Wait for HTTP status code, bail out if you don&#39;t get back a 2xx code.

$_ = &lt;PROXY&gt;;
($status) = (split())[1];

die(&quot;Received a bad status code \&quot;$status\&quot; from proxy server&quot;) 
    if ( int($status/100) != 2 );

# Skip through remaining part of MIME header

while(&lt;PROXY&gt;) {
    chomp;   # Strip &lt;LF&gt;
    last if /^[\r]*$/;		# Empty line or a single &lt;CR&gt; left
}

# Start copying packets in both directions.

if($child = fork) { # Parent process
    while (sysread(STDIN,$_,4096)) {
        print PROXY;
    }
    sleep 2;
    kill(15,$child) if $child;
}

else { # Child process
    while (sysread(PROXY,$_,4096)) {
        print STDOUT;
    }
}



</pre></body></html>

vilfred ☆☆
()
Ответ на: комментарий от vilfred

Silen, odnako. Teriat' tebia ne ohota, ti mne mail skine6 ili net. Na s4et etogo vsego napi6u tebe rezul'tat zavtra, nada horo6en'ko vo vsem razobrat'sia. Spas'ki es4e raz : D

virgin13
() автор топика
Ответ на: комментарий от virgin13

я тебе уже скинул емейл по указанному тобой адресу, могу еще раз.

Но вообще, то когда делали этот ssh туннель, то его поддерживали перлскриптом посылая раз в 60 секунд, а перлом или джавой или си можно сделать ворвард пакетов любого типа по любому протоколу.

Короче, решение в принципе возможно... имхо, тебе надо ssh туннель просто сделать. А зайдя через него на удаленную машину ты можешь там сказать lynx http://127.0.0.1 и получить твою исходную html страничку на серваке за GPRS.

vilfred ☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.