hoe programma binden op ip

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • DeadLock
  • Registratie: December 2005
  • Laatst online: 30-09 17:37

DeadLock

Vastlopen is relatief....

Topicstarter
Ik zit met een technisch probleem waarvan ik niet eens zeker weet of het mogelijk is, wat het googl'n nogal moeilijk maakt. Het probleem is als volgt: ik heb een programma (closed source) wat ik meerdere keren wil draaien op mijn dedicated server, maar helaas kan ik het ip (of de poort) niet aanpassen in de config file of door middel van een argument bij het starten van het programma. Ik heb wel beschikking over enkele ip's (dus eth0:1 tot eth0:6) waar ik de andere instanties van dat programma op zou kunnen draaien.

Het is mij nu alleen niet duidelijk hoe dit mogelijk zou zijn, indien het al mogelijk is. Ik heb zelf al de volgende opties bedacht:

- een virtuele machine aanmaken voor iedere instantie. Dit zou een oplossing zijn, maar praktisch gezien niet mogelijk door het ram gebruik van iedere vm. Zeker daar het programma zelf misschien 10mb aan ram gebruikt ook niet helemaal te verantwoorden :+.

- openvz. Dit zou (zover ik openvz ken, heb er nog niet mee gespeeld) ideaal zijn, maar praktisch ook niet erg haalbaar omdat ik dan een nieuwe kernel moet bakken en rebooten. Heb eerlijk gezegd weinig/geen zin om het risico te nemen.

- chroot: Heb zitten zoeken of het met een eenvoudige chroot mogelijk is, maar zover mijn google skills me gebracht hebben lijkt me dit niet mogelijk helaas. Of heb ik dit verkeerd?

Graag zou ik weten of er nog andere manieren zijn om verschillende instanties van een programma te 'binden' op een apart ip. Het mag een relatief 'ranzige' hack zijn of héél creatief, zolang het maar het beoogde resultaat haalt :X. Hopelijk heeft er iemand een leuk idee hoe dit mogelijk is _/-\o_.

Strava


