Toon posts:

Source IP address/SNAT vanuit C

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ga voor dit verhaal even uit van:
[winbak (192.168.5.200)] <---> [laptop (bridge,192.168.5.201)]<--->[router (192.168.5.254)]

Ik zit vanavond een beetje te spelen met bridges: frame relaying, niet IP forwarding dus. Ik kan op mijn bridge een connectie onderscheppen en deze bijvoorbeeld omleiden. Voorbeeld:
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 23 -j DNAT --to 192.168.1.201:65000

Als ik deze connectie nu wil forwarden, geen probleem. Maak de welbekende sock en daarna connect, en we zijn er. Maar deze connectie wordt dan wel gemaakt vanaf het ipnummer van de bridge. Dit kan opgelost worden door:
iptables -t nat -A POSTROUTING -p tcp -m tcp --dport -j SNAT --to-source 192.168.1.200

Met onderstaande code kan je kijken aan welk ipnummer en poortnummer een connectie eigenlijk gericht was, voordat PREROUTING de packet headers veranderde.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <linux/netfilter_ipv4.h>
#include "sock.h"

int main(int argc, char *argv[]){
  int server;

  server = open_tcp_port(65000);
  if (-1 == server) {
    perror("open_tcp_port");
    return 1;
  }

  while (1) {
    int s; struct sockaddr_in addr;
    int addr_size = sizeof(addr);

    s = accept(server, (struct sockaddr *)&addr, &addr_size);
    if (-1 != s) {
      struct sockaddr_in orig_addr;
      int oaddr_size = sizeof(orig_addr);
      char buf[256];
      int buflen;
      int ret;

      ret = getsockopt(s, SOL_IP, SO_ORIGINAL_DST, &orig_addr, &oaddr_size);
      buflen = snprintf(buf, 255, "Dest was %s:%d\n", inet_ntoa(orig_addr.sin_addr),
            ntohs(orig_addr.sin_port));
      write(s, buf, buflen);
      close(s);
    }
  }
  return 0;
}


Mijn vraag: is het mogelijk zonder "iptables bla POSTROUTING bla -j SNAT" het source address van een connectie te bepalen? Ja, eigenlijk dus om netfilter aan te sturen vanuit C om eenmalig de headers van een connectie te veranderen.

[ Voor 4% gewijzigd door Verwijderd op 09-03-2004 00:41 ]


  • Wilke
  • Registratie: December 2000
  • Laatst online: 00:03
Je zou eens kunnen proberen om iptables bla POSTROUTING te 'stracen' om te zien welke linux systemcalls dat eigenlijk veroorzaakt.

Of in de source van iptables kijken (zal wel gecompliceerd zijn, maar in ieder geval niet zo enorm lang/groot, dacht ik?).

In ieder geval zou ik het zelf zo 1-2-3 echt niet precies weten.

Verwijderd

Topicstarter
Wilke schreef op 09 maart 2004 @ 00:54:
Je zou eens kunnen proberen om iptables bla POSTROUTING te 'stracen' om te zien welke linux systemcalls dat eigenlijk veroorzaakt.

Of in de source van iptables kijken (zal wel gecompliceerd zijn, maar in ieder geval niet zo enorm lang/groot, dacht ik?).

In ieder geval zou ik het zelf zo 1-2-3 echt niet precies weten.
tja, is een idee. Beetje source diggen is best leuk. Maar dan ben ik vooral de iptables aan het aanpassen. Ik dacht meer aan een oplossing als een source address opgeven, als dat mogelijk is. Of aan eenmalig per connectie de socket opties setten... Maar in ieder geval zonder de iptables rules aan te passen.

  • igmar
  • Registratie: April 2000
  • Laatst online: 31-01 23:50

igmar

ISO20022

Verwijderd schreef op 09 maart 2004 @ 00:41:
Ga voor dit verhaal even uit van:
Mijn vraag: is het mogelijk zonder "iptables bla POSTROUTING bla -j SNAT" het source address van een connectie te bepalen? Ja, eigenlijk dus om netfilter aan te sturen vanuit C om eenmalig de headers van een connectie te veranderen.
Met 2.2 : Vrij simpel. Met 2.4 is het wat gecompliceerder. Je kan je source adres veranderen in iets anders met de calls indien het adres in kwestie een adres is wat aan een van je interfaces is gebind.

Indien dat niet het geval is heb je 2 opties : raw packets, of de cttp proxy patches. Take a pick :)

  • igmar
  • Registratie: April 2000
  • Laatst online: 31-01 23:50

igmar

ISO20022

Wilke schreef op 09 maart 2004 @ 00:54:
Je zou eens kunnen proberen om iptables bla POSTROUTING te 'stracen' om te zien welke linux systemcalls dat eigenlijk veroorzaakt.
Calls naar de netfilter API van de kernel. En neem van mij aan : Daar krijg je hoofdpijn van :)

Verwijderd

Topicstarter
igmar schreef op 09 maart 2004 @ 17:45:
[...]


Met 2.2 : Vrij simpel. Met 2.4 is het wat gecompliceerder. Je kan je source adres veranderen in iets anders met de calls indien het adres in kwestie een adres is wat aan een van je interfaces is gebind.

Indien dat niet het geval is heb je 2 opties : raw packets, of de cttp proxy patches. Take a pick :)
2.6 zelfs. want pas vanaf 2.6 kan je (tenminste zonder ebtables) filteren op bridges, afaik

Maar dat cttp proxy patches klinkt mogelijk wel interessant, alleen... waar vind ik die? Met diverse google queries kan ik niets nuttigs vinden, en ook FM meldt 0 entries. Dus, enig idee waar ik ze kan vinden?

  • igmar
  • Registratie: April 2000
  • Laatst online: 31-01 23:50

igmar

ISO20022

Verwijderd schreef op 09 maart 2004 @ 22:03:
Maar dat cttp proxy patches klinkt mogelijk wel interessant, alleen... waar vind ik die? Met diverse google queries kan ik niets nuttigs vinden, en ook FM meldt 0 entries. Dus, enig idee waar ik ze kan vinden?
http://www.balabit.com/products/oss/tproxy/

Verwijderd

Topicstarter
ik denk dat dat de oplossing gaat zijn
_/-\o_
met hartelijke dank

/me gaat een heel prettig weekend beleven hiermee :)
Pagina: 1