BSD as routing device for 2 ISPs
Mario Lobo
lobo at bsd.com.br
Sat Jun 14 17:25:45 UTC 2014
Hi;
I have a FreeBSD 8 STABLE doing just that!
On Sat, 14 Jun 2014 17:25:41 +0200
"no at spam@mgedv.net" <nospam at mgedv.net> wrote:
> hi,
>
> although i had a look on pfsense, openbgpd, setfib(1) ideas and such,
> googlin' around and discussing with nw-admins for hours, i still don't
> really see a clear path for setting up a proper solution which is not
> sort of "tinkering" but still based on free OS's.
Not possible! You will have to tinker it, starting by recompiling the
kernel with options ROUTETABLES=whatever.
>
> situation:
> we have 2 independent ISPs, each running it's own router/ext-ip-block.
> e.g. ISP A: IP 1.1.1.10-1.1.1.20, ISP B: IP 2.2.2.50-2.2.2.60.
>
Almost exactly my situation.
> goal 1: inside->outside:
> - NAT and spread traffic load-based across ISPs to use both wires
I've done it like this:
nat on $ext_if1 from ! ($ext_if1) to any -> ($ext_if1) port 1024:65535
nat on $ext_if2 from ! ($ext_if2) to any -> ($ext_if2) port 1024:65535
[snip..]
pass in on $int_if route-to { ($ext_if1 $ext_gw1), ($ext_if2
$ext_gw2) } round-robin sticky-address inet proto { tcp, udp } from any
to ! $int_if:network.
This balances the traffic beautifully between both ISPs
> - switch to "living" ISP in case the other goes down
> (loosing active connections is ok and will of course happen)
Ahh ! heavy tinkering here.
I've developed a daemon that keeps testing both links for
connectivity, that acts together with a series of scripts, that
re-writes/reapplies the whole pf.conf, directing everything to the link
that is working.
I also have two squids running, one for each ISP. Traffic is
round-robin redirected from the inside to them.
> goal 2: outside->inside:
> - NAT different external IPs to the SAME service inside
> (eg. smtp: NAT 1.1.1.11:25 and 2.2.2.51:25 to 192.168.10.10:25)
> - allow connecting to the same service via different routes
> simultaneously eg: ssh from 8.8.8.8->1.1.1.12:22
> while ssh from 9.9.9.9->2.2.2.12:22,
> both end up NAT'd at 192.168.10.20:22.
That's even simpler. Redirect the traffic on each ext_if to the ssh
daemon.
rdr pass on $ext_if1 inet proto tcp to port 22 -> 192.168.10.20 port
22
rdr pass on $ext_if2 inet proto tcp to port 22 -> 192.168.10.20 port
22
You will know your external IPs so you choose the link.
>
> goal 3: firewalling:
> either this box is the firewall, or any other idea welcome.
> (currently, there's a separate hw-firewall running which does NAT,
> too)
In my case, it is THE firewall.
> oh, and the box will be run as virtual machine's guest OS.
>
That shouldn't be a problem but test, test and test. Depending on the
hypervisor, results could be different.
In my case, it is a physical machine.
I hope this helps.
--
Mario Lobo
http://www.mallavoodoo.com.br
FreeBSD since 2.2.8 [not Pro-Audio.... YET!!] (99% winblows FREE)
"UNIX was not designed to stop you from doing stupid things,
because that would also stop you from doing clever things."
More information about the freebsd-questions
mailing list