Vrem să facem o legătură simplă directă doar între două containere (red
și green
) astfel încât să comunice între ele fără ca pachetele să fie prelucrate de sistemul host
. Pentru aceasta vom scoate interfețele aferente din bridge-ul br0
și vom crea un nou bridge.
Pentru început scoatem interfețele aferente containerelor red
(veth-red
) și green
(veth-green
) din bridge-ul br0
:
root@host:~# brctl delif br0 veth-red root@host:~# brctl delif br0 veth-green root@host:~# brctl show br0 bridge name bridge id STP enabled interfaces br0 8000.000c2919b1b2 no eth0 veth-blue
Creăm un nou bridge (br1
) și adăugăm interfețele veth-red
și veth-green
în acesta:
root@host:~# brctl addbr br1 root@host:~# brctl addif br1 veth-red root@host:~# brctl addif br1 veth-green root@host:~# brctl show br1 bridge name bridge id STP enabled interfaces br1 8000.f67659f52916 no veth-green veth-red root@host:~# ip l s dev br1 up root@host:~# ip a s dev br1 13: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP [...]
Configurăm adrese pe stațiile red
și green
și verificăm apoi conectiviatea între acestea. Configurăm adresele 172.16.12.1/24
, respectiv 172.16.12.2/24
și verificăm conectivitatea între acestea:
root@red:~# ip a f dev eth0 root@red:~# ip a a 172.16.12.1/24 dev eth0 root@red:~# ip a s dev eth0 9: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:16:3e:8e:84:21 brd ff:ff:ff:ff:ff:ff inet 172.16.12.1/24 scope global eth0 root@green:~# ip a f dev eth0 root@green:~# ip a a 172.16.12.2/24 dev eth0 root@green:~# ip a s dev eth0 6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:16:3e:d1:b2:95 brd ff:ff:ff:ff:ff:ff inet 172.16.12.2/24 scope global eth0 root@red:~# ping 172.16.12.2 PING 172.16.12.2 (172.16.12.2) 56(84) bytes of data. 64 bytes from 172.16.12.2: icmp_req=1 ttl=64 time=0.319 ms ^C --- 172.16.12.2 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.319/0.319/0.319/0.000 ms root@green:~# ping 172.16.12.1 PING 172.16.12.1 (172.16.12.1) 56(84) bytes of data. 64 bytes from 172.16.12.1: icmp_req=1 ttl=64 time=0.191 ms ^C --- 172.16.12.1 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.191/0.191/0.191/0.000 ms
Avem conectivitate completă între cele două stații (red
și green
) inclusiv la nivel de serviciu. Stația green
poate accesa serviciile SSH, FTP, telnet de pe stația red
:
root@green:~# ssh root@172.16.12.1 [...] root@red:~# root@green:~# ftp 172.16.12.1 Connected to 172.16.12.1. 220 (vsFTPd 2.3.5) Name (172.16.12.1:root): [...] root@green:~# telnet 172.16.12.1 Trying 172.16.12.1... Connected to 172.16.12.1. Escape character is '^]'. Ubuntu 12.04.3 LTS red login: [...]
Ne propunem să blocăm traficul nesigur (adică FTP și telnet) de la stația green
la stația red
. Avem soluția configurării unui firewall pe stația red
folosind utilitarul iptables
. Această soluție are două neajunsuri:
iptables
;
De aceea dorim să filtrăm acele pachete direct de pe stația host
. Stația host
nu face însă prelucrarea pachetelor, acestea trec prin bridge-ul br1
deci nu putem folosi iptables
sau alt utilitar de prelucrare a traficului. Soluția o reprezintă însă utilitarul ebtables care permite configurarea de firewall la nivelul bridge-ului.
Pentru început vom instala ebtables
pe stația host
:
root@host:~# apt-get install ebtables
Apoi configurăm ebtables
pentru a împiedica traficul telnet și FTP care vine de la stația green
către stația red
. Sintaxa este similară iptables
:
root@host:~# ebtables -A FORWARD -p IPv4 --ip-src 172.16.12.2 --ip-dst 172.16.12.1 --ip-proto tcp --ip-destination-port 21 -j DROP root@host:~# ebtables -A FORWARD -p IPv4 --ip-src 172.16.12.2 --ip-dst 172.16.12.1 --ip-proto tcp --ip-destination-port 23 -j DROP root@host:~# ebtables -L FORWARD Bridge table: filter Bridge chain: FORWARD, entries: 2, policy: ACCEPT -p IPv4 --ip-src 172.16.12.2 --ip-dst 172.16.12.1 --ip-proto tcp --ip-dport 21 -j DROP -p IPv4 --ip-src 172.16.12.2 --ip-dst 172.16.12.1 --ip-proto tcp --ip-dport 23 -j DROP
Verificăm din nou, conectivitatea SSH, FTP și telnet de la stația green
la stația red
:
root@green:~# ssh root@172.16.12.1 [...] root@red:~# root@green:~# telnet 172.16.12.1 Trying 172.16.12.1... ^C root@green:~# ftp 172.16.12.1 ^C
Observăm că este în continuare funcțională doar conexiunea SSH, nu și FTP și telnet (blocate folosind ebtables
). Avem obiectivul îndeplinit: doar conexiunile sigure (pe porturile implicite) sunt permise între green
și red
.
ebtables
nu are acțiune de tip REJECT
ci doar DROP
. Astfel, inițiatorul unei conexiuni filtrate nu va fi înștiințat de filtrarea pachetelor. Acestea vor fi filtrate iar inițiatorul va trebui să deducă faptul că există o formă de blocare a pachetelor pe drum.