On Tuesday 10 October 2006 03:02, Brian A. Seklecki wrote: > > I have no idea how to control which address is used for outgoing > > communications other than by configuring your network gateway to go through > > the preferred device, which may not do exactly what you want. > > I've just read through the whole thread. People seems to be getting > confused about a couple of concepts.
I don't think there was any confusion in my mind, but I was not aware that bind could be used for outgoing connections. Thanks for the detail. Is there someone who would like to work on this? Regards, Kern > > Firstly, consider the need to be able to manually specify the outbound > IPv4 address of "Client" connections from a daemon _as well_ as the > inbound address on which to listen for incoming service requests. > > In most shops, in almost all but the most basic configurations, the > generally accepted practice is to create abstraction between the > "system" and the "service" provided by it. Even if a system has a > single service/function, it still binds the service to a "Service VIP", > or "IP Alias (BSD)". > > I.e., almost all machines have a "Management Address" and "Service > VIP", especially in non-RFC1918-space-only shops. > > To give you an idea why this is a policy in most places: For example, > if a system crashes, you can pick up the VIP and move it to a different > system in the same VLAN. > > ...OR, if that service VIP has a CNAME pointing to it, you can simply > cut over the CNAME destination to a service VIP in a different VLAN > without breaking all your clients. > > Thus, "System-Service Abstraction" > > This becomes especially paramount in High Availability configurations > where at service VIP dangles between two or more servers. Consider the > Linux-HA system. > > It is also extremely important when you're trying to manage firewall > rule growth. At present, if you have multiple VIPs/IP Aliases on > Bacula, you can control which one "Listening Sockets" bind to, but say > for example, when writing rules that would permit the Director to send > control messages to File Daemons, or Storage Daemons to send messages to > Directors, or Consoles to Directors, you want your rules to reflect the > source address of the service VIP for "new client sockets". > > Consider ISC BIND named(8): It's got all kinds of crazy options for > binding listening sockets for incoming requests and specifying the > source _port_ and _address_ for outbound connections the daemon is > making in the capacity of a "client": > > Example: > > options { > directory "/"; > listen-on { 1.2.3.4/32; }; > query-source address 2.4.5.6 port 12346; > transfer-source 7.8.9.1; > notify-source 2.3.3.5; > .... > } > > All kinds of control. > > > ----------------- > > Secondly, "Socket Source Address/Port" v.s. "Routing" > > These are *completely autonomous concepts*. I just went through this > bringing "-b" from FreeBSD syslogd(8) over to NetBSD(8): > > http://cvsweb.netbsd.org/bsdweb.cgi/src/usr.sbin/syslogd/syslogd.c.diff?r1=1.78&r2=1.79&f=h > > Check out lines 2107->2111 > > This is an example with UDP, but the song remains the insane for TCP. > > When you bind(2)/listen(2) a socket(2), there are two modes: Passive and > active. > > The address which a socket listens/binds is wildcard by default. You > can set it though with getaddrinfo(2)...intuitive function call name, > huh?! >:} > > Another good example are present in Apache's HTTP CVS: > srclib/apr/network_io/unix/sockaddr.c > > There's no reference to any of this in any of Stevens` because those > were all written before the advent of HA and Distributed Systems, > possibly even IP Aliases/VIPs. > > Per my notes on "Service/System" abstraction, if a system has multiple > interfaces, there are two possibilities: > > *) The interfaces could have addresses in different subnets > *) The interfaces could have addresses in the same subnets > > A system could also have multiple VIPs or "IP Aliases" (BSD) on the > same interface within the same Subnet (the most likely scenario). > > When you specifically bind the source address of an outgoing TCP socket > to a specific VIP or Primary IP on an interface, the decision as to > which interface to transmit the outgoing packets is not made in the TCP > code, it is made at the next layer down on the OSI model -- the > underlying IPv4/IPv6 protocol. > > Example, if a system has two NICs. One within a management subnet with > RFC1918 address space, we'll say 10.0.0.100, and another with two IPs, a > primary IP and a service VIP in a public subnet, we'll say 216.239.37.99 > and 216.239.37.100. > Consider the routing: > > Assume for the sake of sanity that the subnet masks on both interfaces > are /25 on the public interface and /23 on the RFC1918 interface. Via > "Directly Connected Interfaces", the system knows about 216.239.37.0/25 > via "Ext", and 10.0.0.0/23 via "Int". It may also have a "Default > Gateway" configured of 215.239.37.1/32. He may also know about a > greater 10.0.0.0/8 via a "Static Route" via some internal > router/firewall at 10.0.0.1 -- manually configured "route add -net > 10.0.0.0/8 gw 10.0.0.1". > > Obviously, the default semantics apply to most modern operating systems: > > *) A layer 4 socket number discriminator is of course always required > for UDP/TCP, but not for ICMP/TCP/ESP/AH/etc. > > *) For outbound UDP/ICMP/TCP/ESP/AH etc layer 3 protocols > (/etc/protocols) sockets, if the source address is not specified, the > layer 4 default address of the interface "closest" to the remote address > is used. > > *) The layer 2 interface used for transmission is that of the one used > in the default layer 3 protocol address acquisition algorithm. The > kernel makes this decision though based on the routing table and > weighted priories and metrics. I.e, connected > static > null > learned > via IGP/BGP (2) > > *) The layer 3 address could be specified in the code / by the user, in > which case, a one of many VIPs within the same subnet on the same > interface could be used, but the layer 2 transmit interface remains the > same. > > *) The exception to the previous two rules are as follows: > > -) The remote address of the outbound TCP socket is in a subnet > known via "Directly Connected Route" on an interface other than > the source address the user specified the local socket > > -) The remote address of the outbound TCP socket is in a subnet > known by "Static Route" via a gateway/interface on an > interface in a subnet other than the address of the local socket. > > In these instances, the behavior is OS independent, but connect(2) > or bind(2) should fail miserably, even if functions themselves > return successfully. (1) > > *) For incoming passive listen sockets, if no bind address is specified, > it becomes a wildcard bind (examples: vintage inetd(8), etc.) -- > unintelligent daemons like this were the reasons behind tcpwrappers. > > 1. Consider the routing: > > Assume for the sake of sanity that the subnet masks on the interfaces > are /25 on the public interface and /23 on the RFC1918 interface. Via > "Directly Connected Interfaces", the system knows about 216.239.37.0/25 > via "Ext", and 10.0.0.0/23 via "Int". It may also have a "Default > Gateway" configured of 215.239.37.1/32. He may also know about a > greater 10.0.0.0/8 via a "Static Route" via some internal > router/firewall at 10.0.0.1 -- manually configured "route add -net > 10.0.0.0/8 gw 10.0.0.1". > > On this system, a random client program ("foo") could very easily bind > it's TCP socket source address to the VIP 216.239.37.100, then > connect(2) in active mode to a foreign destination address 10.0.3.101. > Or maybe tries to "ping -B 216.239.37.100 10.0.3.100". > > The operating system will very happily transmit that IPv4 packet > containing the TCP/ICMP packet out of the "Int" private interface with > the "Ext" VIP address as the source address. That datagram makes its > way onto the ethernet segment. As long as router 10.0.0.1/32, and all > of the corresponding routers en route to 10.0.3.101/32 are willing to > forward the packet (i.e., they know a return route to 216.239.37.100/32 > via 10.0.0.100/32), it will actually work. > > If they dont, the socket will time out tranmitting IPv4 packets (which > contain a TCP SYN packet) that 10.0.0.1/32 will discard due to perhaps a > BOGON list. > > Next, vanquish all thoughts about using a Linux kernel specific kernel > hacks like IPCHAINs. Obviously a OS kernel-specific solution is not > optimal. There are some cheap tricks that you could do with OpenBSD's > pf(4) as well, but I certainly wouldn't go recommending those to anyone. > > Background on that: > > A lot of this confusion is Linux's fault. > > I've seen some Linux-specific hacks that like to accept command line > arguments for "Transmit Interface", like "./foo.bar -interface=eth0". > This has a lot to do with the fact that Linux considers VIPs separate > logical interface structures, thus verily easily blurring the > distinction. > > Clearly, this is just a lot of smoke and mirrors around choosing a > proper source address for the socket/ICMP/ESP/layer 3 datagram. > > In summary: You cant control the "Transmit Interface", you can control > the layer 4 socket number and the layer 3 transmit address; -- the > kernel will make the outbound layer 2 physical interface encapsulation > for you, based on your directly connected routes, static routes, default > gateway, IGPs, etc. > > > 2. See table: http://www.cisco.com/warp/public/105/21.html#building > > > > Finally, consider the practical examples: > > *) Bconsole will almost always run on a workstation with a single IP > address with a single default gateway. Outbound TCP connection source > address auto-determination applies 99% of time. However, if for some > internal security policy compels it, the Administrator would certainly > enjoy the ability to source the Concsole->Dir socket from an alternative > VIP. > > *) The FileDaemon running on a workstation will only use one source > address available to talk to Dir and StorageD. > > *) The FileDaemon running a HA or multi-homed server will almost always > want to use it's "Management" address on a private/RFC1918 network to > initiate outbound TCP connections for: > > - Messages from FileDir->Director (logs) > - Backup date from FileDir->StorageDir > > However, there is always the remote but entirely reasonable possibility > that the server has a dedicated backup network interface in a subnet > that overlaps with a static route assigned to the Management network. > Example: > > "Ext0": 1.2.3.4/25. > "Default gw": 1.2.3.1/32 > "Mngmnt0" 10.0.100.200/24" > "Static 10.0.0.0/8 via 10.0.100.1" > "Backup0": 10.0.200.200/24 > "Storage Dir": 10.0.200.100/32 > > In this complicated but entirely possible scenario, being able to > specify the source address of the backup network interface helps the > kernel pick the proper transmit interface by allowing it to discriminate > the route known via directly connected over the metric/weight of the > static route. > > *) And of course, the StorageDir->Director and Director->StorageDir > connections, which could reside in HA/Load-Balanced configurations, rely > on the source address of the remote host to authenticate. > > Consider: > > 192.168.100.0/23 > > [B-SD-Active .101][B-SD-Standby .102] > [B-SD-HA VIP .100] > | > | > \ / > Router {192.168.100.1/32} > {192.168.200.1/32} > / \ > | > | > [B-Dir-HA .100] > [B-Dir-Active .101][B-Dir-Standby .102] > > > > In this config, the HA VIP for both is an IfAlias on the active system. > When it transmits to the configured HA address of the SD or Dir > resource, the remote active will fail to authenticate because the source > address will be that of the Active "Primary IP" and not the service VIP. > > Another great example of the need for source address specification is a > POSIX/Linux/BSD/UNIX system deployed as a remote VPN tunnel termination > point / router appliance. > > Details: > > - The remote private RFC1918 subnet is 172.16.100.0/24 at the branch > office. > - The local subnet at the HQ where the Dir/StorageD is is 172.16.99.0/24 > - The HQ has a WAN connection 1.2.3.4, the Branch has a WAN connection > 2.3.4.5 > - The IPSEC/ISAKMP ACLs will stipulate 172.168.0.0/12 on the HQ side and > 172.16.100.0/24 on the branch. > - When the branch office receives packets on it's internal interface > from LAN hosts matching 172.16.100.0/24 destined for 172.16.0.0/12, it > knows to ESP/AH them and transmit them out it's Ext., if not, NAT/PAT to > 2.3.4.5/32 > - However, the remote branch machine/router/appliance whatever, when > generating packets itself destined for 172.16.0.0/12 will not attempt to > ESP/AH encapsulate unless you specify a source address of it's internal > interface. By default, kernel routing semantics will attempt to > transmit those packets out the Ext interface using NAT/PAT via the > default gateway. > > Consider it: The kernel has no way of knowing any kind of inverse / > reverse routing decision such as: "Hey Locally initiated traffic > destined for a subnet I know via an ESP/GRE tunnel, use this source > address if you wish to qualify for the VPN ACL and reach your > destination." > > That simply doesn't work. > > ~BAS > > > > > In any event, unless I am misunderstanding something, Bacula has no mechanism > > for controlling outgoing addresses. > > > > ------------------------------------------------------------------------- > Take Surveys. Earn Cash. Influence the Future of IT > Join SourceForge.net's Techsay panel and you'll get the chance to share your > opinions on IT & business topics through brief surveys -- and earn cash > http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV > _______________________________________________ > Bacula-users mailing list > Bacula-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/bacula-users > ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys -- and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Bacula-users mailing list Bacula-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/bacula-users