Hi all,
I have problem with divert socket. I found some code for linux and compiled it in freebsd. What I want to simply print packages via divert socket.
There is two files, server.pl and divert.c at below link.
server.pl simply open a connection and listens on a given port.
then I connect server via telnet
and divert socket program is executed
Although there is a connection between server and telnet, and I send some data via telnet, divert could not print any packages...
Any idea?
server.pl
divert.c
I have problem with divert socket. I found some code for linux and compiled it in freebsd. What I want to simply print packages via divert socket.
There is two files, server.pl and divert.c at below link.
server.pl simply open a connection and listens on a given port.
Code:
perl server.pl 2000
then I connect server via telnet
Code:
telnet myip 2000
and divert socket program is executed
Code:
./divert 2000
./divert:Creating a socket
./divert:Binding a socket
./divert: Waiting for data...
Although there is a connection between server and telnet, and I send some data via telnet, divert could not print any packages...
Any idea?
server.pl
Code:
#
#!/usr/bin/perl -w
#
use IO::Socket;
use Net::hostent;
my $port=shift || die "Usage server.pl <port>\n";
my $server = IO::Socket::INET->new( Proto => 'tcp',
LocalPort => $port,
Listen => SOMAXCONN,
Reuse => 1);
die "can't setup server" unless $server;
print "[Server $0 is running]\n";
while ($client = $server->accept()) {
$client->autoflush(1);
print $client "Welcome to $0\n type help to get a list of commands.\n";
$hostinfo = gethostbyaddr($client->peeraddr);
printf "[Connect from %s]\n", $hostinfo->name || $client->peerhost;
print $client "[server]\$";
while ( <$client>) {
next unless /\S/; # blank line
if (/quit|exit/i)
{
last;
}
elsif (/date|time/i)
{
printf $client "%s\n", scalar localtime;
}
}
continue {
print $client "[server]\$ ";
}
close $client;
}
divert.c
Code:
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#define BUFSIZE 65535
char *progname;
int main(int argc, char** argv) {
int fd,ret, n;
struct sockaddr_in bindPort, sin;
socklen_t sinlen;
struct ip *hdr;
unsigned char packet[BUFSIZE];
int i;
if (argc!=2) {
fprintf(stderr, "Usage: %s <port number>\n", argv[0]);
exit(1);
}
progname=argv[0];
fprintf(stderr,"%s:Creating a socket\n",argv[0]);
/* open a divert socket */
fd=socket(PF_INET, SOCK_RAW, IPPROTO_DIVERT);
if (fd==-1) {
perror("socket");
exit(1);
}
bindPort.sin_family=PF_INET;
bindPort.sin_port=htons(atol(argv[1]));
bindPort.sin_addr.s_addr=0;
fprintf(stderr,"%s:Binding a socket\n",argv[0]);
ret=bind(fd, (struct sockaddr *)&bindPort, sizeof(struct sockaddr_in));
if (ret!=0) {
close(fd);
fprintf(stderr, "%s: Error bind(): %s",argv[0],strerror(ret));
exit(2);
}
printf("%s: Waiting for data...\n",argv[0]);
/* read data in */
sinlen=sizeof(struct sockaddr_in);
while(1)
{
n=recvfrom(fd, packet, BUFSIZE, 0, (struct sockaddr *) &sin,&sinlen);
hdr=(struct ip*)packet;
printf("%s: The packet looks like this:\n",argv[0]);
for( i=0; i<40; i++) {
printf("%02x ", (int)*(packet+i));
if (!((i+1)%16)) printf("\n");
};
printf("\n");
printf("%s: Source address: %s\n",argv[0], inet_ntoa(hdr->ip_src));
printf("%s: Destination address: %s\n", argv[0], inet_ntoa(hdr->ip_dst));
printf("%s: Receiving IF address: %s\n", argv[0], inet_ntoa(sin.sin_addr));
printf("%s: Protocol number: %i\n", argv[0], hdr->ip_p);
/* reinjection */
printf("%s Reinjecting DIVERT %i bytes\n", argv[0], n);
n=sendto(fd, packet, n ,0, (struct sockaddr *) &sin, sinlen);
printf("%s: %i bytes reinjected.\n", argv[0], n);
if (n<=0)
printf("%s: Oops: errno = %i\n", argv[0], errno);
}
}