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.
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.
[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 ]