Acties:
  • 0 Henk 'm!

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Voor elke instantie een library maken die (uit m'n hoofd) bind(2) of listen override.
Strace op een programma dat luistert op poort 300:
code:
1
2
bind(5, {sa_family=AF_INET, sin_port=htons(300), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
listen(5, 1)                            = 0
Als je een library met je eigen bind/listen in de LD_PRELOAD zet, kun je voor elke instantie de juiste parameters voor de inet_addr meegeven. Over LD_PRELOAD is wel wat te vinden denk ik (en hoop ik).

Acties:
  • 0 Henk 'm!

  • benoni
  • Registratie: November 2003
  • Niet online
Niet dat ik het zelf heb geprobeerd, maar je kunt met xinetd toch ook een bind maken naar een bepaalde (multi-home) netwerkaansluiting?

man xinetd.conf:
bind
Allows a service to be bound to a specific interface on the machine. This means you can have a telnet server listening on a local, secured interface, and not on the external interface. Or one port on one interface can do something, while the same port on a different interface can do something completely different. Syntax: bind = (ip address of interface).

interface
Synonym for bind.

[ Voor 65% gewijzigd door benoni op 12-12-2008 14:06 ]


Acties:
  • 0 Henk 'm!

  • DeadLock
  • Registratie: December 2005
  • Laatst online: 30-09 17:37

DeadLock

Vastlopen is relatief....

Topicstarter
blaataaps schreef op vrijdag 12 december 2008 @ 13:51:
Voor elke instantie een library maken die (uit m'n hoofd) bind(2) of listen override.
Strace op een programma dat luistert op poort 300:
code:
1
2
bind(5, {sa_family=AF_INET, sin_port=htons(300), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
listen(5, 1)                            = 0
Als je een library met je eigen bind/listen in de LD_PRELOAD zet, kun je voor elke instantie de juiste parameters voor de inet_addr meegeven. Over LD_PRELOAD is wel wat te vinden denk ik (en hoop ik).
Om eerlijk te zijn gaat dit mijn petje te boven vrees ik, maar ik ga het eens rustig proberen te begrijpen wat je zegt en uitzoeken of het me zelf ook kan lukken O-).
benoni schreef op vrijdag 12 december 2008 @ 13:54:
Niet dat ik het zelf heb geprobeerd, maar je kunt met xinetd toch ook een bind maken naar een bepaalde (multi-home) netwerkaansluiting?

man xinetd.conf:

[...]
Dit klinkt me iets bekender in de oren en lijkt me ook haalbaar met mijn linux kennis :). Ik ga eens verder uitzoeken hoe ik het praktisch kan realiseren. Het gedeelte wat je van de man pagina toont geeft me wel de indruk dat het (niet al te ingewikkeld :P) moet kunnen inderdaad.

Alvast bedankt.

Strava


Acties:
  • 0 Henk 'm!

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Het werkt vrij eenvoudig:
code:
1
2
3
4
5
6
7
8
% nc  -l -p 8888 & netstat -anp 2>/dev/null | grep 8888
tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      7544/nc
% kill %1
% LD_PRELOAD=./liboverride.so nc  -l -p 8888 & netstat -anp 2>/dev/null | grep 8888
GEFOPT
tcp        0      0 127.0.0.1:8888          0.0.0.0:*               LISTEN      7547/nc
% kill %1
%
Hetzelfde programma aangeroepen, met dezelfde parameters, maar zoals je ziet luistert ie in het 2e geval (met mijn library erbij) op een ander IP, namelijk 127.0.0.1 in plaats van 0.0.0.0, en geeft het een melding dat er iets gefopt is. De volgende code is mijn fop-library:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define _GNU_SOURCE 1
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <dlfcn.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen) // de library-call die we willen onderscheppen
{
    int (*orig_bind)(int sockfd, const struct sockaddr *addr,socklen_t addrlen) = dlsym(RTLD_NEXT, "bind"); // pointer naar originele bind
    printf("GEFOPT\n");   // aangeven dat er iemand gefopt is
    inet_aton("127.0.0.1", &(((struct sockaddr_in*)addr)->sin_addr));                 // ons nieuwe ip-adres in de struct addr schrijven
    return orig_bind(sockfd,addr,addrlen);                      // en omdat we uiteindelijk toch wel echt een socket willen, de originele bind aanroepen, met onze eigen addr, en voor de rest de opgegeven parameters
}


En vlak nadat ik zelf iets gefabriceerd had, kwam ik het kant en klare tegen: http://www.semicomplete.com/projects/liboverride/#id2245005 , dit is een set macro's die functies als die ik net postte genereert, met tussen de voorbeelden bijna precies wat jij nodig hebt zo te zien.

[ Voor 8% gewijzigd door blaataaps op 12-12-2008 15:00 ]


Acties:
  • 0 Henk 'm!

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

evert_ schreef op vrijdag 12 december 2008 @ 13:14:
- openvz. Dit zou (zover ik openvz ken, heb er nog niet mee gespeeld) ideaal zijn, maar praktisch ook niet erg haalbaar omdat ik dan een nieuwe kernel moet bakken en rebooten. Heb eerlijk gezegd weinig/geen zin om het risico te nemen.
offtopic:
Als je het risico van een bracque server niet kunt lopen, is het tijd om na te denken wat er gebeurt als er opeens rook uit, of water in, de machine komt. En testen wil je sowieso op een andere machine doen ;)

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Acties:
  • 0 Henk 'm!

  • DeadLock
  • Registratie: December 2005
  • Laatst online: 30-09 17:37

DeadLock

Vastlopen is relatief....

Topicstarter
@Blaataaps: Bedankt voor je uitgebreide hulp, dit zou inderdaad exact moeten doen wat ik wil bereiken :). Ik ben gestart met het (naar een library) compilen van je source en dan hetzelfde te runnen als in je voorbeeld. Helaas doe ik blijkbaar ergens iets verkeerd aangezien ik volgende error krijg:
ERROR: ld.so: object './liboverride.so' from LD_PRELOAD cannot be preloaded: ignored.


Ik zal naar alle waarschijnlijkheid ergens een erg domme fout gemaakt hebben, maar na er een half uur naar te staren en steeds opnieuw proberen ben ik er nog niet uit en zal ik het 'newb gehalte' van het topic nog wat vergroten door het toch maar te vragen ;(.

Als ik het verder snap (niet zeker natuurlijk :P) kan ik de source die je postte letterlijk gebruiken voor wat ik wil (enkel even het ip aanpassen) of mis ik daar nog iets ? :)
F_J_K schreef op vrijdag 12 december 2008 @ 15:22:
[...]
offtopic:
Als je het risico van een bracque server niet kunt lopen, is het tijd om na te denken wat er gebeurt als er opeens rook uit, of water in, de machine komt. En testen wil je sowieso op een andere machine doen ;)
Ik heb natuurlijk degelijke backups, maar geen beschikking over een vergelijkbare machine om op te testen en 'remote' nieuwe kernel vind ik toch altijd wel een risico en ik heb weinig zin om het te mogen fixen als het niet werkt :P. Als de server wegsmeult dan zal de hoster wel nieuwe hardware voor me plaatsen en komt de backup van pas. Maar problemen zoeken als het goed draait, nee daar ben ik te lui voor :+

