Is it possible to make a connection between a Linux router and AWS Direct Connect without the need of physical hardware?

We bought one Amazon Direct Connect leased line to connect our datacenter to Amazon EC2 instances. Amazon has configurations for Cisco or Juniper Hardware (http://docs.aws.amazon.com/directconnect/latest/UserGuide/getstarted.html).

However, is it also possible to use Linux as a router (for example by using Quagga, http://www.nongnu.org/quagga/)?


It turns out that it's pretty easy to connect to EC2 by using Quagga with Debian Linux.

/etc/network/interfaces

auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet static
    address 10.x.x.x
    netmask 255.255.255.0
    network 10.x.x.x
    broadcast 10.x.x.x
    gateway 10.x.x.x

allow-hotplug eth1
iface eth1 inet static
    address 169.254.237.18
    netmask 255.255.255.252
    network 169.254.237.16
    broadcast 169.254.237.19

/etc/quagga/bgpd.conf

!
! Zebra configuration saved from vty
!   2006/06/09 16:13:05
!
hostname rr1-bgp
password zebra
enable password zebra
log file /var/log/quagga/bgpd.log
!
router bgp 65000
  neighbor 169.254.237.17 remote-as 7224
  neighbor 169.254.237.17 password PASSWORD_FROM_AWS_CONSOLE
  network 10.10.21.0/24
!
line vty

However, as Quagga does not really support BFD we also gave BIRD (http://bird.network.cz) a try. A connection can be established with both, but I think it's better to support BFD on our side, too.

/etc/bird.conf

router id 169.254.237.18;

#debug protocols all;

protocol direct {
    interface "eth0";
}

protocol kernel {
    persist;        
    scan time 20;       
    export all;     
}

protocol device {
    scan time 100;
}

protocol bgp {
    description "My BGP link";
    local as 65000;
    neighbor 169.254.237.17 as 7224;
    password "PASSWORD_FROM_AWS_CONSOLE";
    export all;
    bfd on;
}

protocol bfd {
        interface "eth*" {
                min rx interval 5000 ms;
                min tx interval 5000 ms;
                idle tx interval 5000 ms;
        };
        multihop {
                interval 200 ms;
                multiplier 10;
        };
        neighbor 169.254.237.17;
}