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.
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.sh
facilite 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 switchwan101
(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
- Anonymat et Ad Blocker avec privoxy ou tinyproxy
- Proxy simple intégré à la passerelle (Squid)
- Proxy transparent intégré à la passerelle (Squid)
- Proxy transparent et passerelle séparée (Squid)
- Filtrage d’URL (SquidGuard)
- Filtrage de contenu (e2guardian)
- 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&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&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