Strava


Acties:
  • 0 Henk 'm!

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
evert_ schreef op vrijdag 12 december 2008 @ 16:10:
@Blaataaps: Bedankt voor je uitgebreide hulp, dit zou inderdaad exact moeten doen wat ik wil bereiken :). Ik ben gestart met het (naar een library) compilen van je source en dan hetzelfde te runnen als in je voorbeeld. Helaas doe ik blijkbaar ergens iets verkeerd aangezien ik volgende error krijg:
ERROR: ld.so: object './liboverride.so' from LD_PRELOAD cannot be preloaded: ignored.


Ik zal naar alle waarschijnlijkheid ergens een erg domme fout gemaakt hebben, maar na er een half uur naar te staren en steeds opnieuw proberen ben ik er nog niet uit en zal ik het 'newb gehalte' van het topic nog wat vergroten door het toch maar te vragen ;(.
Hoe compile je dat bestand?
Als ik het verder snap (niet zeker natuurlijk :P) kan ik de source die je postte letterlijk gebruiken voor wat ik wil (enkel even het ip aanpassen) of mis ik daar nog iets ? :)
Voor zover ik zie zou dat ip aanpassen genoeg moeten zijn, als het eenmaal werkt simpel te controleren met netstat :)

Acties:
  • 0 Henk 'm!

  • DeadLock
  • Registratie: December 2005
  • Laatst online: 30-09 17:37

DeadLock

Vastlopen is relatief....

Topicstarter
Door je vraag hoe ik het compile heb ik even zitten google'n hoe het moest en na wat error solving gebruik ik nu het volgende gcc commando wat lijkt te werken :*).
gcc -Wall -fPIC -shared -o liboverride.so liboverride.c -ldl


Nu gaat er alleen ergens nog iets klein fout, waarom en hoe op te lossen weet ik helaas niet :P.
LD_PRELOAD=./liboverride.so nc  -l -p 8888 & netstat -anp 2>/dev/null | grep 8888
GEFOPT
[1] 6068
tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      -
Can't grab 127.0.0.1:8888 with bind


Edit: Hmm, pebkac, volgens mij kom ik er wel uit. Poort 8888 is/was gewoon nog in gebruik :+
Edit: Inderdaad, er draaide ergens nog stiekem een 'nc'. Helaas onder een andere user waardoor ik het niet direct door had |:(. Nu doet het theoretische voorbeeldje het dus perfect en ga ik kijken of ik het ook aan de praat krijg icm met mijn doelprogramma :).

Fantastisch dat zo iets kan onder linux _/-\o_

[ Voor 47% gewijzigd door DeadLock op 12-12-2008 17:00 ]

Strava


Acties:
  • 0 Henk 'm!

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Sluit je tussendoor wel je al draaiende netcats af? Ik zie net dat nc niet (meteen) een foutmelding geeft in het geval van "EADDRINUSE (Address already in use)", als je een nieuwe start en de oude draait nog gebeurt er dus weinig, en zal grep dus nog je oude laten zien.

