SwordArMor

Avoir une sorte de flowspec sous linux avec ipset

Internet étant truffé de machines plus ou moins vérolées qui scannent le monde entier, j’ai eu envie de les bloquer à l’échelle complète de mon réseau ; un genre de fail2ban2bgp.
Avec netfilter il n’existe pas de mécanisme pour avoir des règles dynamiques, et donc pas de moyen d’avoir facilement des règles flowspec dans son firewall. Par contre, il est possible d’utiliser un ipset comme source dans une règle. Et avec exabgp il est possible d’utiliser un script shell pour transformer une annonce bgp en ipset. J’ai donc utilisé ceci pour implémenter une sorte de flowspec sur des routeurs soft linux.

Voici le schéma global de la solution que j’ai mise en place :

  • Envoyer les logs à une machine (avec rsyslog)

  • Les faire traiter par fail2ban

  • Lui faire créer des routes locales sur la machine (avec une banaction)

  • Annoncer ces routes en BGP (avec bird)

  • Envoyer ces routes à tous mes routeurs (avec des RRs)

  • Transformer ces routes en règles netfilter (avec exabgp, ipset et un script shell)

À noter : pour me besoin je n’ai besoin que de bloquer des IPs sources, je n’ai donc pas du tout regardé pour aller plus finement dans le filtrage (au port, à la taille de paquet, etc.). Je n’ai pas non plus implémenté la suppression des routes en cas de withdrawn bgp, parce que j’ai envie que les règles soient persistantes. J’ai utilisé ipset pour pouvoir plus facilement le mettre en place si besoin, mais on pourrait simplifier en écrivant directement des règles iptables. Je me suis également contenté d’IPv4, parce que je n’ai vu personne pourrir mes logs en IPv6 pour le moment, mais le code est très facilement adaptable.

Je ne vais pas aborder les configurations rsyslog et fail2ban ici, ce n’est pas mon but.

La récupération des routes générées par fail2ban se passent très classiquement avec de la conf bird relativement simple. J’ai un filtre d’import sur le protocol kernel qui ajoute une communauté sur les routes unreachables, et un filtre d’export bgp qui utilise cette communauté. Cette machine là peere avec mes RRs pour que les routes soient redistribuées dans mon réseau.

protocol kernel kernel_grt_ipv4 {
	learn;
	persist;

	ipv4 {
		import filter {
			if (dest = RTD_UNREACHABLE) then {
				bgp_large_community.add((208627,666,666));
				accept;
			}
			else {
				reject;
			}
		};
		export none;
	};
}

protocol bgp ibgp_core02_ipv4 from t_ibgp_ipv4 {
	neighbor 10.0.4.4 as 208627;

	ipv4 {
		import none;
		export filter {
			if (bgp_large_community ~ [(208627,666,666)]) then {
				accept;
			}
			else {
				reject;
			}
		};
	};
}

Ensuite, sur les routeurs j’envoie les routes avec celle communauté sur un exabgp en localhost. La version que j’utilise (4.2.17) a un bug, toutes les commandes de cli finissent en timeout… Donc si vous comptez utiliser un truc du genre en prod, tentez les versions plus anciennes ou faites chier les devs pour qu’ils pissent du code utilisable. Quand j’ai remonté le souci, on m’a dit d’utiliser master, ce que je n’ai pas envie de faire, ça me semble plus sain de vivre avec ce bug pour le moment.

# /etc/bird.conf
protocol bgp bgp_drop_v4 from iBGP_IPv4 {
	description "locahost exabgp";
	neighbor 127.0.0.1 port 1179 as myasn;
	local 127.0.0.1;
	rr client;

	ipv4 {
		import none;
		export filter {
			if ((208627,666,666) ~ bgp_large_community) then {
				accept;
			}
			else {
				reject;
			}
		};
	};
}

# /etc/exabgp/exabgp.env
[exabgp.tcp]
bind=127.0.0.1
port=1179

# /etc/exabgp/exabgp.conf
process acl {
	run /usr/local/libexec/acl.sh;
	encoder text;
}

template {
	neighbor fw_v4 {
		family {
			ipv4 unicast;
		}
		api speaking {
			processes [ acl ];
			receive {
				parsed;
				update;
			}
		}
	}
}

neighbor 127.0.0.1 {
	inherit fw_v4;
	router-id 127.0.0.1;
	local-address 127.0.0.1;
	local-as 208627;
	peer-as 208627;
}

# /usr/local/libexec/acl.sh
#!/bin/sh

exec 2>&1> /tmp/exa

while read stdin; do
	net="$(echo $stdin | awk '/announced/ { print $6 }')"
	if [ -n "${net}" ]; then
		neigh="$(echo $stdin | awk '/announced/ { print $2 }')"
		if [ "${neigh}" = '127.0.0.1' ]; then
			sudo ipset add firewall_v4 $net
		elif [ "${neigh}" = '::1' ]; then
			sudo ipset add firewall_v6 $net
		fi
	fi
