Initial commit
This commit is contained in:
commit
398cc7a7a4
|
@ -0,0 +1,55 @@
|
|||
# The router ID of a BGP router can theoretically be anything.
|
||||
# It's common practice to set it to the IPv4 address that other routers will peer with.
|
||||
router id 192.168.179.1;
|
||||
|
||||
# Export all learned IPv4 routes from peers into the kernel's routing table.
|
||||
# This turns a BGP route server into a BGP router.
|
||||
# Visible with `ip route show`.
|
||||
protocol kernel
|
||||
{
|
||||
ipv4
|
||||
{
|
||||
import all;
|
||||
export filter
|
||||
{
|
||||
if source = RTS_STATIC then reject;
|
||||
krt_prefsrc = 192.168.179.1;
|
||||
accept;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
# The IPv4 routes to be announced.
|
||||
protocol static
|
||||
{
|
||||
ipv4;
|
||||
route 10.0.0.1/32 reject;
|
||||
route 10.0.0.2/32 reject;
|
||||
route 10.0.0.3/32 reject;
|
||||
}
|
||||
|
||||
# Avoid hammering the kernel's routing table unnecessarily.
|
||||
protocol device {
|
||||
scan time 10;
|
||||
}
|
||||
|
||||
# You can template peers.
|
||||
template bgp PEER
|
||||
{
|
||||
# The ASN this router announces as.
|
||||
local as 1;
|
||||
ipv4
|
||||
{
|
||||
# DON'T EVER DO THIS ON THE REAL INTERNET.
|
||||
# THIS IS HOW ROUTE LEAKS AND BGP HIJACKS HAPPEN.
|
||||
import all;
|
||||
export all;
|
||||
};
|
||||
}
|
||||
|
||||
# Peer with AS2! :-)
|
||||
protocol bgp AS2 from PEER
|
||||
{
|
||||
# The IP address and ASN of the peer.
|
||||
neighbor 192.168.179.2 as 2;
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
#!/bin/bash
|
||||
|
||||
# This adds the IPs AS1 announces such that they're
|
||||
# pingable from AS2 once the routes have propagated.
|
||||
ip address add 10.0.0.1/32 dev lo
|
||||
ip address add 10.0.0.2/32 dev lo
|
||||
ip address add 10.0.0.3/32 dev lo
|
||||
ip -6 address add fd00:dead:beef::1/128 dev lo
|
||||
ip -6 address add fd00:dead:beef::2/128 dev lo
|
||||
ip -6 address add fd00:dead:beef::3/128 dev lo
|
||||
|
||||
# Start bird.
|
||||
bird -d -c /demo/bird.conf
|
|
@ -0,0 +1,96 @@
|
|||
# The router ID of a BGP router can theoretically be anything.
|
||||
# It's common practice to set it to the IPv4 address that other routers will peer with.
|
||||
router id 192.168.179.2;
|
||||
|
||||
# Export all learned IPv4 routes from peers into the kernel's routing table.
|
||||
# This turns a BGP route server into a BGP router.
|
||||
# Visible with `ip route show`.
|
||||
protocol kernel
|
||||
{
|
||||
ipv4
|
||||
{
|
||||
import all;
|
||||
export filter
|
||||
{
|
||||
if source = RTS_STATIC then reject;
|
||||
krt_prefsrc = 192.168.179.2;
|
||||
accept;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
# Export all learned IPv6 routes from peers into the kernel's routing table.
|
||||
# This turns a BGP route server into a BGP router.
|
||||
# Visible with `ip -6 route show`.
|
||||
protocol kernel
|
||||
{
|
||||
ipv6
|
||||
{
|
||||
import all;
|
||||
export filter
|
||||
{
|
||||
if source = RTS_STATIC then reject;
|
||||
krt_prefsrc = fd00::2;
|
||||
accept;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
# The IPv4 routes to be announced.
|
||||
protocol static
|
||||
{
|
||||
ipv4;
|
||||
route 172.16.0.1/32 reject;
|
||||
route 172.16.0.2/32 reject;
|
||||
route 172.16.0.3/32 reject;
|
||||
}
|
||||
|
||||
# The IPv6 routes to be announced.
|
||||
protocol static
|
||||
{
|
||||
ipv6;
|
||||
route fd00:cafe:babe::1/128 reject;
|
||||
route fd00:cafe:babe::1/128 reject;
|
||||
route fd00:cafe:babe::1/128 reject;
|
||||
}
|
||||
|
||||
# Avoid hammering the kernel's routing table unnecessarily.
|
||||
protocol device {
|
||||
scan time 10;
|
||||
}
|
||||
|
||||
# You can template peers.
|
||||
template bgp PEER
|
||||
{
|
||||
# The ASN this router announces as.
|
||||
local as 2;
|
||||
ipv4
|
||||
{
|
||||
# DON'T EVER DO THIS ON THE REAL INTERNET.
|
||||
# THIS IS HOW ROUTE LEAKS AND BGP HIJACKS HAPPEN.
|
||||
import all;
|
||||
export all;
|
||||
};
|
||||
ipv6
|
||||
{
|
||||
# DON'T EVER DO THIS ON THE REAL INTERNET.
|
||||
# THIS IS HOW ROUTE LEAKS AND BGP HIJACKS HAPPEN.
|
||||
import all;
|
||||
export all;
|
||||
};
|
||||
}
|
||||
|
||||
# Peer with AS1! :-)
|
||||
protocol bgp AS1 from PEER
|
||||
{
|
||||
# The IP address and ASN of the peer.
|
||||
neighbor 192.168.179.1 as 1;
|
||||
}
|
||||
|
||||
|
||||
# Peer with AS1! :-)
|
||||
protocol bgp AS1 from PEER
|
||||
{
|
||||
# The IP address and ASN of the peer.
|
||||
neighbor 192.168.179.1 as 1;
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Add the IPs AS2 announces such that they're
|
||||
# pingable from AS1 once the routes have propagated.
|
||||
ip address add 172.16.1/32 dev lo
|
||||
ip address add 172.16.2/32 dev lo
|
||||
ip address add 172.16.3/32 dev lo
|
||||
ip -6 address add fd00:cafe:babe::1/128 dev lo
|
||||
ip -6 address add fd00:cafe:babe::2/128 dev lo
|
||||
ip -6 address add fd00:cafe:babe::3/128 dev lo
|
||||
|
||||
# Start bird.
|
||||
bird -d -c /demo/bird.conf
|
Binary file not shown.
|
@ -0,0 +1,14 @@
|
|||
FROM ubuntu:20.04
|
||||
EXPOSE 179/tcp
|
||||
|
||||
# BIRD really doesn't like to be installed in a minimal
|
||||
# Ubuntu container, so some fudges are needed to get it to run.
|
||||
RUN echo "path-include=/usr/share/doc/bird2/*" > /etc/dpkg/dpkg.cfg.d/include-bird
|
||||
RUN mkdir -p /run/bird
|
||||
|
||||
RUN apt-get update && apt-get install -y bird2 && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Useful debug packages. Not essential for BIRD to work.
|
||||
RUN apt-get update && apt-get install -y iproute2 iputils-ping && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
CMD ["/demo/start.sh"]
|
|
@ -0,0 +1,103 @@
|
|||
## Notes
|
||||
|
||||
BGP operates on port TCP 179.
|
||||
This is exposed to host.
|
||||
- AS1 on 17901
|
||||
- AS2 on 17902
|
||||
|
||||
BGP requires peers to be on the same L2 network such that routes between routers can be established.
|
||||
However, a lot of route collectors (people who just hoover up information about the state of the internet),
|
||||
internet exchanges and ISPs expose TCP 179 publicly. Interaction with BGP can occur across the internet if
|
||||
this port is left unfirewalled, but the routes it establishes will only ever be functional across a L2 network.
|
||||
|
||||
The configuration for BIRD 1.6 differs slightly. The main difference is that IPv4 and IPv6 operate as two
|
||||
separate processes and as such are configured using separate configuration files.
|
||||
|
||||
To start:
|
||||
```bash
|
||||
$ docker-compose up -d
|
||||
```
|
||||
|
||||
To destroy:
|
||||
```bash
|
||||
$ docker-compose down --rmi all
|
||||
```
|
||||
|
||||
To interact:
|
||||
```bash
|
||||
$ docker ps
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
8e6ec23b0482 bgpdemo/bird "/demo/start.sh" 30 minutes ago Up 30 minutes 0.0.0.0:17901->179/tcp AS1
|
||||
636ea235359c bgpdemo/bird "/demo/start.sh" 30 minutes ago Up 30 minutes 0.0.0.0:17902->179/tcp AS2
|
||||
|
||||
$ docker exec -it AS1 /bin/bash
|
||||
|
||||
$$ ip route show
|
||||
default via 192.168.179.254 dev eth0
|
||||
172.16.0.1 via 192.168.179.2 dev eth0 proto bird src 192.168.179.1 metric 32
|
||||
172.16.0.2 via 192.168.179.2 dev eth0 proto bird src 192.168.179.1 metric 32
|
||||
172.16.0.3 via 192.168.179.2 dev eth0 proto bird src 192.168.179.1 metric 32
|
||||
192.168.179.0/24 dev eth0 proto kernel scope link src 192.168.179.1
|
||||
|
||||
$$ ping 172.16.0.1
|
||||
PING 172.16.0.1 (172.16.0.1) 56(84) bytes of data.
|
||||
64 bytes from 172.16.0.1: icmp_seq=1 ttl=64 time=0.081 ms
|
||||
64 bytes from 172.16.0.1: icmp_seq=2 ttl=64 time=0.150 ms
|
||||
64 bytes from 172.16.0.1: icmp_seq=3 ttl=64 time=0.167 ms
|
||||
^C
|
||||
--- 172.16.0.1 ping statistics ---
|
||||
3 packets transmitted, 3 received, 0% packet loss, time 2061ms
|
||||
rtt min/avg/max/mdev = 0.081/0.132/0.167/0.037 ms
|
||||
|
||||
$$ birdc show protocol all
|
||||
BIRD 2.0.7 ready.
|
||||
Name Proto Table State Since Info
|
||||
kernel1 Kernel master4 up 22:58:19.431
|
||||
Channel ipv4
|
||||
State: UP
|
||||
Table: master4
|
||||
Preference: 10
|
||||
Input filter: ACCEPT
|
||||
Output filter: (unnamed)
|
||||
Routes: 0 imported, 3 exported, 0 preferred
|
||||
Route change stats: received rejected filtered ignored accepted
|
||||
Import updates: 0 0 0 0 0
|
||||
Import withdraws: 0 0 --- 0 0
|
||||
Export updates: 9 0 6 --- 3
|
||||
Export withdraws: 0 --- --- --- 0
|
||||
...
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
### AS1
|
||||
|
||||
BGP port exposed on TCP 17901
|
||||
ASN: `AS1`
|
||||
IPv4: `192.168.179.1`
|
||||
IPv6: `fd00::1`
|
||||
Announced routes:
|
||||
```
|
||||
10.0.0.1/32
|
||||
10.0.0.2/32
|
||||
10.0.0.3/32
|
||||
fd00:dead:beef::1/128
|
||||
fd00:dead:beef::2/128
|
||||
fd00:dead:beef::3/128
|
||||
```
|
||||
|
||||
### AS2
|
||||
|
||||
BGP port exposed on TCP 17902
|
||||
ASN: `AS2`
|
||||
IPv4: `192.168.179.2`
|
||||
IPv6: `fd00::2`
|
||||
Announced routes:
|
||||
```
|
||||
172.16.0.1/32
|
||||
172.16.0.2/32
|
||||
172.16.0.3/32
|
||||
fd00:cafe:babe::1/128
|
||||
fd00:cafe:babe::2/128
|
||||
fd00:cafe:babe::3/128
|
||||
```
|
|
@ -0,0 +1,81 @@
|
|||
# Versions of Docker Compose >= 3 do not support IPv6. How regressive...
|
||||
version: "2.3"
|
||||
# Create a new L2 network for the routers to peer over.
|
||||
# The gateways are fictitious and are not used.
|
||||
networks:
|
||||
bgp:
|
||||
enable_ipv6: true
|
||||
driver: bridge
|
||||
ipam:
|
||||
config:
|
||||
- subnet: 192.168.179.0/24
|
||||
gateway: 192.168.179.254
|
||||
- subnet: fd00::/64
|
||||
gateway: fd00::ffff
|
||||
# Create two routers to peer with each other.
|
||||
services:
|
||||
AS1:
|
||||
build: .
|
||||
image: bgpdemo/bird
|
||||
container_name: AS1
|
||||
# NET_ADMIN required to add IP addresses to interfaces within the container.
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
# Docker likes to spam ICMP redirects which breaks the fancy routing we just configured. Ignore them!
|
||||
sysctls:
|
||||
net.ipv4.conf.eth0.accept_redirects: 0
|
||||
net.ipv6.conf.eth0.accept_redirects: 0
|
||||
volumes:
|
||||
- type: bind
|
||||
source: ./AS1
|
||||
target: /demo
|
||||
# Expose the BGP port so you can mess with it. :-)
|
||||
ports:
|
||||
- "17901:179/tcp"
|
||||
networks:
|
||||
bgp:
|
||||
# The addresses AS2 will peer with.
|
||||
ipv4_address: 192.168.179.1
|
||||
ipv6_address: fd00::1
|
||||
AS2:
|
||||
image: bgpdemo/bird
|
||||
depends_on:
|
||||
- AS1
|
||||
container_name: AS2
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
sysctls:
|
||||
net.ipv4.conf.eth0.accept_redirects: 0
|
||||
net.ipv6.conf.eth0.accept_redirects: 0
|
||||
volumes:
|
||||
- type: bind
|
||||
source: ./AS2
|
||||
target: /demo
|
||||
ports:
|
||||
- "17902:179/tcp"
|
||||
networks:
|
||||
bgp:
|
||||
# The addresses AS1 will peer with.
|
||||
ipv4_address: 192.168.179.2
|
||||
ipv6_address: fd00::2
|
||||
AS3:
|
||||
image: bgpdemo/bird
|
||||
depends_on:
|
||||
- AS1
|
||||
container_name: AS2
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
sysctls:
|
||||
net.ipv4.conf.eth0.accept_redirects: 0
|
||||
net.ipv6.conf.eth0.accept_redirects: 0
|
||||
volumes:
|
||||
- type: bind
|
||||
source: ./AS2
|
||||
target: /demo
|
||||
ports:
|
||||
- "17902:179/tcp"
|
||||
networks:
|
||||
bgp:
|
||||
# The addresses AS1 will peer with.
|
||||
ipv4_address: 192.168.179.2
|
||||
ipv6_address: fd00::2
|
Loading…
Reference in New Issue