-
1. Data: 2022-11-06 06:07:08
Temat: pytanie bardziej informatyczne
Od: sundayman <s...@p...onet.pl>
ale pewnie któryś z kolegów będzie wiedział.
Jest sobie urządzenie z modemem GPRS. To urządzenie łączy się z
komputerem, którym można to urządzenie obsługiwać poprzez "chmurę"
producenta modemów.
Czyli - w modemie ustawiam sobie adres serwera ( może to być zarówno IP
jak i domena) , numer portu itp.
Ze strony PC dokładnie tak samo. I ten serwer zestawia "transparentne
połączenie" po którym śmigają dane. Ruch jest minimalny, bo modem ma z
drugiej strony złąćze RS232 i de facto tam latają ramki po paręset
bajtów raz na jakiś czas.
Chciałbym, żeby modem nie łączył się z tym serwerem bezpośrednio ale
przez mój serwer proxy. Czyli modem trafia na mój serwer i on
pośredniczy w połączeniu z serwerem producenta modemu.
Docelowo chciałbym postawić sobie ten mój serwer proxy fizycznie u
siebie, ale to ciut później.
Teraz najwygodniej byłoby mi to zrobić na moim serwerze ( na seohost) ,
na którym trzymam strony internetowe. Albo kupiłbym jakiś prosty VPS u
nich jeśli tak będzie lepiej.
Pytanie - na czym da się to zrobić najprościej dla kogoś ( znaczy mnie )
kto linuxa zna słabo i ogólnie ma doświadczenie z serwerami na poziomie
pozwalającym zrobienie sobie strony, poczty itp pierdoły podstawowe.
Poczytałem trochę tego rodzaju rzeczy;
https://www.fosslinux.com/46027/self-hosted-proxy-se
rvers.htm
ale niewiele to na razie wniosło w moje życie. Gdybym miał to stawiać na
własnym biurku to wolałbym coś na (tfu) windows albo OSX.
Jednym słowem - jak się za to zabrać ?
-
2. Data: 2022-11-06 06:30:42
Temat: Re: pytanie bardziej informatyczne
Od: sundayman <s...@p...onet.pl>
z tego co poczytałem, to ten proceder można by zrealizować za pomocą
OpenVPN postawionym np. na UBUNTU na serwerze VPS ?
Czy tak i czy to jest dobre rozwiązanie ?
I kolejne pytanie - czy muszę mieć stałe IP do tego VPS czy też na
przykład można wykorzystać adresowanie przez subdomenę, którą mogę sobie
założyć na swoim serwerze www ?
-
3. Data: 2022-11-06 10:04:22
Temat: Re: pytanie bardziej informatyczne
Od: Marek <f...@f...com>
Ale potrzebujesz takie proxy po udp czy TCP? Poniżej kod prostego
redirectora w warstwie aplikacyjnej. Instrukcja jak użyć i
skompilować na początku pliku.
/* 21.3.97
- opravena chybna manipulace s procesy (uz nevytvari zive mrtvoly)
-+= chaky =+-
*/
/* 3.8.97
- Pridan parametr -n pro zmenu jmena procesu pro lepsi maskovani ;)
-+= chaky =+-
*/
/* 21.11 Zmena - moze sa specifikovat uid a gid pod ktorym to vsetko
bezi */
/* redirect v2.0
* By Alhambra (a...@i...com)
* and
* Maurautius (m...@l...com)
* October 6, 1996
* Usage:
* redirector [-p localport] [-h remotehost] [-r
remoteport]
* ie:
* redirector -p 4300
* redirector -p 4400 -h whitehouse.gov -r 25
*
* Should be fairly portable...to compile on:
* Solaris: gcc redirector.c -lsocket -lnsl -o redirector
* Linux: gcc redirector.c -DLINUX -o redirector
* Irix: gcc redirector.c -o redirector
* SunOs: gcc redirector.c -o redirector
* You get the idea...
*
*
* By default, it now runs on a port which is #defined a few lines
down...
* This way, it's a little less obvious what it is from a ps -ef
*
*
* This version also has passwording on the socket. So, when you
connect, the
* first thing you need to type in the password, followed by a cr.
The default
* password is xxxxx (but you'll change this, right?). SO you'd do
something
* like:
* telnet foobar.com 4678
* Trying 3.1.3.37
* Connected to foobar.com
* Escape character is '^]'.
* xxxxx
* placetogo.com porttogoto
*
* And you'll be automagically there. There's also a dynamic static
mode...
* read the source, and you'll figure it out.
*/
/* Maximum time for user interaction and connection */
#define INTERACTION_TIMEOUT 60
#define CONNECTION_TIMEOUT 100
#define REDIR_TIMEOUT 180
#define DEFAULT_PORT 19750
#define UID 7000
#define GID 500
#include <sys/types.h>
#include <sys/wait.h>
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/param.h>
#include <sys/times.h>
#ifdef LINUX
#include <sys/time.h>
#endif
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/signal.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <sys/stat.h>
static char localip[64];
typedef void Sigfunc(int);
extern int errno;
void
usage (char *progname)
{
fprintf (stderr, "%s: -l LOCALIP -p LOCALPORT -h REMOTEHOST -r
REMOTEPORT [-n NEWCMDNAME]\n", progname);
fprintf (stderr, "example: %s -l 192.168.2.1 -p 9100 -h
foo.bar.com -r 25 -n httpd\n", progname);
fflush (stderr);
exit (1);
}
int
set_fl (int fd, int flags)
{ /* set file descriptor props */
int val;
if ((val = fcntl (fd, F_GETFL, 0)) < 0)
return (-1);
val |= flags;
if ((fcntl (fd, F_SETFL, val)) < 0)
return (-1);
return (0);
}
/*------------------------------------------------
* s e t u p _ s o c k e t
*
*/
int setup_socket (int *tcpsocket, short port)
{ /* set up incoming socket */
int flag=1;
struct sockaddr_in serv_addr;
if ((*tcpsocket = socket (AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("socket (AF_INET, SOCK_STREAM, 0)) < 0\n");
exit (-1);
}
setsockopt(*tcpsocket, SOL_SOCKET, SO_REUSEADDR, &flag,
sizeof(int));
memset (&serv_addr, 0, sizeof (serv_addr));
serv_addr.sin_family = AF_INET;
// serv_addr.sin_addr.s_addr = htonl (INADDR_ANY);
//
//inet_aton(localip, &serv_addr.sin_addr);
serv_addr.sin_addr.s_addr = inet_addr(localip);
serv_addr.sin_port = htons (port);
setsockopt(*tcpsocket,SOL_SOCKET,SO_REUSEADDR,0,0);
setsockopt(*tcpsocket,SOL_SOCKET,SO_LINGER,0,0);
if (bind (*tcpsocket, (struct sockaddr *) &serv_addr, sizeof
(serv_addr)) < 0){
printf("can't bind to %s \n",localip);
return (-1);
}
return (0);
}
void
feed_through (int tcpfd, int outfd)
{
fd_set fdvar;
char buffer[8192];
int width;
size_t numbytes;
width = (tcpfd > outfd) ? tcpfd + 1 : outfd + 1;
set_fl (outfd, O_NONBLOCK);
set_fl (outfd, O_NONBLOCK);
while (1)
{
FD_ZERO (&fdvar);
FD_SET (tcpfd, &fdvar);
FD_SET (outfd, &fdvar);
select (width, &fdvar, (fd_set *) 0, (fd_set *) 0, NULL);
if (FD_ISSET (tcpfd, &fdvar))
{
if ((numbytes = read (tcpfd, buffer, sizeof (buffer))) == 0) {
alarm (0);
return;
};
if ((write (outfd, buffer, numbytes)) != numbytes)
{
alarm (0);
exit (-1);
}
}
else if (FD_ISSET (outfd, &fdvar))
{
/* Read from the outfd and write to the tcp */
if ((numbytes = read (outfd, buffer, sizeof (buffer))) == 0) {
alarm (0);
return;
};
if ((write (tcpfd, buffer, numbytes)) != numbytes)
{
alarm (0);
exit (-1);
}
}
else
{
alarm (0);
exit (-1);
}
}
alarm (0);
};
/*--------------------------------------------------
* This does the happy UNIX daemon initialization.....
*
* Taken from steven's book on unix programming.
*/
int daemon_init(void) {
pid_t pid;
return;
if ( (pid=fork()) < 0)
return -1;
else if (pid != 0)
exit(0); /* parent goes bye-bye */
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
setsid(); /* become session leader */
chdir("/"); /* change working directory */
umask(0); /* clear file creation mask */
setuid(UID);
setgid(GID);
return 0;
}
/*------------------------------------------------
* f d g e t s
*
* fgets (almost) with a file descriptor instead of a stream
* gets the next non-empty line.
*/
const char *newln = "\n\r";
int fdgets(char *buffer, int size, int fd) {
int i=0;
/* Start by skipping over any new lines */
if (read(fd, buffer, 1)==-1) return -1;
while (strchr(newln, buffer[i]))
if (read(fd, buffer, 1)==-1) return -1;
/* Now start really reading the line */
while (buffer[i] != '\n' && i < size-1) {
i++;
if (read(fd, buffer+i, 1)==-1) return -1;
}
/* Terminate the string */
buffer[i] = 0;
return i;
}
/*------------------------------------------------
* d o C o n n e c t
*/
int doConnect(char *hostname, short port) {
int sockfd;
struct sockaddr_in remote;
struct hostent *host;
alarm (CONNECTION_TIMEOUT); /* Reset timeout */
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) return -1;
host = gethostbyname(hostname);
if (!host) return -1;
remote.sin_family = AF_INET;
memcpy(&remote.sin_addr, host->h_addr_list[0],
sizeof(remote.sin_addr));
remote.sin_port = htons(port);
if (connect(sockfd, (struct sockaddr *) &remote, sizeof(remote)) ==
-1)
sockfd = -1;
alarm (0);
return sockfd;
}
/*------------------------------------------------
* s t a t i c R e d i r e c t
*/
void staticRedirect(short localport, char *hostname, short port) {
int listen_sock, in_sock, out_sock;
struct sockaddr_in client;
int client_size;
alarm (REDIR_TIMEOUT);
if (setup_socket(&listen_sock, localport) == -1) exit(0);
listen(listen_sock, 1);
client_size = sizeof(client);
in_sock = accept(listen_sock, (struct sockaddr *) &client,
&client_size);
if (in_sock == -1) exit(0);
out_sock = doConnect(hostname, port);
if (out_sock == -1) exit(0);
alarm(0);
feed_through(in_sock, out_sock);
}
/*------------------------------------------------
* i n t e r a c t i o n
*/
#define BUFFSIZE 100
void interaction(int sockfd) {
int outsock;
char passwd[10];
char *sep = " \t\n\r";
char buffer[100];
char *tok;
char *hostname, *port, *port2;
alarm(INTERACTION_TIMEOUT); /* Enable timeout */
/* avoid "strings" */
/* set up our 'password' string */
passwd[0] = 's';
passwd[1] = 'e';
passwd[2] = 'r';
passwd[3] = 't';
passwd[4] = 0;
passwd[5] = 0;
/* Step 1: Check password */
if (fdgets(buffer, BUFFSIZE, sockfd) < 0) exit(0);
tok = strtok(buffer, sep);
if (!tok || strcmp(tok, passwd)) exit (0);
/* Step 2: Get command */
if (fdgets(buffer, BUFFSIZE, sockfd) < 0) exit(0);
hostname = strtok(buffer, sep);
port = strtok(NULL, sep);
port2 = strtok(NULL, sep);
if (strtok(0,sep)) exit(0); /* Bail if there's trailing crap */
if (!port) exit(0); /* User gave bogus line... */
alarm(0); /* Disable timeout */
if (!port2) {
outsock = doConnect(hostname, atoi(port));
if (outsock == -1) exit(0);
feed_through(sockfd, outsock);
} else { /*-- One-the-fly redirction -----------------*/
close(sockfd); /* Get rid of user */
staticRedirect(atoi(port2), hostname, atoi(port));
}
exit(0);
}
/*------------------------------------------------
* m a i n
*/
int main (int argc, char *argv[])
{
int c;
int dset = 0, hset = 0,i;
int port = DEFAULT_PORT;
char *host=0, *n_cmdname,cmdtext[255];
int remote=0;
int tcpfd, tcpsocket;
struct sockaddr_in client_addr;
int client_len;
pid_t pid;
int outfd;
localip[0]=0;
while ((c = getopt (argc, argv, "p:r:h:n:l:")) != -1)
switch (c)
{
case 'p':
port = atoi (optarg);
break;
case 'r':
remote = atoi (optarg);
dset = 1;
break;
case 'h':
host = optarg;
hset = 1;
break;
case 'l':
strcpy(localip,optarg);
break;
case 'n':
n_cmdname = optarg;
strcpy(cmdtext,n_cmdname);
for(i=0;i<argc;i++) {
memset(argv[i],'\x0',strlen(argv[i]));
};
strcpy(argv[0],cmdtext);
break;
case '?':
usage (argv[0]);
break;
}
if(! localip[0]) usage (argv[0]);
daemon_init(); /* Go into daemon mode... */
/* Bind the specified port. */
if (setup_socket (&tcpsocket, port) == -1) {
/* socket setup error - report somehow? */
/* Naw, we want to be quiet...no error reporting. */
/* fprintf (stderr, "Error in seting up the socket.
Aborting.\n");*/
exit (-1);
}
/* We wait for a connection on the spec. port */
for (;;) {
listen (tcpsocket, 5);
client_len = sizeof (client_addr);
tcpfd = accept (tcpsocket, (struct sockaddr *) &client_addr,
&client_len);
pid=fork();
setsid();
if (pid > 0) {
close(tcpsocket);
if (dset) {
outfd = doConnect(host, remote);
if (outfd == -1) {
close(tcpfd);
exit(0);
};
feed_through(tcpfd, outfd);
}
else {
interaction(tcpfd);
};
close(tcpfd);
exit(0);
}
else {
close (tcpfd);
};
};
/* End of Main */
};
--
Marek
-
4. Data: 2022-11-06 11:28:02
Temat: Re: pytanie bardziej informatyczne
Od: Cezar <c...@t...pl.invalid>
On 06/11/2022 05:07, sundayman wrote:
> ale pewnie któryś z kolegów będzie wiedział.
>
> Jest sobie urządzenie z modemem GPRS. To urządzenie łączy się z
> komputerem, którym można to urządzenie obsługiwać poprzez "chmurę"
> producenta modemów.
>
> Czyli - w modemie ustawiam sobie adres serwera ( może to być zarówno IP
> jak i domena) , numer portu itp.
> Ze strony PC dokładnie tak samo. I ten serwer zestawia "transparentne
> połączenie" po którym śmigają dane. Ruch jest minimalny, bo modem ma z
> drugiej strony złąćze RS232 i de facto tam latają ramki po paręset
> bajtów raz na jakiś czas.
>
> Chciałbym, żeby modem nie łączył się z tym serwerem bezpośrednio ale
> przez mój serwer proxy. Czyli modem trafia na mój serwer i on
> pośredniczy w połączeniu z serwerem producenta modemu.
>
> Docelowo chciałbym postawić sobie ten mój serwer proxy fizycznie u
> siebie, ale to ciut później.
> Teraz najwygodniej byłoby mi to zrobić na moim serwerze ( na seohost) ,
> na którym trzymam strony internetowe. Albo kupiłbym jakiś prosty VPS u
> nich jeśli tak będzie lepiej.
>
> Pytanie - na czym da się to zrobić najprościej dla kogoś ( znaczy mnie )
> kto linuxa zna słabo i ogólnie ma doświadczenie z serwerami na poziomie
> pozwalającym zrobienie sobie strony, poczty itp pierdoły podstawowe.
>
> Poczytałem trochę tego rodzaju rzeczy;
>
> https://www.fosslinux.com/46027/self-hosted-proxy-se
rvers.htm
>
> ale niewiele to na razie wniosło w moje życie. Gdybym miał to stawiać na
> własnym biurku to wolałbym coś na (tfu) windows albo OSX.
>
> Jednym słowem - jak się za to zabrać ?
>
>
czy wiesz jakiego VPN/ tunelu używa ten modem?
czy masz dostęp do konfiguracji czy nawet oprogramowania tego modemu?
Proxy (jakiekolwiek by to nie było) może nie zadziałać jeżeli producent
autentykuje / autoryzuje się po PKI
c.
-
5. Data: 2022-11-06 12:01:06
Temat: Re: pytanie bardziej informatyczne
Od: Mirek <m...@n...dev>
On 6.11.2022 06:07, sundayman wrote:
-
6. Data: 2022-11-06 12:05:49
Temat: Re: pytanie bardziej informatyczne
Od: Mirek <m...@n...dev>
On 6.11.2022 12:01, Mirek wrote:
> On 6.11.2022 06:07, sundayman wrote:
Dobra, chyba któryś serwer obciął, bo uznał to za niebezpieczne :)
generalnie chodziło mi o to:
https://notes.tweakblogs.net/blog/7955/using-netcat-
to-build-a-simple-tcp-proxy-in-linux.html
Możesz to odpalić po prostu na serwerze, na którym masz shell-a.
--
Mirek.
-
7. Data: 2022-11-06 13:13:03
Temat: Re: pytanie bardziej informatyczne
Od: Dawid Rutkowski <d...@w...pl>
niedziela, 6 listopada 2022 o 06:07:10 UTC+1 sundayman napisał(a):
> Jednym słowem - jak się za to zabrać ?
Ale co właściwie chcesz osiągnąć?
Podgląd komunikacji?
Jak serwer jest Twój, czyli nasz roota, to najprostszy będzie DNAT.
Ustawiasz w modemie jako adres serwera adres Twojego serwera, patrzysz tcpdumpem, na
którym porcie modem puka, a pitem ustawiasz DNAT tego portu na serwer producenta.
Cały ruch idzie przez Fwój serwer, więc podgląd i zapis tcpdumpem.
-
8. Data: 2022-11-06 22:04:49
Temat: Re: pytanie bardziej informatyczne
Od: sundayman <s...@p...onet.pl>
W dniu 2022-11-06 o 12:05, Mirek pisze:
> On 6.11.2022 12:01, Mirek wrote:
>> On 6.11.2022 06:07, sundayman wrote:
>
> Dobra, chyba któryś serwer obciął, bo uznał to za niebezpieczne :)
> generalnie chodziło mi o to:
> https://notes.tweakblogs.net/blog/7955/using-netcat-
to-build-a-simple-tcp-proxy-in-linux.html
> Możesz to odpalić po prostu na serwerze, na którym masz shell-a.
>
dzięki za materiały, zaraz się zapoznam.
-
9. Data: 2022-11-06 22:04:52
Temat: Re: pytanie bardziej informatyczne
Od: sundayman <s...@p...onet.pl>
> czy wiesz jakiego VPN/ tunelu używa ten modem?
> czy masz dostęp do konfiguracji czy nawet oprogramowania tego modemu?
Do konfiguracji oczywiście tak, do firmware oczywiście nie.
Komunikacja, z której korzystam jest po TCP.
Jak wygląda autoryzacja samego modemu do serwera producenta nie wiem -
od strony modemu to jest hasło oraz numer modemu.
> Proxy (jakiekolwiek by to nie było) może nie zadziałać jeżeli producent
> autentykuje / autoryzuje się po PKI
Nie wydaje mi się, ale tego nie wiem.
> Ale co właściwie chcesz osiągnąć?
> Podgląd komunikacji?
Chodzi raczej o kwestie "polityczne".
Rzecz w tym, żeby "ukryć" adres oryginalnego serwera - z pewnych
względów wolę, żeby był tam adres mój.
Nie potrzebna mi żadna ingerencja ani żaden podgląd w tym momencie.
-
10. Data: 2022-11-06 22:12:10
Temat: Re: pytanie bardziej informatyczne
Od: sundayman <s...@p...onet.pl>
> czy wiesz jakiego VPN/ tunelu używa ten modem?
A musi używać ?
Jedne co mam to adres i port serwera.
No i dostęp do systemu zarządzania na tymże serwerze, ale w tym
konkretnym przypadku z mojego punku widzenia nic ten serwer nie robi -
przesyła dane z jednego modemu do drugiego.
Bo ten program na PC jest właściwie traktowany jako drugi modem.
Zresztą to może być i fizycznie taki układ dwa modemy połączone ze sobą
via GPRS<>internet.
Czyli moją sytuacja jest schematycznie taka
jeśli to są 2 modemy:
RS232(modem)---GPRS---serwer---GPRS---(modem)RS232
jeśli modem + PC:
RS232(modem)---GPRS---serwer---(PC)RS232
konfiguracyjnie się to niczym nie różni.
W przypadku PC zamiast fizycznego modemy to mała aplikacja, której
podaje się dokładnie te same parametry co modemowi ( adres serwer + port
) i ona udostępnia wirtualny COM port.