done < /dev/stdin

J’ai hardcodé le nom de l’ipset utilisé parce que ce code n’est pas voué à être générique, mais vous pouvez lancer le script avec des arguements depuis exabgp. J’utilise sudo parce l’utilisateur exabgp n’a pas le droit de lancer ipset par défaut (ce qui se comprend assez bien).
Le code part du principe que l’ipset existe déjà (ipset create firewall_v4 hash:net family inet counters).

Ensuite, dans iptables j’utilise l’ipset ainsi peuplé pour bloquer les IPs qui sont dedans

iptables -A INPUT -m set --match-set firewall_v4 src -j DROP
iptables -A FORWARD -m set --match-set firewall_v4 src -j DROP
ip6tables -A INPUT -m set --match-set firewall_v6 src -j DROP
ip6tables -A FORWARD -m set --match-set firewall_v6 src -j DROP

Ce qui apparaît sous la forme DROP all -- * * 0.0.0.0/0 0.0.0.0/0 match-set firewall_v4 src dans iptables -L -n -v

« Et voilà », je bloque les IPs sur tout mon réseau grâce à ça, et je ne perds pas toutes les règles en cas de flap bgp.

Remonter le constructeur et le modèle d’un serveur en SNMP

Par défaut, la configuration de net-snmpd ne remonte pas le constructeur et le modèle d’un serveur, ce qui fait que LibreNMS (ou Observium) vont afficher « Generic x86 64-bit » là où on pourrait avoir « Dell Inc. [PowerEdge R510] » ou « HP [ProLiant DL320e Gen8] », ce qui rend plus facile l’inventorisation …

Lire la suite

Installer son instance mastodon sous Gentoo

Suite à l’annonce de Valère d’arrêter les services hostux, et donc l’instance mastodon, j’ai décidé de monter la mienne. La principale raison est que je n’ai pas trouvé d’autre instance en Europe avec un TLSA. Je ne vais pas ici expliquer toute l’installation …

Lire la suite

Désactivation de la souris pour urxvt et terminator (et autres terminaux basés sur VTE)

Depuis quelques temps, le support de la souris est activé par défaut sur certaines applications CLI, notamment vim. Ceci empêche d’utiliser le presse-papier « clic milieu » et ne sert en outre à rien, c’est donc fort ennuyeux.

J’ai un peu cherché comment désactiver le support de la souris …

Lire la suite

Vérification RPKI avec routinator, bird et IOS-XE

Quand on fait partie de la DFZ, on peut en gros annoncer n’importe quel préfixe tant que ça passe les filtres de nos pairs, et on est censé leur faire plus ou moins confiance. Sauf que croire encore à ce système de la confiance en 2020, c’est aussi …

Lire la suite

Remplir la table SNMP ifAlias sous Linux

Il m’arrive encore de jouer avec des routeurs soft, et comme à chaque fois il faut bricoler pour avoir ce que l’on veut, ici avoir une table ifAlias correcte. À une époque je le faisais avec FreeBSD, et j’avais trouvé la parade en utilisant un proxy vers …

Lire la suite

Afficher correctement les AS 32 bits avec mtr

mtr est un outil très pratique qui permet de faire un traceroute, mais en mieux. La sortie est beaucoup plus lisible, et ça utilise de l’ICMP par défaut (au lieu de l’UDP sous Linux/*BSD). Seulement, dans les anciennes versions, les AS 32 bits sont mal gérés : ils …

Lire la suite

Sauvegarder la configuration de ses switches et routeurs avec expect

Si vous ne connaissez pas expect, c’est un outil qui permet d’écrire des scripts en TCL qui iront interagir avec telnet/ssh et d’autres trucs du genre, sans que vous ayez à le faire vous même. C’est donc très pratique pour écrire des scripts qui seront …

Lire la suite

Utiliser socat pour contourner les limiations SSL d’un navigateur moderne

Depuis quelque temps, les navigateurs bloquent les requêtes SSL/TLS utilisant des versions de protocoles et suites cryptographiques jugées trop faibles.

Cependant, on peut avoir besoin de se connecter à de vieux équipements qui eux ne supportent que ces vielles versions ; en l’occurrence, un PDU. En théorie, ils supportent …

Lire la suite

Proxy SNMP pour une table précise (ifAlias)

État des lieux

Sous FreeBSD nous avons le choix entre deux implémentations SNMP : bsnmp et le classique net-snmp. Le premier a des soucis sur les modèles de CPU et ne remonte pas les IPv6 des interfaces, alors que le second ne remonte pas la description des interfaces.
En clair, on …

Lire la suite

Page 1 / 5 »