Howdie, On Monday 26 January 2004 13:49, C Jagadish wrote: > Hi, > > How do I route packets to destination "A" through an interface > differnet from the entry in the routing table? ( In RedHat > Linux 7.2) I don't think you can do this exactly. However, you can limit a packet to go through a specific interface assuming you have a route through it even though normally this will not be the route chosen, by using the SO_BINDTODEVICE socket options. Attached is small example that creates a shared library that if preloaded (using LD_PRELOAD) will hijack all the socket() system calls and set this option on all sockets created, thus enabling to limit any executable to use a specific interface in a similar fashion to way the ping program -r option does for ping. It's a rather crude example, if you plan to make real use of it make sure to handle error conditions in saner fashion. A better way to choose the interface to route packets to is also a good idea :-) Cheers, Gilad -- Gilad Ben-Yossef <gilad@codefidence.com> Codefidence. A name you can trust (tm) http://www.codefidence.com "The future is here, it's just not evenly distributed yet." - William Gibson
/************************************************************ * Copyright (C) 2004 Codefidence ltd. * Author: Gilad Ben-Yossef <gilad@codefidence.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <net/if.h> #define __USE_GNU // This is needed for the RTLD_NEXT definition #include <dlfcn.h> /* Change this to route the packet via a different interface. */ #define IFNAME "eth3" int socket(int domain, int type, int protocol) { int (*origsock)(int domain, int type, int protocol); char * error; int sock; origsock = dlsym(RTLD_NEXT, "socket"); if ((error = dlerror()) != NULL) { fprintf (stderr, "%s\n", error); exit(1); } sock = origsock(domain, type, protocol); if(sock != -1) { struct ifreq interface; strncpy(interface.ifr_ifrn.ifrn_name, IFNAME, IFNAMSIZ); if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, (char *)&interface, sizeof(interface)) < 0) { perror("sendpacket: setting SO_BINDTODEVICE"); exit(1); } } return sock; } /* Compile with: gcc sendto.c -o sendto.so -ldl -shared Use with: LD_PRELOAD=sendto.so ./program */