Quitter le forum et retourner au site

Shorewall pour les paresseux !

Vous avez un didactiel ou une astuce particulière concernant un logiciel, partagez votre expérience dans cette partie.
Avatar de l’utilisateur
le Manchot Masqué
Administrateur du site
Messages : 719
Inscription : lun. 26 mai 2008, 21:05
Distribution : Debian, Ubuntu
Niveau : Moitié plein !
Localisation : Guebwiller

Shorewall pour les paresseux !

Message par le Manchot Masqué »

Et si on transformait notre ordinateur en passerelle internet de base, à placer juste après la box internet, histoire de protéger les utilisateur de notre réseau local des affreux jojos du net, dont nos chers FAI qui se permettent tous de scanner notre réseau local sans notre permission ?

Dans un premier temps, on installera le paquet isc-dhcp-server qui va fournir le service DHCP (attribution des adresses IP aux clients),
en rajoutant simplement les lignes suivantes dans le fichier /etc/dhcp/dhcpd.conf :

Code : Tout sélectionner

subnet 192.168.100.0 netmask 255.255.255.0 {
        range 192.168.100.2 192.168.100.8;
        option domain-name "lug68.lan";
        option domain-name-servers 192.168.100.1;
        option routers 192.168.100.1;
        option broadcast-address 192.168.100.255;
}
On installera ensuite le paquet shorewall, qui va s'occuper de filtrer le trafic IP, avec une configuration basique mais
suffisante à la plupart des usagers.

Comme pour toute passerelle, il faudra fournir l'interface réseau WAN (vers l'extérieur/internet) et l'interface LAN (réseau interne) manuellement.

Mais comme nous sommes de gros "feignasses" au LUG68, nous avons ici écrit un petit script BASH, qui s'occupe de trouver les interfaces réseaux présentes sur votre machine, et de vous les afficher sous la forme d'une liste avec un numéro distinct en début de ligne.

Ainsi vous n'aurez plus qu'à rentrer les deux numéros correspondants respectivement aux interfaces WAN et LAN de votre réseau pour créer votre passerelle !

Contenu du script shorewall.sh, à exécuter avec les droits root :

Code : Tout sélectionner

#!/bin/bash

HAS_SHOREWALL=$(dpkg -l|grep " shorewall "|cut -d " " -f1)
HAS_DHCPD=$(dpkg -l|grep " isc-dhcp-server "|cut -d " " -f1)

if [ ! "$HAS_SHOREWALL" == "ii" ]; then
	apt-get install shorewall
fi
if [ ! "$HAS_DHCPD" == "ii" ]; then
	apt-get install isc-dhcp-server
fi

service shorewall stop
service isc-dhcp-server stop

echo -e "\nInterfaces disponibles :"
i=1
INTERFACES=$(ifconfig|cut -d' ' -f1|sed '/^$/d')
for interface in $INTERFACES; do
	echo -e "$i / $interface";
	i=$((i+1))
done

ARR=($INTERFACES)

echo -e ""
read -r -n 1 -p "Numéro interface WAN ? " NUMWAN
echo -e ""
read -r -n 1 -p "Numéro interface LAN ? " NUMLAN
echo -e "\n"

NUMWAN=$((NUMWAN-1))
NUMLAN=$((NUMLAN-1))

#echo -e "\nNUMWAN=$NUMWAN"
#echo -e "\nNUMLAN=$NUMLAN"

WAN=${ARR[$NUMWAN]};
LAN=${ARR[$NUMLAN]};

# pour le serveur local DHCPD
ifconfig $LAN 192.168.100.1/24

echo -e "WAN=$WAN"
echo -e "LAN=$LAN"

echo "
?FORMAT 2
net     $WAN            dhcp,tcpflags,nosmurfs,logmartians,sourceroute=0,routeback
loc     $LAN            nosmurfs,logmartians,sourceroute=0
" > /etc/shorewall/interfaces

echo "
fw	firewall
net	ipv4
loc	ipv4
" > /etc/shorewall/zones

echo "
$WAN $LAN
" > /etc/shorewall/masq

echo "
\$FW        all         ACCEPT
loc        \$FW         ACCEPT
loc        net         ACCEPT
net        all         DROP	info

# THE FOLLOWING POLICY MUST BE LAST
all        all         REJECT      info
" > /etc/shorewall/policy

ifconfig $LAN 192.168.100.1/24

service shorewall restart
service isc-dhcp-server restart

