Services de passerelle

1. Introduction

1.1. Pré-requis de formation

Ce chapitre fait suite sur le plan théorique à :

Il fait suite sur le plan pratique à :

1.2. Notion de passerelle et topologies

On appelle ici un service de passerelle la facilité du routage IP qui implique le transfert de trafic TCP/IP entre au moins deux interfaces (physiques ou virtuelles). La passerelle connecte donc au moins deux segments du réseaux distincts avec leur adressage propre. On comprendra qu’une passerelle est un élément central de l’infrastructure réseau. C’est elle qui permet à des hôtes TCP/IP d’accéder au reste du réseau. Elément central, on peut y intégrer la traduction IPv4 (NAT) et la connectivité privée IPv6 (ULA).

L’hôte de virtualisation associera pour chaque commutateur/routeur créé une interface virtuelle à laquelle il aura accès. Du point de vue des machines virtuelles celles-ci peuvent disposer d’une ou plusieurs interfaces qui se connectent à un commutateur/routeur virtuel.

Eventuellement les fonctions d’infrastructure (DHCP, RA, DHCPv6, DNS, NTP) peuvent être intégrées à la passerelle pour une première phase de déploiement. Ces services pourraient être désactivés dès leur déploiement sur des machines dédiées.

On propose ici d’envisager de placer la passerelle et ses facilités de différentes manières :

  • Une solution intégrée est d’utiliser le routeur IPv4/IPv4 DNS/DHCP de libvirt.
  • Une autre solution consiste à utiliser une machine virtuelle KVM comme routeur Linux avec pare-feu et services d’infrastructures.

L’alternative la plus rapide à déployer est certainement la solution tout-intégré de libvirt.

L’alternative d’un routeur virtuel que l’on monte soi-même est certainement la topologie la plus représentative. On propose ici de déployer le routeur OpenWRT d’une part, et de déployer d’autre part un routeur “from the scratch” à partir d’une distribution Linux standard.

Quelle que soit la solution retenue, l’architecture logique devrait ressembler aux schémas suivants avec une passerelle qui contrôle le trafic entre deux zones : LAN et Internet.

On peut imaginer la connexion d’une zone démilitarisée (DMZ) supplémentaire.

On connectera / déconnectera l’interface réseau (NIC) d’une machine virtuelle à un commutateur/routeur facilement via une procédure décrite plus bas.

2. Services internes Libvirt

Avec la solution intégrée de libvirt, c’est le noyau linux de l’hôte de virtualisation qui cache et transfère le trafic. Le démon dnsmasq offre la solution d’infrastructure IPv4/IPv6.

2.1. Réseau default

Une interface bridge virbr0 192.168.122.1 est “natée” à l’interface physique. Le démon dnsmasq fournit le service DNS/DHCP.

Source de l’image

ip add show virbr0
ip route
iptables -t nat -L -n -v
cat /proc/sys/net/ipv4/ip_forward
virsh net-list

2.2. Solution Routeur virtuel (libvirtd) interne sans DHCP

Simple routeur NAT dont l’interface virbr1 prend l’adresse 192.168.22.254/24. Ce réseau s’appelle lab101.

Cette topologie permet de passer directement au déploiement d’un service d’infrastructure.

Editer un fichier lab101.xml

cat << EOF > lab101.xml
<network>
  <name>lab101</name>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr1' stp='on' delay='0'/>
  <domain name='lab101'/>
  <ip address='192.168.22.254' netmask='255.255.255.0'>
  </ip>
</network>
EOF

Créer et démarrer le switch

# virsh net-define lab101.xml
Network lab defined from lab101.xml

# virsh net-autostart lab101
Network lab101 marked as autostarted

# virsh net-start lab101
Network lab101 started

# virsh net-list
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes
 lab101               active     yes           yes

Eliminer un switch

# virsh net-destroy lab101
Network lab101 destroyed

 virsh net-list
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes

# virsh net-list --all
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes
 lab101                 inactive   yes           yes

# virsh net-undefine lab101
Network lab101 has been undefined

2.3. Création de routeur libvirt IPv4/IPv6 avec service complet

Le script add-bridge.shfacilite la création soit :

  • d’un commutateur isolé
  • d’un routeur nat sans dhcp
  • d’un routeur nat/ipv6 avec services et dhcp dynamiques

dont le nom est utilisé pour désigner l’interface et le réseau instancié.

# cd
# cd virt-scripts/
~/virt-scripts# ./add-bridge.sh
Description : This script create an isolated, nat or full bridge
Usage       : ./add-bridge.sh <name> <type : isolated or nat or full>
Example     : './add-bridge.sh net1 isolated' or './add-bridge.sh lan101 nat'

Création d’un routeur complet wan101

Pour adapter les plages IPv4 et IPv6, veuillez vérifier les variables ip4 et ip6 du script.

# ./add-bridge.sh wan101 full

Résultat :

~/wan101_report.txt writed :
Bridge Name         : wan101
Bridge Interface    : wan101
------------------------------------------------------------
Bridge IPv4 address : 10.16.175.1/24
IPv4 range          : 10.16.175.0 255.255.255.0
DHCP range          : 10.16.175.128 - 10.16.175.150
Bridge IPv6 address : fd00:16:175::1/64
IPv6 range          : fd00:16:175::/64
DHCPv6 range        : fd00:16:175::128/24 - 10.16.175.150/24
DNS Servers         : 10.16.175.1 and fd00:16:175::1


Network wan101 defined from /tmp/wan101.xml

Network wan101 marked as autostarted

Network wan101 started

 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes
 wan101               active     yes           yes

Aussi, ce script est exécute les tâches suivantes.

  • Il vérifie les paramètres fournis
  • Il génère un bloc IPv4 et un bloc un bIPv6 aléatoires (sur 16 bits) et vérifie leur usage
  • Il crée soit un commutateur isolé ou un routeur complet

https://github.com/goffinet/virt-scripts/blob/master/add-bridge.sh

#!/bin/bash
# For educational purposes : http://linux.goffinet.org/
# This script create an isolated, a simple nat without dhcp
# or  a nat/ipv6 bridge <name> <type>
name=${1}
bridge=$name
# 'isolated' or 'nat'
type=${2}
parameters=$#
path="/tmp"
net_id1="$(shuf -i 0-255 -n 1)"
net_id2="$(shuf -i 0-255 -n 1)"
# random /24 in 10.0.0.0/8 range
ip4="10.${net_id1}.${net_id2}."
ip6="fd00:${net_id1}:${net_id2}::"
# Fix your own range
#ip4="192.168.1."
#ip6="fd00:1::"

