dirk79
Goto Top

2 SSH-Server über Proxy erreichen

2x SSH an Port 443 und 22, jedoch nur Proxy-Port 443 offen...

Hallo liebe Admins!

Ich schildere einfach mal stichwortartig:

PC zu Hause:
---
  • Fritz!Box: Dropbear SSH-Server installiert. Lauscht an Port 22. Port 22 in´s INet freigegeben.
  • Rechner an Fritz!Box: openSSH. Ebenfalls Port 22. NAT (Fritz!Box) 443->22

PC im Büro:
---
  • HTTP-Proxy. Offene Ports: 80 und 443
  • PuTTY: Tunnels noch und nöcher face-smile

Soweit alles ok.
Mein "Problem":
Ich möchte meinen Rechner zu Hause nur bei Bedarf hochfahren.
Bedeutet: Ich brauche zuerst eine SSH zur Box, damit ich das WOL-Script ausführen kann.
Wenn der Rechner dann oben ist, brauche ich die SSH der Box nicht mehr. Dann möchte ich mich am SSH-Server des Rechners anmelden.
=> Port 22 wird aber vom Proxy unterbunden!
...Und den Port 80 geb ich nicht her, da läuft der WWW-Server und somit mein Wiki (weswegen ich auch eigentlich den ganzen Aufwand treibe;)

Meine (einzige) Idee bis jetzt:
Ich programmiere mir einen Client, der auf dem Remote-PC läuft und nach dem Booten gestartet wird. Der Client loggt sich (per Telnet im LAN zu Hause) ein und deaktiviert (oder ändert den Port) des SSH-Servers der Box. Beim Runterfahren gleiches Spiel rückwärts...
Würde auch funktionieren, kostet mich aber bestimmt 2-5 Stunden meiner Freizeit ;)
Ich hab auch schon versucht, nach dem Booten die Portfreigabe (Umleitung 443->22) per WebInterface wieder auf 22->22 umzustellen, aber die Box merkt, daß sie selbst den Port 22 benutzt und verbietet mir das deswegen.

Das kanns doch nicht sein!
Da gibt´s doch bestimmt ne elegantere, schnellere, Lösung als den o.e. "Spezial-Client" !-)
Vll. weiß ja jemand von euch Rat...

Gruß und Danke,
Dirk.

Content-Key: 49830

Url: https://administrator.de/contentid/49830

Printed on: April 23, 2024 at 15:04 o'clock

Member: dirk79
dirk79 Jan 26, 2007 at 14:12:42 (UTC)
Goto Top
Hat denn keiner auch nur eine Idee für einen Workaround?
Ich hab mal ne halbe Stunde in Google und "+PHP +SSH" investiert,
bin aber zu dem Schluss gekommen, daß ich nicht noch mehr Zeit in
die Suche nach einem Provider reinstecke, der libssh zur Verfügung stellt.
Oder kennt jemand einen (kostenlosen) Provider, der PHP mit libssh anbietet?
Wenn also niemand mehr ne Idee hat, dann muss ich wohl in den
sauren Apfel beißen und diesen "Spezial-Telnet-Client" programmieren face-sad

Gruß, Dirk.
Member: dirk79
dirk79 Feb 18, 2007 at 15:23:12 (UTC)
Goto Top
Ok, ich hab mir die Zeit genommen und diesen Client programmiert.
Wer außer mir sonst noch Interesse daran hat, der kann ihn hier runterladen: http://tinyurl.com/2puk3o
Wer prinzipiell erst anderer Leute exe untersucht, dem sei gesagt, daß das File mit upx gepackt ist.
Syntax: texec [fritz-ip] [fritz-password] [exe]
Folgende 2 Scripte habe ich mir dazu geschrieben:
# Temporäre Kopie der Datei "ar7.cfg" erstellen 
cat /var/flash/ar7.cfg > /var/tmp/ar7.cfg
# Box-SSH-Server auf 22 erreichbar machen:
sed -e "s/tcp 0.0.0.0\:443 0.0.0.0\:22/tcp 0.0.0.0\:22 0.0.0.0\:22/g" /var/tmp/ar7.cfg > /var/tmp/ar7.cfg.1  
# PC-SSH-Server-Weiterleitung (443->22) einschalten:
sed -e "s/# tcp 0.0.0.0\:443 192.168.178.22\:22/tcp 0.0.0.0\:443 192.168.178.22\:22/g" /var/tmp/ar7.cfg.1 > /var/flash/ar7.cfg  
# PC starten. WakeOnLan-Script ausführen:
/var/tmp/start_mypc
# Fritz!Box rebooten...
/sbin/reboot
# Temporäre Kopie der Datei "ar7.cfg" erstellen 
cat /var/flash/ar7.cfg > /var/tmp/ar7.cfg
# Box-SSH-Server auf 443 erreichbar machen:
sed -e "s/tcp 0.0.0.0\:22 0.0.0.0\:22/tcp 0.0.0.0\:443 0.0.0.0\:22/g" /var/tmp/ar7.cfg > /var/tmp/ar7.cfg.1  
# PC-SSH-Server-Weiterleitung (443->22) ausschalten:
sed -e "s/tcp 0.0.0.0\:443 192.168.178.22\:22/# tcp 0.0.0.0\:443 192.168.178.22\:22/g" /var/tmp/ar7.cfg.1 > /var/flash/ar7.cfg  
# Fritz!Box rebooten...
/sbin/reboot
Wenn das letzte Script im Verzeichnis "/var/tmp" liegt, dann würde der Aufruf von texec folgendermaßen aussehen:
texec 192.168.fritz.ip web-passwort /var/tmp/box_ssh_to_443