echo -e ""
sysctl -w net.ipv4.ip_forward=1
:1
Avatar de l’utilisateur
le Manchot Masqué
Administrateur du site
Messages : 719
Inscription : lun. 26 mai 2008, 21:05
Distribution : Debian, Ubuntu
Niveau : Moitié plein !
Localisation : Guebwiller

Re: Shorewall pour les paresseux !

Message par le Manchot Masqué »

6 ans sont passés (déjà...) depuis les scripts précédents, et ça a beaucoup bougé dans la pile réseau sous notre OS préféré. Il est temps de faire une petit MAJ...

Attention :
- il faut impérativement 2 interfaces réseau distinctes sur la machine, une vers la box en DHCP (WAN) et une vers le réseau local (LAN) avec une IP locale de votre choix à configurer en statique au démarrage, le plus simple étant de configurer les deux interfaces dans /etc/network/interfaces par exemple
- le script doit être exécuté sous root
- je n'ai pas encore eu le temps de tester en réunion info, donc pour l'instant, c'est donné "tel que" avec sûrement quelques petites choses à revoir...
- je ne m'occupe plus du DHCP dans cette version - à vous d'adapter si besoin...
- il y a maintenant 2 scripts !

Script apt.sh (sourcé par shorewall.sh plus loin) :

Code : Tout sélectionner

#!/bin/bash

apt_updated=0

update_apt() {
	if [ $apt_updated -eq 0 ]; then
		apt update
		if [ $? -eq 0 ]; then
			apt_updated=1
			return 0
		else
			echo "Impossible de mettre la base APT à jour - vérifiez votre réseau !"
			return 1
		fi
	fi
}

is_package_installed() {
	local package_name="$1"
	dpkg -s "$package_name" &> /dev/null
	if [ $? -eq 0 ]; then
		# Paquet installé
		return 0
	else
		# Paquet non installé
		return 1
	fi
}

is_package_configured() {
	local package_name="$1"
	if is_package_installed "$package_name"; then
		if dpkg -l | grep -q "^ii  $package_name "; then
			echo "Le paquet $package_name est installé et configuré."
			return 0
		else
			echo "Le paquet $package_name est installé mais pas entièrement configuré."
			return 1
		fi
	else
		echo "Le paquet $package_name n'est pas installé."
		return 2
	fi
}

install_package() {
	local package_name="$1"
	if ! is_package_configured "$package_name"; then
		update_apt || exit
		echo "Installation du paquet $package_name..."
		apt install -y "$package_name" &> /dev/null
		if ! is_package_configured "$package_name"; then
			echo "L'installation du paquet $package_name a échoué..."
			return 1
		else       	
			# Le paquet $package_name a été installé.
			return 0
		fi
	else
		# Le paquet $package_name est déjà installé.
		return 0
	fi
}
Script shorewall.sh (à mettre dans le même dossier) ;

Code : Tout sélectionner

#!/bin/bash

my_dir="$(dirname "$0")"

source "$my_dir/apt.sh"

for package_name in shorewall ipset; do
	if ! install_package "package_name"; then
		echo "Impossible de continuer..."
		exit 1
	fi
done

IFS=$'\n'
service shorewall stop

echo -e "\nInterfaces disponibles :"
i=1
interfaces=$(ip -4 -brief address show|grep UP)
for interface in $interfaces; do
	echo "$i / $interface";
	i=$((i+1))
done

interfaces_array=($interfaces)

echo ""
read -r -n 1 -p "Numéro interface WAN ? " numwan
echo ""
read -r -n 1 -p "Numéro interface LAN ? " numlan
echo -e "\n"

numwan=$((numwan-1))
numlan=$((numlan-1))

echo "numwan=$numwan"
echo "numlan=$numlan"

wan=${interfaces_array[$numwan]};
lan=${interfaces_array[$numlan]};

echo "WAN=$wan"
echo "LAN=$lan"

echo "
?FORMAT 2
net     externe            dhcp,tcpflags,nosmurfs,routefilter,logmartians,sourceroute=0,routeback,physical=$wan
loc     interne            tcpflags,nosmurfs,routefilter,logmartians,physical=$lan
" > /etc/shorewall/interfaces

echo "
fw	firewall
net	ipv4
loc	ipv4
" > /etc/shorewall/zones

echo "
MASQUERADE loc net
" > /etc/shorewall/snat

echo "
\$FW        all         ACCEPT
loc        all         ACCEPT
net        all         DROP	info

# THE FOLLOWING POLICY MUST BE LAST
all        all         REJECT      info
" > /etc/shorewall/policy

sysctl -w net.ipv4.ip_forward=1
service shorewall restart
Répondre