#!/usr/bin/perl -w -T # Complex example configuration to forward incoming # requests on port 80 to various remote pools of # machines and/or local services based on the URL # or other request header information. use strict; use Net::DNAT; # Pools definition configuration my $pools = { # If no port is supplied, the standard # HTTP port (80) is used pool1 => "10.0.1.100", # If an array ref is used, connections # are cycled through each destination. pool2 => [ "10.0.2.2", "10.0.2.3", "10.0.2.4" ], pool3 => [ "10.0.3.2:8000", "10.0.3.3:8000" ], pool4 => "127.0.0.1:2001", # If words are used instead of the # dotted IP notation, they are resolved # using gethostbyname. pool5 => "localhost:2002", # If there exists more than one A record, # all are stored and are cycled. pool6 => "www.yahoo.com.:3001", pool7 => [ "www.yahoo.com.", "geocities.com." ], }; my $default_pool = "pool1"; # Host needs to match exactly. my $host_dest = { "Domain.com" => "pool2", "www.domain.com" => "pool2", "dev.domain.com" => "pool3", }; # Regexp and code refs all operate # on the entire header string, which # is stored in the $_ variable. my $headers_directors = [ # An array ref is used to preserve # the order in which the header # checks are to be made. Also, # refs do not go very well as # keys in a hash. qr%^Host:.*\.domain4\.com%im => "pool4", # The Remote-Addr and Remote-Port # headers are inserted on the fly # and can be used in the URL parsing. qr%^Remote\-Addr: 192\.168\.%im => "pool5", # Code refs must return a true value # when executed to direct the request. sub { m%^Referer:\s*http://domain.com/%im && m%^Host:\s*banner\.%im && m%GET /\S+\.gif%; } => "pool6", ]; run Net::DNAT port => 80, pools => $pools, default_pool => $default_pool, host_switch_table => $host_dest, switch_filters => $headers_directors, user => "nobody", group => "nobody", ;