check_parameters () {
# Check the number of parameters given and display help
if [ "$parameters" -ne 2  ] ; then
echo "Description : This script create an isolated, nat or full bridge"
echo "Usage       : $0 <name> <type : isolated or nat or full>"
echo "Example     : '$0 net1 isolated' or '$0 lan101 nat'"
exit
fi
}

check_bridge_interface () {
# Check if the bridge interface name given is in use and display help
if [ -e /run/libvirt/network/${name}.xml ] ; then
echo "This bridge name ${name} is already in use"
echo "Change the bridge name or do 'virsh net-destroy ${name}' : exit"
exit
fi
}

check_interface () {
# Check if the bridge name is present
if [ -z "${bridge}" ]; then
echo "Please provide a valid interface name : exit"
exit
fi
# Check if the bridge interface is in use and display help
intlist=$(echo $(ls /sys/class/net))
for interface in ${intlist} ; do
if [ ${interface} = ${bridge} ] ; then
echo "This interface ${bridge} is already in use"
echo "Please provide an other bridged interface name : exit"
exit
fi
done
}

validate_ip_range () {
# Function to valide chosen IP prefixes

check_ip4 () {
# Check if the IPv4 prefix computed is in use
ip4list=$(echo $(ip -4 route | awk '{ print $1; }' | sed 's/\/.*$//'))
for ip4int in ${ip4list} ; do
if [ ${ip4int} = ${ip4} ] ; then
echo "Random Error, Please retry $@ : exit"
exit
fi
done
}

check_ip6 () {
# Check if the IPv6 prefix is in use
ip6list=$(echo $(ip -6 route | awk '{ print $1; }' | sed 's/\/.*$//'))
for ip6int in ${ip6list} ; do
if [ ${ip6int} = ${ip6} ] ; then
echo "Random Error, Please retry $@ : exit"
exit
fi
done
}

check_ip4
check_ip6
}

isolated () {
# Create a simple bridge xml file
cat << EOF > ${path}/${name}.xml
<network>
  <name>${name}</name>
  <bridge name='${bridge}' stp='on' delay='0'/>
</network>
EOF
}

nat () {
# Create a routed bridge xml file for IPv4 (NAT) without dhcp
cat << EOF > ${path}/${name}.xml
<network>
  <name>${name}</name>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='${bridge}' stp='on' delay='0'/>
  <domain name='${name}'/>
  <ip address='${ip4}1' netmask='255.255.255.0'>
  </ip>
</network>
EOF
}

report_nat () {
# Reporting Function about IPv4 and IPv6 configuration
cat << EOF > ~/${name}_report.txt
Bridge Name         : $name
Bridge Interface    : $bridge
------------------------------------------------------------
Bridge IPv4 address : ${ip4}1/24
IPv4 range          : ${ip4}0 255.255.255.0
DNS Servers         : ${ip4}1 and ${ip6}1
EOF
echo "~/${name}_report.txt writed : "
cat ~/${name}_report.txt
}

nat_ipv6 () {
# Create a routed bridge xml file for IPv4 (NAT) and IPv6 private ranges
cat << EOF > ${path}/${name}.xml
<network ipv6='yes'>
  <name>${name}</name>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='${bridge}' stp='on' delay='0'/>
  <domain name='${name}'/>
  <ip address='${ip4}1' netmask='255.255.255.0'>
    <dhcp>
      <range start='${ip4}128' end='${ip4}150'/>
    </dhcp>
  </ip>
  <ip family='ipv6' address='${ip6}1' prefix='64'>
    <dhcp>
      <range start='${ip6}100' end='${ip6}1ff'/>
    </dhcp>
  </ip>
</network>
EOF
}

report_nat_ipv6 () {
# Reporting Function about IPv4 and IPv6 configuration
cat << EOF > ~/${name}_report.txt
Bridge Name         : $name
Bridge Interface    : $bridge
------------------------------------------------------------
Bridge IPv4 address : ${ip4}1/24
IPv4 range          : ${ip4}0 255.255.255.0
DHCP range          : ${ip4}128 - ${ip4}150
Bridge IPv6 address : ${ip6}1/64
IPv6 range          : ${ip6}/64
DHCPv6 range        : ${ip6}128/24 - ${ip4}150/24
DNS Servers         : ${ip4}1 and ${ip6}1
EOF
echo "~/${name}_report.txt writed : "
cat ~/${name}_report.txt
}

check_type () {
# Check if the bridge type paramter given is 'isolated' or 'nat'
case ${type} in
    isolated) isolated ;;
    nat) nat ; report_nat ;;
    full) nat_ipv6 ; report_nat_ipv6 ;;
    *) echo "isolated, nat or full ? exit" ; exit ;;
esac
}

create_bridge () {
# Bridge creation
#cat ${path}/${name}.xml
virsh net-destroy ${name} 2> /dev/null
virsh net-undefine ${name} 2> /dev/null
virsh net-define ${path}/${name}.xml
virsh net-autostart ${name}
virsh net-start ${name}
virsh net-list
}

check_parameters
validate_ip_range
check_interface
check_bridge_interface
check_type
create_bridge

2.4. Commutateur isolé

Il est aisé de créer un commutateur isolé. Par exemple lan101 :

name=lan101
path=/tmp
bridge=$name
cat << EOF > ${path}/${name}.xml
<network>
  <name>${name}</name>
  <bridge name='${bridge}' stp='on' delay='0'/>
</network>
EOF
virsh net-destroy ${name} 2> /dev/null
virsh net-undefine ${name} 2> /dev/null
virsh net-define ${path}/${name}.xml
virsh net-autostart ${name}
virsh net-start ${name}
virsh net-list

3. Mise à disposition des ressources réseau

Une machine virtuelle demopc est créée et sa carte réseau est attachée par défaut au commutateur par défaut.

Source : https://raw.githubusercontent.com/goffinet/virt-scripts/master/define-guest-image.sh