Acties:
  • 0 Henk 'm!

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 10:08

pistole

Frutter

Probeert het programma niet 'stiekum' een specifiek ip-adres te binden?
Check even met netstat wat het programma in 'normale' omstandigheden doet (je zou dus 0.0.0.0:??? verwachten)

Ik frut, dus ik epibreer


Acties:
  • 0 Henk 'm!

  • DeadLock
  • Registratie: December 2005
  • Laatst online: 30-09 17:37

DeadLock

Vastlopen is relatief....

Topicstarter
In normale omstandigheden zie ik met netstat dat het programma inderdaad 0.0.0.0:xxxx gebruikt. Helaas wilt het nog niet helemaal lukken, als ik het programma aanroep met die library (die nog steeds leuk gefotp roept :D) krijg ik wel nog een error van het programma dat het niet in staat is om zich te 'binden' aan het tcp socket.

Strava


Acties:
  • 0 Henk 'm!

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 10:08

pistole

Frutter

misschien eens met een strace aanroepen? Misschien probeert het programma expliciet met 0.0.0.0 te binden ofzo?
* pistole roept maar wat en gaat snel naar huis om weekend te vieren

Ik frut, dus ik epibreer


Acties:
  • 0 Henk 'm!

  • DeadLock
  • Registratie: December 2005
  • Laatst online: 30-09 17:37

DeadLock

Vastlopen is relatief....

Topicstarter
setsockopt(4, SOL_SOCKET, SO_LINGER, {onoff=0, linger=0}, 8) = 0
fcntl64(4, F_GETFL)                     = 0x2 (flags O_RDWR)
fcntl64(4, F_SETFL, O_RDWR|O_NONBLOCK)  = 0
write(1, "GEFOPT :D\n", 10)             = 10
bind(4, {sa_family=AF_INET, sin_port=htons(xxxx), sin_addr=inet_addr("xx.xx.xx.xx")}, 16) = -1 EADDRINUSE (Address already in use)
time(NULL)                              = 1229097957
stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2309, ...}) = 0


Dat zegt trace en op de plaats van dat inet_addr staat het adres van eth0:1 dus niet het ip waarop het programma al draait. Netstat greppen op dat tweede ip toont me niets en op de poort toont me alleen wat van de instantie die draait op het 'hoofd' ip.

Strava


Acties:
  • 0 Henk 'm!

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Hij is al in gebruik staat er duidelijk, zit die andere instantie al op 0.0.0.0? Dan kan er niks anders meer bij.

Acties:
  • 0 Henk 'm!

  • DeadLock
  • Registratie: December 2005
  • Laatst online: 30-09 17:37

DeadLock

Vastlopen is relatief....

Topicstarter
Jup die andere zit op 0.0.0.0 :
tcp        0      0 0.0.0.0:xxxx            0.0.0.0:*               LISTEN      -

Dus dan valt het niet op te lossen op deze manier? Virtuele 0.0.0.0 ofzo :+.

Strava


Acties:
  • 0 Henk 'm!

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Je moet die ook op z'n eigen ip zetten, in plaats van 0.0.0.0, er is maar 1 0.0.0.0

Acties:
  • 0 Henk 'm!

  • DeadLock
  • Registratie: December 2005
  • Laatst online: 30-09 17:37

DeadLock

Vastlopen is relatief....

Topicstarter
Natuurlijk, dom van me 8)7.

Nu werkt het perfect _/-\o_ :D. Bedankt voor alle hulp en ik blijf me verbazen over de fantastische dingen die je (mits genoeg kennis :P) met linux kan doen :).

Strava


Acties:
  • 0 Henk 'm!

  • Rainmaker
  • Registratie: Augustus 2000
  • Laatst online: 14-07-2024

Rainmaker

RHCDS

offtopic:
Ik moet even zeggen, ik ben toch echt geen absolute beginner met linux, maar dit soort libs met LD_PRELOAD je binairy ingooien is iets waar ik absoluut nooit aan gedacht had.

Mooie oplossing :)

We are pentium of borg. Division is futile. You will be approximated.

Pagina: 1