Der Client wird dann mit diesen Parametern kurz vor dem Herunterfahren des PCs aufgerufen.

Für mich funktioniert`s gut.
Gruß, Dirk.
Member: dirk79
dirk79 Feb 18, 2007 at 15:30:55 (UTC)
Goto Top
PS: Der Source-Code des Clients
Ist mit geringen Änderungen auch mit einem Linux zu kompilieren.
<code c>
/
INCLUDES
/
#include "stdio.h"
#include "stdlib.h"
#include "windows.h"
#include "winsock.h"
/


/
DEFINES
/
#define PORT 23
#define PROGINFO "usage: texec [fritz-ip] [fritz-password] [exe]"
/

#define BUFFER_SIZE 4096

/

char* passwd;
char* exe;

int handling(int sock)
{
char buffer[BUFFER_SIZE];
int bytes;

static int state = 0;

bytes = recv(sock, buffer, sizeof(buffer) - 1, 0);
if (bytes == -1)
return -1;
buffer[bytes] = '\0';

if(!state)
{
if(strstr(buffer,"password") != NULL)
{
state++;
printf("Logging in...\n");
send(sock,passwd,strlen(passwd),0);
}
}
else if(state == 1)
{
if(!bytes)
{
printf("Login failed. Check password...\n");
return 0;
}
if(strstr(buffer,"#") != NULL)
{
state++;
printf("Starting program...\n");
send(sock,exe,strlen(exe),0);
Sleep(1000);
}
}
else if(state == 2)
{
printf("%s", buffer);
return -1;
}

return bytes;
}


void freeStrings(void)
{
free((void*)passwd);
free((void*)exe);
}

/
MAIN FUNCTION
/
int main(int argc, char* argv)
{
The Variables
int Count;
UINT Option;
WORD Version;
SOCKET Socket;
WSADATA WSAData;
SOCKADDR_IN Address;

if(argc < 4)
{
Show Program Info
printf("\n");
printf(PROGINFO);
printf("\n \n");
return 0;
}

passwd = (char*)malloc(strlen(argv[2])+3);
exe = (char*)malloc(strlen(argv[3])+3);

{
printf("Out of memory");
return -1;
}

strcpy(passwd,argv[2]);
strcat(passwd,"\r\n");
strcpy(exe,argv[3]);
strcat(exe,"\r\n");

Non-Unix Startup Routine
if (WSAStartup(MAKEWORD(2, 0), &WSAData) != 0)
{
printf("Error: Startup failed. \n");
freeStrings();
return -1;
}

Zero-Fill Address Struct
memset(&Address, 0, sizeof(SOCKADDR_IN));

Set IPv4 Family
Address.sin_family=AF_INET;

Set Destination IP-Address
Address.sin_addr.s_addr = inet_addr(argv[1]);

Set actual Port
Address.sin_port = htons(PORT);

Socket Open
if ((Socket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
printf("Error: Could not create Socket. \n");
freeStrings();
return -1;
}

Disable Socket Option SO_KEEPALIVE
Option = 0;
if (setsockopt(Socket, SOL_SOCKET, SO_KEEPALIVE, (char *) &Option, sizeof(Option)) != 0)
{
printf("Error: Could not set socket option. \n");
printf("%d", WSAGetLastError());
freeStrings();
return -1;
}

Enable Socket Option SO_DONTLINGER
Option = 1;
if (setsockopt(Socket, SOL_SOCKET, SO_DONTLINGER, (char *) &Option, sizeof(Option)) != 0)
{
printf("Error: Could not set socket option. \n");
printf("%d", WSAGetLastError());
freeStrings();
return -1;
}

Socket Connect
if (connect(Socket, (SOCKADDR*)&Address, sizeof(SOCKADDR)) != SOCKET_ERROR)
{
Open Port
printf("Connected...\n");
while(handling(Socket) > 0);
printf("Disconnecting...\n");
}
else
{
Closed Port
printf("Could not start telnet session", Count);
}

freeStrings();

Socket Close
if (closesocket(Socket) != 0)
{
printf("Error: Could not close socket. \n");
return -1;
}

Non-Unix Cleanup Routine
if (WSACleanup() != 0)
{
printf("Error: Cleanup failed. \n");
return -1;
}

Exit
return 0;
}