cd
cd virt-scripts
./define-guest-image.sh demopc centos7
Début d'installation...
Création du domaine...                                                                                              |    0 B     00:00
Création du domaine terminée.  Vous pouvez redémarrer votre domaine en lançant :
  virsh --connect qemu:///system start demopc

Vérification externe

virsh domiflist demopc
Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet0      bridge     virbr0     virtio      52:54:00:fb:c5:b9

Vérification interne

virsh console demopc

se logguer et exécuter la commande ip a :

Connected to domain demopc
Escape character is ^]

CentOS Linux 7 (Core)
Kernel 3.10.0-514.6.2.el7.x86_64 on an x86_64

centos7 login: root
Password:
[root@centos7 ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:fb:c5:b9 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.101/24 brd 192.168.122.255 scope global dynamic eth0
       valid_lft 3514sec preferred_lft 3514sec
    inet6 fe80::5054:ff:fefb:c5b9/64 scope link
       valid_lft forever preferred_lft forever

3.1. Attacher une interface existante à un commutateur/routeur

Source : https://raw.githubusercontent.com/goffinet/virt-scripts/master/attach-nic.sh

./attach-nic.sh demopc wan101
Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet0      bridge     virbr0     virtio      52:54:00:fb:c5:b9

Please choose a mac address to attach : 52:54:00:fb:c5:b9
Device detached successfully

Device attached successfully

Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet0      bridge     wan101     virtio      52:54:00:fb:c5:b9

3.2. Attacher une nouvelle interface

Source : https://raw.githubusercontent.com/goffinet/virt-scripts/master/add-nic.sh

./add-nic.sh demopc lan101
Interface attached successfully

Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet0      bridge     wan101     virtio      52:54:00:fb:c5:b9
vnet1      bridge     lan101     virtio      02:19:32:bc:cd:cd

Si on choisit une interface physique de l’hôte, la machine virtuelle accède directement au réseau de l’interface en “macvtap” en “se pontant” sur le réseau physique en mode bridge. Elle pourrait être utilisée comme interface externe d’un routeur virtuel.

3.3. Détacher une interface

Source : https://raw.githubusercontent.com/goffinet/virt-scripts/master/detach-nic.sh

./detach-nic.sh demopc lan101
Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet0      bridge     wan101     virtio      52:54:00:fb:c5:b9
vnet1      bridge     lan101     virtio      02:19:32:bc:cd:cd

Please choose a mac address to attach : 02:19:32:bc:cd:cd
Device detached successfully

Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet0      bridge     wan101     virtio      52:54:00:fb:c5:b9

4. Routeurs virtuels Linux

Dans un routeur virtuel Linux :

  • Le choix de la distribution varie ici entre Centos, Debian ou OpenWRT.
  • Une attention particulière sur le pare-feu
  • L’interface qui connecte l’Internet est l’interface native du routeur virtuel.
  • LAN
  • DMZ
  • accessibilité
  • On propose un déploiement des services d’infrastructure en deux phases :
  • d’une part, d’abord sur le routeur avec dnsmasq
  • d’autre part sur une machine virtuelle dédiée avec les logiciels ISC

4.1. Solution KVM avec OpenWRT

Source : https://raw.githubusercontent.com/goffinet/virt-scripts/master/get_and_install_openwrt.sh

#!/bin/bash
## OpenWRT 15.05 router Firewall with two interfaces
# Fix variables
name=$1
router_name=router-$name
url=https://downloads.openwrt.org/chaos_calmer/15.05/x86/kvm_guest/openwrt-15.05-x86-kvm_guest-combined-ext4.img.gz
destination=/var/lib/libvirt/images/
parameters=$#

check_parameters () {
# Check parameters
if [ $parameters -ne 1 ]; then
echo "Please provide the name" ; exit
exit
fi
# Check the name
if grep -qw ${router_name} <<< $(virsh list --all --name)  ; then
echo "Please provide a guest name that is not in use : exit"
exit
fi
}

bridges_creation () {
# bridges creation
./add-bridge.sh lan-$name isolated
./add-bridge.sh internet-$name nat
}

openwrt_installation () {
# Get and decompresse image
wget $url$image -O $destination$router_name.img.gz
gunzip $destination$router_name.img.gz
# Install the guest
virt-install --name=$router_name \
--ram=128 --vcpus=1 \
--os-type=linux \
--disk path=$destination$router_name.img,bus=ide \
--network bridge=lan-$name,model=virtio \
--network bridge=internet-$name,model=virtio \
--import  \
--noautoconsole
}

check_parameters
bridges_creation
openwrt_installation

En considérant le nom du lab lab142 en ne se souciant pas des adresses attribuées

export y=lab142
./get_and_install_openwrt.sh $y
./define-guest-image.sh pc1-$y centos7
./define-guest-image.sh infra-$y centos7
./attach-nic.sh pc1-$y lan-$y
./attach-nic.sh infra-$y lan-$y

Avec des profils et en moins de lignes :

export y=lab143
./get_and_install_openwrt.sh $y
./deploy-image-by-profile.sh pc1-$y lan-$y xsmall centos7
./deploy-image-by-profile.sh infra-$y lan-$y small centos7

4.2. Solution KVM avec un routeur Centos

En vue de déployer et de maîtriser soi-même les services de passerelle et d’infrastructure, il est proposé de déployer son propre routeur en machine virtuelle.

1. Description

Dans cette topologie, on reprendra l’une ou l’autre des configurations vues ci-dessus, par exemple celle du lab101

Deux facilités réseaux :

  • Un commutateur (switch) isolé qui fait office de réseau local appelé lan101
  • Un routeur NAT/IPv6 qui fait office d’Internet appelé wan101

Deux machines :

  • Un client connecté au switch lan101 (eth0)
  • Un routeur connecté au switch lan101 (eth0) et au switch wan101 (eth1) qui rendra les services DNS, DHCP, DHCPv6, SLAAC sur lan101. Les plages du LAN sont adressées en 192.168.168.0/24 et fd00:168:168::/64.

Source du lab101 : https://github.com/goffinet/virt-scripts/blob/master/labs/101/

2. Objectifs

  • Monter la topologie
  • Configurer le routeur à services intégrés :
  • Adressage IPv4/IPv6
  • Routage IPv4/IPv6
  • Pare-feu LAN/WAN IPv4/IPv6
  • Services DNS, DHCP, DHCPv6, SLAAC sur le LAN

3. Connectique

Création d’une machine virtuelle qui fera office de routeur lab101-router et attacher l’interface eth0 au commutateur lan101.

./define-guest-image.sh lab101-router centos7
./attach-nic.sh lab101-router lan101

ou en une seule opération :

./deploy-image-by-profile.sh lab101-router lan101 xsmall

Attacher une nouvelle interface eth1 au commutateur wan101.

./add-nic.sh lab101-router wan101

4. Configuration NetworkManager / Firewalld

Pare-feu Firewalld IPv6

Gist à adapter https://gist.github.com/goffinet/0d2604d09e333d1842b7323d4cb536d8

Fonctionnel sous Centos7 sauf :

Correction à apporter :

nmcli con "$connection" +ipv4.dns "127.0.0.1"
nmcli con "$connection" +ipv6.dns "::1"
#!/bin/bash
connection="System eth0"
ip4="192.168.168"
ip6="fd00:168:168"
1_interfaces () {
#hostnamectl set-hostname router
nmcli c mod "$connection" ipv4.addresses $ip4.1/24
nmcli c mod "$connection" ipv4.method manual
nmcli c mod "$connection" ipv6.addresses $ip6::1/64
nmcli c mod "$connection" ipv6.method manual
nmcli c mod "$connection" connection.zone internal
nmcli c up  "$connection"
}
2_routing () {
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.all.forwarding=1
sysctl -p
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf
}
3_firewall () {
systemctl enable firewalld
systemctl start firewalld
firewall-cmd --zone=internal --add-service=dns --permanent
firewall-cmd --zone=internal --add-service=dhcp --permanent
firewall-cmd --zone=internal --add-service=dhcpv6 --permanent
firewall-cmd --zone=internal --add-source=${ip4}.0/24 --permanent
firewall-cmd --zone=internal --add-source=${ip6}::/64 --permanent
firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --reload
}
4_dhcp-dns () {
yum -y install dnsmasq*
echo "dhcp-range=$ip4.50,$ip4.150,255.255.255.0,12h" > /etc/dnsmasq.d/eth0.conf
echo "dhcp-option=3,$ip4.1" >> /etc/dnsmasq.d/eth0.conf
echo "dhcp-range=$ip6::2,$ip6::500,slaac" >> /etc/dnsmasq.d/eth0.conf
systemctl enable dnsmasq
systemctl start dnsmasq
}

1_interfaces
2_routing
3_firewall
4_dhcp-dns

5. Configuration par fichier ifcfg et Netfilter/Iptables

Script adapté à iptables/ip6tables

Gist à adapter : https://gist.github.com/goffinet/f6aea219228cd0220a46d181947becd3

Fonctionnel sous Centos7

#!/bin/bash
ip4="192.168.168"
ip6="fd00:168:168"
lan="eth0"
wan="eth1"

1_interfaces () {
cat << EOF > /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
NM_CONTROLLED="no"
ONBOOT="yes"
IPV6INIT="yes"
BOOTPROTO="static"
IPADDR="${ip4}.1"
NETMASK="255.255.255.0"
IPV6ADDR="${ip6}::1/64"
EOF
cat << EOF > /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE="eth1"
NM_CONTROLLED="no"
IPV6INIT="yes"
ONBOOT="yes"
BOOTPROTO="dhcp"
EOF
systemctl stop NetworkManager
systemctl disable NetworkManager
systemctl restart network
}

2_routing () {
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.all.forwarding=1
sysctl -p
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf
#Routing BCP to implement
}

3_firewall () {
#Disable Firewalld / Install iptables-services
systemctl disable firewalld
systemctl stop firewalld
systemctl mask firewalld
yum install -y iptables-services
#Start IPv4 Firewall Configuration
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -A INPUT  -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -o $wan -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i $lan -j ACCEPT
iptables -A OUTPUT -o $lan -j ACCEPT
iptables -A FORWARD -m state --state NEW -i $lan -o $wan -s ${ip4}.0/24 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p udp -i $wan --sport 67 -j ACCEPT
iptables -P INPUT   DROP
iptables -P FORWARD DROP
iptables -P OUTPUT  DROP
iptables -t nat -A POSTROUTING -s ${ip4}.0/24 -o $wan -j MASQUERADE
iptables-save > /etc/sysconfig/iptables
##Start IPv6 Firewall Configuration
ip6tables -F
ip6tables -X
ip6tables -A INPUT  -i lo -j ACCEPT
ip6tables -A OUTPUT -o lo -j ACCEPT
ip6tables -A OUTPUT -o $wan -j ACCEPT
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -i $lan -j ACCEPT
ip6tables -A OUTPUT -o $lan -j ACCEPT
ip6tables -A INPUT -m rt --rt-type 0 -j DROP
ip6tables -A FORWARD -m rt --rt-type 0 -j DROP
ip6tables -A OUTPUT -m rt --rt-type 0 -j DROP
ip6tables -A INPUT -s fe80::/10 -j ACCEPT
ip6tables -A OUTPUT -s fe80::/10 -j ACCEPT
ip6tables -A INPUT -d ff00::/8 -j ACCEPT
ip6tables -A OUTPUT -d ff00::/8 -j ACCEPT
ip6tables -I INPUT  -p icmpv6 -j ACCEPT
ip6tables -I OUTPUT -p icmpv6 -j ACCEPT
ip6tables -I FORWARD -p icmpv6 -j ACCEPT
ip6tables -A FORWARD -m state --state NEW -i $lan -o $wan -s ${ip6}::/64 -j ACCEPT
ip6tables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -m state --state NEW -m udp -p udp --dport 546 -d fe80::/64 -j ACCEPT
ip6tables -P INPUT   DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT  DROP
ip6tables-save > /etc/sysconfig/ip6tables
#Enable and start iptables-services
systemctl enable iptables
systemctl enable ip6tables
systemctl start iptables
systemctl start ip6tables
}

4_dhcp-dns () {
yum -y install dnsmasq*
echo "dhcp-range=$ip4.50,$ip4.150,255.255.255.0,12h" > /etc/dnsmasq.d/eth0.conf
echo "dhcp-option=3,$ip4.1" >> /etc/dnsmasq.d/eth0.conf
echo "dhcp-range=$ip6::2,$ip6::500,slaac" >> /etc/dnsmasq.d/eth0.conf
systemctl enable dnsmasq
systemctl start dnsmasq
}

1_interfaces
2_routing
3_firewall
4_dhcp-dns

6. Notes

Note : Configuration Selinux

selinux_configuration () {
#sed -i "s/SELINUX=enforcing/SELINUX=permissive/g" /etc/sysconfig/selinux
#sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux
#cat /.autorelabel ; reboot
}

Todo : adaptation debian 8 (iptables) (lab101)

Todo : adapter l’exercice à un plan kcli avec une dmz (lab102) :

  • network lan102 isolated
  • network wan102 nat
  • network dmz102
  • profil xsmall, small
  • pc1-102 xsmall lan101
  • router1-102 xsmall lan102 ip + wan101 + script iptables
  • server1-102 small lan102
  • server2-102 small dmz102

4.3. Routage dynamique

4 routeurs avec lan isolé et wan partagé (lab103) en OSPFv2 (et en OSPFv3).

Source : https://github.com/goffinet/virt-scripts/tree/master/labs/103

Topologie

IPv4 :

   +---+ ***************   *************** +---+
   |PC1| *10.103.1.0/24*   *10.103.2.0/24* |PC2|
   +---+ ***************   *************** +---+
  +---+                                   +---+
    |                                       |
    |                                       |
    |   .1/24                        .2/24  |
 +--+-------+                       +-------+--+
 |   eth0   |                       |   eth0   |
 |    R1    |     ***************   |    R2    |
 |   eth1   |     *10.103.0.0/24*   |   eth1   |
 +----------+     ***************   +----------+
      |.1/24       +----------+     .2/24|
      +------------+          +----------+
                   |WAN SWITCH|
     +-------------+          +-----------+
     | .3/24       +----------+     .4/24 |
 +---+------+                       +-----+----+
 |   eth1   |                       |   eth1   |
 |    R3    |                       |    R4    |
 |   eth0   |                       |   eth0   |
 +-+--------+                       +--------+-+
   |                                         |
   |                                         |
 +-+-+  ***************    *************** +-+-+
 |PC3|  *10.103.3.0/24*    *10.103.4.0/24* |PC4|
 +---+  ***************    *************** +---+
+---+                                     +---+

IPv6 :

+---+ *****************                 +---+
|PC1| *fd00:103:1::/64*                 |PC2|
+---+ *****************                 +---+
+---+                *****************  +---+
 |                  *fd00:103:1::/64*    |
 |                  *****************    |
 |   :1/64                        :1/64  |
+--+-------+                       +-------+--+
|   eth0   |                       |   eth0   |
|    R1    |     ***************   |    R2    |
|   eth1   |     *fd00:103::/64*   |   eth1   |
+----------+     ***************   +----+-----+
   |:1/64       +----------+          | :2/64
   +------------+          +----------+
                |WAN SWITCH|
  +-------------+          +-----------+
  | :3/64       +----------+     :4/64 |
+---+------+                       +-----+----+
|   eth1   |                       |   eth1   |
|    R3    |                       |    R4    |
|   eth0   |                       |   eth0   |
+----------+                       +--------+-+
|:1/64 *****************            :1/64 |
|      *fd00:103:3::/64*                  |
+-+-+    ************* ****               +-+-+
|PC3|                 *****************   |PC4|
+---+                 *fd00:103:4::/64*   +---+
+---+                  *****************  +---+

Créer la topologie

cd
cd virt-scripts
labs/103/start.sh

Déployer la configuration de Quagga

Cette configuration se trouve dans le script init.sh :

cd
cd virt-scripts
labs/103/deploy.sh

Station, routeurs et réseaux

~/virt-scripts# virsh list --name
pc1-103
pc2-103
pc3-103
pc4-103
r1-103
r2-103
r3-103
r4-103
~/virt-scripts# virsh net-list
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes
 lan1-103             active     yes           yes
 lan2-103             active     yes           yes
 lan3-103             active     yes           yes
 lan4-103             active     yes           yes
 wan-103              active     yes           yes

Déploiement de la configuration (R4)

#!/bin/bash
## Check Variables
id='4'
connectionlan="System eth0"
connectionwan="Wired connection 1"
ip4="10.103"
ip6="fd00:103"
lan="eth0"
wan="eth1"
domain="lan$id"

1a_interfaces () {
#hostnamectl set-hostname router
nmcli c mod "$connectionlan" ipv4.addresses ${ip4}.${id}.1/24
nmcli c mod "$connectionlan" ipv4.method manual
nmcli c mod "$connectionlan" ipv6.addresses ${ip6}:${id}::1/64
nmcli c mod "$connectionlan" ipv6.method manual
nmcli c mod "$connectionlan" connection.zone internal
nmcli c up  "$connectionlan"
nmcli c mod "$connectionwan" ipv4.addresses ${ip4}.0.${id}/24
nmcli c mod "$connectionwan" ipv4.method manual
nmcli c mod "$connectionwan" ipv6.addresses ${ip6}::${id}/64
nmcli c mod "$connectionwan" ipv6.method manual
nmcli c mod "$connectionwan" connection.zone internal
nmcli c up  "$connectionwan"
}

2_routing () {
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.all.forwarding=1
sysctl -p
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf
#Routing BCP to implement
}

3_firewall () {
systemctl disable firewalld
systemctl stop firewalld
systemctl mask firewalld
systemctl disable iptables
systemctl disable ip6tables
systemctl stop iptables
systemctl stop ip6tables
}

4_dhcp-dns () {
yum -y install dnsmasq*
echo "domain=$domain" > /etc/dnsmasq.d/eth0.conf
echo "dhcp-range=${ip4}.${id}.50,${ip4}.${id}.150,255.255.255.0,12h" >> /etc/dnsmasq.d/eth0.conf
echo "dhcp-option=3,${ip4}.1" >> /etc/dnsmasq.d/eth0.conf
echo "dhcp-range=${ip6}:${id}::,ra-stateless,ra-names" >> /etc/dnsmasq.d/eth0.conf
systemctl enable dnsmasq
systemctl start dnsmasq
}

5_selinux_configuration () {
sed -i "s/SELINUX=enforcing/SELINUX=permissive/g" /etc/sysconfig/selinux
#sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux
cat /.autorelabel ; reboot
}

ospf () {
yum -y install quagga
cat << EOF > /etc/quagga/ospfd.conf
router ospf
 ospf router-id ${id}.${id}.${id}.${id}
 passive-interface eth0
 network ${ip4}.0.0/24 area 0.0.0.0
 network ${ip4}.${id}.0/24 area 0.0.0.0
EOF
chown quagga:quagga /etc/quagga/ospfd.conf
cat << EOF > /etc/quagga/ospf6d.conf
interface eth0
 ipv6 ospf6 passive
 ipv6 ospf6 priority 1
interface eth1
 ipv6 ospf6 priority 1
router ospf6
 router-id ${id}.${id}.${id}.${id}
 interface eth0 area 0.0.0.0
 interface eth1 area 0.0.0.0
EOF
chown quagga:quagga /etc/quagga/ospf6d.conf
setsebool -P zebra_write_config 1
systemctl enable zebra
systemctl start zebra
systemctl enable ospfd
systemctl start ospfd
systemctl enable ospf6d
systemctl start ospf6d
}

management_network_down () {
nmcli c mod "Wired connection 2" ipv4.method disabled
nmcli c mod "Wired connection 2" ipv6.method ignore
nmcli c down "Wired connection 2"
}


## lan and wan interface configuration with NetworkManager
1a_interfaces
## IPv4/IPv6 Routing
2_routing
## Firewall configuration (disabled)
3_firewall
## DHCP, DHCPv6, SLAAC, DNS Service
4_dhcp-dns
## OSPF Configuration
ospf
## Selinux configuration stuff (disabled)
#selinux_configuration
## Disabling eth2 management interface
management_network_down

Vérification des interfaces sur R1

Dans le shell Linux :

[root@r1-103 ~]# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 52:54:00:c3:b1:cd brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 02:8c:da:b4:5d:fa brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 02:0a:a9:ea:9b:83 brd ff:ff:ff:ff:ff:ff
[root@r1-103 ~]# nmcli d
DEVICE  TYPE      STATE         CONNECTION
eth0    ethernet  connected     System eth0
eth1    ethernet  connected     Wired connection 1
eth2    ethernet  disconnected  --
lo      loopback  unmanaged     --

L’interface eth2 est utilisée pour fournir la connectivité Internet lors de la phase d’installation de Quagga et Dnsmasq. cette interface est ‘disconnected’ par NetworkManager.

Dans le shell Quagga :

[root@r1-103 ~]# vtysh

Hello, this is Quagga (version 0.99.22.4).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

r1-103# show interface
Interface eth0 is up, line protocol detection is disabled
  index 2 metric 1 mtu 1500
  flags: <UP,BROADCAST,RUNNING,MULTICAST>
  HWaddr: 52:54:00:c3:b1:cd
  inet 10.103.1.1/24 broadcast 10.103.1.255
  inet6 fd00:103:1::1/64
  inet6 fe80::5054:ff:fec3:b1cd/64
Interface eth1 is up, line protocol detection is disabled
  index 3 metric 1 mtu 1500
  flags: <UP,BROADCAST,RUNNING,MULTICAST>
  HWaddr: 02:8c:da:b4:5d:fa
  inet 10.103.0.1/24 broadcast 10.103.0.255
  inet6 fd00:103::1/64
  inet6 fe80::9e43:5599:6015:6630/64
Interface eth2 is up, line protocol detection is disabled
  index 4 metric 1 mtu 1500
  flags: <UP,BROADCAST,RUNNING,MULTICAST>
  HWaddr: 02:0a:a9:ea:9b:83
Interface lo is up, line protocol detection is disabled
  index 1 metric 1 mtu 65536
  flags: <UP,LOOPBACK,RUNNING>
  inet 127.0.0.1/8
  inet6 ::1/128

Tables de routage IPv4/IPv6 dans R2

[root@r2-103 ~]# vtysh

Hello, this is Quagga (version 0.99.22.4).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

r2-103# sh ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, A - Babel,
       > - selected route, * - FIB route

K * 0.0.0.0/0 via 192.168.122.1, eth2 inactive
O   10.103.0.0/24 [110/10] is directly connected, eth1, 00:00:56
C>* 10.103.0.0/24 is directly connected, eth1
O>* 10.103.1.0/24 [110/20] via 10.103.0.1, eth1, 00:00:56
O   10.103.2.0/24 [110/10] is directly connected, eth0, 00:02:16
C>* 10.103.2.0/24 is directly connected, eth0
O>* 10.103.3.0/24 [110/20] via 10.103.0.3, eth1, 00:00:56
O>* 10.103.4.0/24 [110/20] via 10.103.0.4, eth1, 00:00:56
C>* 127.0.0.0/8 is directly connected, lo
r2-103# exit
r1-103# sh ipv6 route
Codes: K - kernel route, C - connected, S - static, R - RIPng,
       O - OSPFv6, I - IS-IS, B - BGP, A - Babel,
       > - selected route, * - FIB route

C>* ::1/128 is directly connected, lo
O   fd00:103::/64 [110/1] is directly connected, eth1, 00:00:22
C>* fd00:103::/64 is directly connected, eth1
O   fd00:103:1::/64 [110/1] via ::1, lo, 00:00:22
C>* fd00:103:1::/64 is directly connected, eth0
O>* fd00:103:2::/64 [110/2] via fe80::ff7a:8c8a:3b74:b757, eth1, 00:00:17
O>* fd00:103:3::/64 [110/2] via fe80::c0a8:ecbe:9958:7188, eth1, 00:00:17
O>* fd00:103:4::/64 [110/2] via fe80::f70e:98d1:9f7:d380, eth1, 00:00:21
C * fe80::/64 is directly connected, eth1
C>* fe80::/64 is directly connected, eth0

Connectivité de bout en bout de l’un des routeurs vers chaque PC

for id in 1 2 3 4 ; do
if [ ! -e /root/.ssh/id_rsa.pub ] ; then
ssh-keygen -q ; fi
ssh-copy-id 10.103.0.${id}
done
for id in 1 2 3 4 ; do
echo "R${id} --> PC${id}"
ping -c1 $(ssh 10.103.0.${id} "cat /var/lib/dnsmasq/dnsmasq.leases | grep pc | cut -d ' ' -f 3")
done

Connectivité de bout en bout d’un PC vers chaque interface LAN des routeurs

for id in 1 2 3 4 ; do
echo "PC${id} -->  LAN${id}"
ping -c1 10.103.${id}.1
done

Vérifications OSPF

r1-103# show ip ospf neighbor

    Neighbor ID Pri State           Dead Time Address         Interface
   RXmtL RqstL DBsmL
2.2.2.2           1 2-Way/DROther     35.308s 10.103.0.2      eth1:10.103.0.1
       0     0     0
3.3.3.3           1 Full/Backup       39.025s 10.103.0.3      eth1:10.103.0.1
       0     0     0
4.4.4.4           1 Full/DR           35.199s 10.103.0.4      eth1:10.103.0.1
       0     0     0
r1-103# show ipv6 ospf6 neighbor
Neighbor ID     Pri    DeadTime  State/IfState         Duration I/F[State]
2.2.2.2           1    00:00:32 Twoway/DROther         00:06:08 eth1[DROther]
3.3.3.3           1    00:00:35   Full/BDR             00:05:07 eth1[DROther]
4.4.4.4           1    00:00:32   Full/DR              00:05:08 eth1[DROther]
r1-103# show ip ospf interface eth1
eth1 is up
  ifindex 3, MTU 1500 bytes, BW 0 Kbit <UP,BROADCAST,RUNNING,MULTICAST>
  Internet Address 10.103.0.1/24, Broadcast 10.103.0.255, Area 0.0.0.0
  MTU mismatch detection:enabled
  Router ID 1.1.1.1, Network Type BROADCAST, Cost: 10
  Transmit Delay is 1 sec, State DROther, Priority 1
  Designated Router (ID) 4.4.4.4, Interface Address 10.103.0.4
  Backup Designated Router (ID) 3.3.3.3, Interface Address 10.103.0.3
  Multicast group memberships: OSPFAllRouters
  Timer intervals configured, Hello 10s, Dead 40s, Wait 40s, Retransmit 5
    Hello due in 8.359s
  Neighbor Count is 3, Adjacent neighbor count is 2
r1-103# show ipv6 ospf6 interface eth1
eth1 is up, type BROADCAST
  Interface ID: 3
  Internet Address:
    inet : 10.103.0.1/24
    inet6: fd00:103::1/64
    inet6: fe80::9e43:5599:6015:6630/64
  Instance ID 0, Interface MTU 1500 (autodetect: 1500)
  MTU mismatch detection: enabled
  Area ID 0.0.0.0, Cost 1
  State DROther, Transmit Delay 1 sec, Priority 1
  Timer intervals configured:
   Hello 10, Dead 40, Retransmit 5
  DR: 4.4.4.4 BDR: 3.3.3.3
  Number of I/F scoped LSAs is 4
    0 Pending LSAs for LSUpdate in Time 00:00:00 [thread off]
    0 Pending LSAs for LSAck in Time 00:00:00 [thread off]
r1-103# show ip ospf database

       OSPF Router with ID (1.1.1.1)

                Router Link States (Area 0.0.0.0)

Link ID         ADV Router      Age  Seq#       CkSum  Link count
1.1.1.1         1.1.1.1          585 0x80000006 0x13b5 2
2.2.2.2         2.2.2.2          587 0x80000006 0xe9d4 2
3.3.3.3         3.3.3.3          586 0x80000008 0xbcf5 2
4.4.4.4         4.4.4.4          590 0x80000007 0x9514 2

                Net Link States (Area 0.0.0.0)

Link ID         ADV Router      Age  Seq#       CkSum
10.103.0.4      4.4.4.4          590 0x80000003 0x287a
r1-103# show ipv6 ospf6 linkstate

        SPF Result in Area 0.0.0.0

Type    Router-ID       Net-ID          Rtr-Bits Options        Cost
Router  1.1.1.1         0.0.0.0         -------- --|R|-|--|E|V6 0
Router  2.2.2.2         0.0.0.0         -------- --|R|-|--|E|V6 1
Router  3.3.3.3         0.0.0.0         -------- --|R|-|--|E|V6 1
Router  4.4.4.4         0.0.0.0         -------- --|R|-|--|E|V6 1
Network 4.4.4.4         0.0.0.3         -------- --|R|-|--|E|V6 1
r1-103# show ipv6 ospf6 linkstate
  <cr>
  detail
  network  Display Network Entry
  router   Display Router Entry
  • Sécurisation du service vty
  • Redistribution de routes

4.4. Considération de sécurité

  • Paramètres du noyau
  • SELinux
  • Pare-feu libvirt

1. Pare-feu libvirt

virsh --help | grep filter
 Network Filter (help keyword 'filter')
    nwfilter-define                define or update a network filter from an XML file
    nwfilter-dumpxml               network filter information in XML
    nwfilter-edit                  edit XML configuration for a network filter
    nwfilter-list                  list network filters
    nwfilter-undefine              undefine a network filter

2. Adaptation des paramètres du noyau

Lab104

# sysctl -a | grep ipv4 | wc -l
252
# sysctl -a | grep ipv6 | wc -l
191

3. Selinux

4.5. Autres solutions L2/L3

Réseaux libvirt avec kcli

  • Bonding/Teaming, VLANs/Trunking
  • Openvswitch (L2)
  • vyatta, routeros
  • Smoothwall, ipcop, …
  • Opensense, pfsense, …
  • Cisco CSR 1000v
  • GNS3 comme plateforme de lab

5. Service proxy HTTP

5.1. Introduction aux serveurs proxy HTTP

1. Définition

Un proxy est un composant logiciel informatique qui joue le rôle d’intermédiaire en se plaçant entre deux hôtes pour faciliter ou surveiller leurs échanges.

Dans le cadre plus précis des réseaux informatiques, un proxy est alors un programme servant d’intermédiaire pour accéder à un autre réseau, généralement internet. Par extension, on appelle aussi « proxy » un matériel comme un serveur mis en place pour assurer le fonctionnement de tels services.

Un proxy inverse (reverse proxy) est un type de serveur, habituellement placé en frontal de serveurs web. Contrairement au serveur proxy qui permet à un utilisateur d’accéder au réseau Internet, le proxy inverse permet à un utilisateur d’Internet d’accéder à des serveurs internes, une des applications courantes du proxy inverse est la répartition de charge (load-balancing). On ne parelera ici que de service proxy HTTP.

Types de proxy

  • Proxy HTTP
  • Proxy Socks

Buts des serveurs proxy HTTP

  • Amélioration des performances (filtrage de scripts, publicités, mise en cache, …)
  • Journalisation du trafic
  • Contrôle sur trafic du réseau local vers des destinations HTTP, mais aussi portal captif
  • filtrage / anonymat

Logiciels proxy

  • Squid
  • Privoxy
  • Tinyproxy

Fitrage d’URL

  • Squidguard

Filtrage de contenu :

  • Dansguardian
  • e2guardian

Reporting :

  • SARG : Squid Analysis Report Generator
  • Mais voir aussi dans des logwatch, kibana, splunk, etc.

Dimensionnement d’un service Proxy :

Dimensionnement en CPU/RAM, disques et réseau en conséquence du nombre de postes dans le réseau pour lesquels le serveur va faire office de mandataire.

Autres fonctionnalités, support d’un serveur proxy :

  • Protocoles HTTP, HTTPS, FTP et plus ;
  • ICP, HTCP, CARP, Cache Digests ;
  • Processus de cache transparent ;
  • WCCP (Squid v2.3 et supérieur) ;
  • Contrôle des accès étendu ;
  • Cache les requêtes DNS.
  • Mandataire inverse (reverse proxy)

Déploiement des proxys.

  • Solutions proxy personnelles : mettre en cache son trafic, bloquer du contenu, passer du trafic dans des tunnels, dans tor, …
  • Solutions serveurs : dans le réseau de l’entreprise.

Pour que les clients livrent leur trafic au serveur proxy :

  • Soit le paramètre est poussé dans les logiciels clients (navigateur web mais d’autres, pour d’autres protocoles).
  • Manuellement
  • Via des mécanismes de gestion de parc comme des GPO Windows
  • Soit le serveur proxy capture directement le trafic.
  • Intégré à la passerelle, il prend en charge directement le trafic.
  • Via un transfert de la passerelle du réseau vers le proxy, seul autorisé à joindre la destination dans ce protocole.

Topologies

  • Personnelles (privoxy, tinyproxy, chainy daising, tor)
  • Serveur Squid intégré à la passerelle
  • Serveur Squid dissocié de la passerelle

Labs

  1. Anonymat et Ad Blocker avec privoxy ou tinyproxy
  2. Proxy simple intégré à la passerelle (Squid)
  3. Proxy transparent intégré à la passerelle (Squid)
  4. Proxy transparent et passerelle séparée (Squid)
  5. Filtrage d’URL (SquidGuard)
  6. Filtrage de contenu (e2guardian)
  7. Reporting (SARG)

5.2. Squid

1. Références

  • https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Networking_Guide/ch-Squid_Server.html
  • https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/SELinux_Users_and_Administrators_Guide/chap-Managing_Confined_Services-Squid_Caching_Proxy.html

Nécessairement puisque celui-ci prend en charge le trafic pour plusieurs hôte (internes), on y activera le routage.

2. Installation

Sur le serveur (dans un premier temps la passerelle), installation de squid.

yum -y install squid
systemctl enable squid
systemctl start squid
squid -v

3. Test client

Requête HTTP sans proxy venant d’un client.

[root@c1-101 ~]# curl www.google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.fr/?gfe_rd=cr&amp;ei=MJjFWN70Fu7S8AeP5ab4Bw">here</A>.
</BODY></HTML>

Requête HTTP en désignant le serveur proxy et son port (TCP3128) venant d’un client.

[root@c1-101 ~]# curl -x 192.168.168.1:3128 www.google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.fr/?gfe_rd=cr&amp;ei=MpjFWNO2OeLS8Ael9ZT4CQ">here</A>.
</BODY></HTML>

4. Logs

Lecture des logs sur le serveur proxy.

tail /var/log/squid/access.log
1489344562.945     11 192.168.168.107 TCP_MISS/302 587 GET http://www.google.com/ - HIER_DIRECT/216.58.213.132 text/html

5. Désactivation du NAT pour test

Pour bien comprendre l’oeuvre d’un serveur proxy, il vous est proposé de recommencer les deux requêtes HTTP avec et sans proxy en désactivant le NAT sur la passerelle/proxy. Vous constaterez que le trafic passant par le proxy donne un résultat alors que sans proxy, aucun résultat n’aboutit. Si le proxy est sur la passerelle qui accède directement à l’Internet, il n’a pas besoin de NAT pour placer du trafic à l’extérieur et il le fait en tant que mandataire de la station cliente.

iptables -t nat -F
iptables -t nat -X

6. Configuration de Squid

Fichier de configuration par défaut de Squid (Centos7).

#
# Recommended minimum configuration:
#

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
acl localnet src 10.0.0.0/8	# RFC1918 possible internal network
acl localnet src 172.16.0.0/12	# RFC1918 possible internal network
acl localnet src 192.168.0.0/16	# RFC1918 possible internal network
acl localnet src fc00::/7       # RFC 4193 local private network range
acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines

acl SSL_ports port 443
acl Safe_ports port 80		# http
acl Safe_ports port 21		# ftp
acl Safe_ports port 443		# https
acl Safe_ports port 70		# gopher
acl Safe_ports port 210		# wais
acl Safe_ports port 1025-65535	# unregistered ports
acl Safe_ports port 280		# http-mgmt
acl Safe_ports port 488		# gss-http
acl Safe_ports port 591		# filemaker
acl Safe_ports port 777		# multiling http
acl CONNECT method CONNECT

#
# Recommended minimum Access Permission configuration:
#
# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#http_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost

# And finally deny all other access to this proxy
http_access deny all

# Squid normally listens to port 3128
http_port 3128

# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/spool/squid 100 16 256

# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid

#
# Add any of your own refresh_pattern entries above these.
#
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
refresh_pattern .		0	20%	4320

Adaptations :

  • Configuration d’un cache
  • ACL, réseaux, ports, URL de destination
  • Changement de port
  • Politiques de pare-feu
  • Messages d’erreur localisés et personnalisés
  • Cache DNS
  • SquidGuard
  • SARG
  • e2guardian
  • Proxy transparent HTTP
  • Authentification
  • Proxy Transparent HTTPS

Notes :

firewall-cmd --add-port=3128/tcp --permanent

ou

iptables -I INPUT -i $lan -m state --state NEW -m tcp -p tcp --dport 3128 -j ACCEPT