Shorewall

Updated 21 Février 2020

Shorewall

Shorewall or, more precisely, Shoreline Firewall is a firewall configuration tool. Techniquement, il s'agit d'un add-on de sous-système de noyau Netfilter (iptables/ipchains) qui implémente des méthodes de configuration simplifiées. Il fournit un niveau d'abstraction plus élevé pour la description des règles de pare-feu.

Installing Shorewall

In Calculate Linux Desktop and Calculate Directory Server, Shorewall is included in the basic distribution. On other Calculate flavours, you have to install it:

emerge -a net-firewall/shorewall

Note

To include examples and documentation, install the package with the doc USE on:

USE="doc" emerge -a net-firewall/shorewall

To get more firewall functionality, try these:

  • net-firewall/xtables-addons+, extensions not added to kernel/iptables (to define p2p traffic)
  • net-misc/l7-filter-userspace, p classification par contenu (pour détecter le trafic par le contenu)
  • net-libs/gupnp-igd, pour la fonctionnalité UPnP

To install them, run:

emerge -a net-firewall/xtables-addons net-misc/l7-filter-userspace net-libs/gupnp-igd

Shorewall configuration

Shorewall is not a daemon, i.e. it does not operate continuously. The rules are stored in text files. When shorewall starts, it reads its configuration files and converts them into settings that ipchains/iptables can understand, after which these firewall settings take effect until the operating system restarts.

  • Zones Shorewall considers the network in which it operates as a set of zones. This is why you need to define one or more zones in the /etc/shorewall/+zones when you start configuring Shorewall. Zones are individual IP addresses of hosts, subnets, or incoming/outgoing packets for a specific interface. They can refer to an external network, an internal network, or a [DMZ] (https://en.wikipedia.org/wiki/DMZ_(computing)) network.
  • Les zones sont reconnues soit par l'interface réseau qui leur est associée, telle que définie dans /etc/shorewall/ interfaces, soit par l'adresse IP du sous-réseau spécifié dans /etc/shorewall/hosts. Une zone peut être associée à plusieurs interfaces, ainsi qu'une interface peut être associée à plusieurs zones. Notez que Shorewall considère le système de pare-feu comme sa propre zone.
  • Actions Une fois les zones définies, vous devez définir l'action par défaut dans /etc/shorewall/+policy+ (telle que ACCEPT ou DROP), à appliquer au trafic entre chaque zone source et zone destination.
  • Politiques Enfin, le fichier /etc/shorewall/rules contient des exceptions de politiques qui permettent l'accès à des ports spécifiques, etc.

Zone declaration

Pour déclarer une zone, vous devez éditer le fichier /etc/shorewall/zones. Pour déclarer une zone, vous devez spécifier son nom (ZONE) et son type (TYPE) (attention, "firewall" est la zone firewall, tandis que "ipv4" est la zone standard).

The order in which zones are described is important because it is in this order that iptables chains will be called to check for packets forwarded from one zone to another. In other words, a packet addressed to the firewall is first checked for net, and then for loc~, as shown in the example above. This rule is important if one zone includes the other. For example, you can create a "phone" zone within loc, which would include several IP addresses from ~loc. Now, if you describe ~loc~ first and then "phone", the policy described for "phone" will never be executed, because the traffic will go to ~loc~ chains. This problem can be solved by specifying the "phone" zone as a subzone of loc ("phone:loc ipv4").

Voici un exemple de configuration pour deux cartes réseau :

  • The firewall (fw), firewall
  • The Internet connection (net) uses ipv4
  • The local network (loc) uses ipv4

/etc/shorewall/zones

#ZONE   #TYPE
fw      firewall
net     ipv4
loc     ipv4

To learn more about how to edit this file, type man shorewall-zones.

Relier l'interface à une zone spécifique

To assign the interface to a zone, edit the /etc/shorewall/interfaces file. You can also define in this file which filters to use when processing incoming packets.

Pour affecter une interface à une certaine zone, vous devez spécifier le nom de cette zone (ZONE), le nom de l'interface (INTERFACE), l'adresse de diffusion (BROADCAST) ("detect" est la valeur recommandée), et, si nécessaire, lister les filtres (OPTIONS).

Voici un exemple avec deux cartes réseau.

In the file, specify that eth0~ is for Internet access (net), while eth1~ stands for the local network (~loc). The filters for incoming traffic are tcpflags, routefilter, nosmurfs, logmartians.

  • tcpflags means that incoming packets are checked for wrong combination of TCP flags;
  • routefilter ajoute un contrôle anti-spoofing.
  • nosmrfs évite de sauter un paquet avec une adresse de diffusion sortante.
  • logmartians représente l'enregistrement des paquets contenant une adresse de sortie impossible.

/etc/shorewall/interfaces

?FORMAT 2
#ZONE       INTERFACE       OPTIONS
net         eth0            tcpflags,routefilter,nosmurfs,logmartians
loc         eth1            tcpflags,routefilter,nosmurfs,logmartians

To learn more about how to edit this file, type man shorewall-interfaces.

Relier les adresses IP à une zone spécifique

Pour lier des adresses IP ou des sous-réseaux à la zone, éditez le fichier /etc/shorewall/hosts. To assign hosts/subnetworks to a zone, you must provide a zone name (ZONE) and a network interface with its subnet or IP addresses (HOST).

This is an example of a "vpn" zone definition. The current gateway sets up a tunnel with another gateway that is connected to segment ~10.0.0.0/24~.

/etc/shorewall/hosts

#ZONE       HOSTS
vpn         eth0:10.0.0.0/24

This is an example of allocating IP addresses for phones (IPs ranging from ~192.168.0.60~ to ~192.168.0.80~~) to a separate "phone" zone. Cela peut être pratique pour les politiques de gestion de l'accès, et non pour les exceptions.

/etc/shorewall/hosts

#ZONE       HOSTS
phone       eth1:192.168.0.60-192.168.0.80

To learn more about how to edit this file, type man shorewall-hosts.

Définition du comportement par défaut des paquets

L'action ou la stratégie par défaut appliquée au trafic entre chaque zone source et la zone de destination est spécifiée dans le fichier /etc/shorewall/policy . A rule is described as follows: source zone (SOURCE), destination zone (DEST), default rule (POLICY) (DROP, ACCEPT, REJECT) and, if necessary, the logging level (e.g. info).

La stratégie prend en compte les paquets qui créent de nouvelles connexions. * RELATED / ESTABLISHED * Les paquets (paquets de la connexion établie) sont ignorés par défaut.

Par exemple, définissez les politiques suivantes:

  1. activer la connexion Internet dans le réseau local
  2. autoriser l'accès à partir du pare-feu n'importe où
  3. supprimer tous les paquets provenant d'Internet et effectuer la journalisation
  4. rejeter d'autres paquets avec un message d'erreur et faire la journalisation

/etc/shorewall/policy

#SOURCE     DEST    POLICY      LOGLEVEL
loc         net     ACCEPT
$FW         all     ACCEPT
net         all     DROP        info
all         all     REJECT      info

To learn more about how to edit this file, type man shorewall-policy.

Ajout du masquage

Le masquage d'adresse IP est une méthode de remappage d'un espace d'adresse IP dans un autre en substituant dynamiquement l'adresse de l'expéditeur, en fonction de l'adresse attribuée à l'interface.

Le NAT dynamique (Masquerading) et le NAT source (SNAT) sont définis dans в /etc/shorewall/snat.

To add masquerading to a specific interface, you have to define it (INTERFACE:DEST), then indicate the subnetwork for which this masquerading (SOURCE) and outgoing address (ADDRESS) for SNAT will be used. Si l'adresse de sortie n'est pas spécifiée, le NAT dynamique sera utilisé.

For example, for all packets sent via eth0 from your internal network (~192.168.0.0/24~~), you should use SNAT (~24.56.78.21~).

/etc/shorewall/snat

#ACTION             SOURCE              DEST
SNAT(24.56.78.21)   192.168.0.0/24      eth0

If necessary, you can exclude NAT when sending packets to specific subnets, for example, for ipsec tunnelling.

For example, to disable NAT when sending a packet to subnet ~192.168.2.0/24~~:

/etc/shorewall/snat

#ACTION             SOURCE              DEST
SNAT(24.56.78.21)   192.168.0.0/24      eth0:!192.168.2.0/24

To learn more about how to edit this file, type man shorewall-masq.

Ajout de règles

Vous devez définir des règles qui décrivent les exceptions aux politiques appliquées au trafic. Celles-ci sont contenues dans le fichier /etc/shorewall/rules.

This file contains three sections: RELATED, ESTABLISHED, NEW, which stand for three connection statuses. Les conditions d'état sont définies par le critère conntrack, qui permet de classer les paquets en fonction de leur relation aux connexions. L'état NOUVEAU permet de sélectionner uniquement les paquets qui ouvrent de nouvelles connexions, l'état ÉTABLI représente les paquets appartenant aux connexions établies, et l'état RELATÉ correspond aux paquets qui ouvrent de nouvelles connexions qui sont logiquement liées à celles déjà établies (par exemple, connexion de données en mode FTP passif). Le statut INVALID signifie qu'il est impossible de déterminer la connexion à laquelle le paquet appartient (INVALID est également inclus dans la section NEW). Comme expliqué précédemment, la politique décrit le comportement de la section NOUVELLE, tandis que ACCEPTER est appliqué par défaut aux sections RELATIVES et ÉTABLIES.

Les exemples suivants sont écrits dans la section NOUVEAU .

Refuser l'accès à Internet à partir de certains nœuds

/etc/shorewall/rules

#ACTION     SOURCE                          DEST
REJECT      loc:10.0.0.100-10.0.0.254       net

Port d'accès avant (DNAT) 80

/etc/shorewall/rules

#ACTION     SOURCE      DEST
HTTP/DNAT   net         loc:10.0.0.5

Si cette règle doit également s'appliquer aux paquets envoyés du LAN vers l'IP externe de la passerelle, éditez les fichiers "masq" et "interfaces".
In "interfaces", add the routeback option for loc~, allowing the router to send packets from one local network to another.

/etc/shorewall/rules

#ACTION     SOURCE      DEST        PROTO
loc         eth1        detect      tcpflags,routeback

Add a SNAT rule to "masq" so that a packet for ~10.0.0.5 be sent from the IP of the gateway (~10.0.0.1 is the internal gateway IP).

/etc/shorewall/rules

#ACTION       SOURCE    DEST
eth1:10.0.0.5 eth1      10.0.0.1

To the rule added above add DNAT in "rules", so that all packets from the local network be sent to 10.0.0.5 (~1.2.3.4~~ , i.e. the external IP of the gateway must be placed in ORIGINAL DEST).

/etc/shorewall/rules

#ACTION     SOURCE      DEST            PROTO       DPORT      SPORT
HTTP/DNAT   loc         loc:10.0.0.5    -           -          1.2.3.4

Transfert des ports 222 à 22

/etc/shorewall/rules

#ACTION     SOURCE      DEST                PROTO       DPORT
DNAT        net         loc:10.0.0.5:22     tcp         222

Transférer le port LDAP

For example, to enable remote replication for unix, samba, and mail services to the Calculate Directory Server:

/etc/shorewall/rules

#ACTION     SOURCE      DEST
LDAP/DNAT   net         loc:10.0.0.5

Dans l'exemple du port 80, une macro est utilisée, qui est un modèle de règle(s). Les macros échantillons sont stockées dans / usr / share / shorewall et appelées macro.macroname. Contenu des macros HTTP

/usr/share/shorewall/macro.HTTP

#ACTION     SOURCE      DEST        PROTO       DPORT
PARAM       -           -           tcp         80

Selon le contenu de la macro, son utilisation est équivalente à:

/etc/shorewall/rules

#ACTION     SOURCE      DEST            PROTO       DPORT
DNAT        net         loc:10.0.0.5    tcp         80

L'émetteur et le récepteur du paquet peuvent être définis comme suit.

Exemple Description
dmz:192.168.2.2 noeud 192.168.2.2 dans la zone DMZ
réseau:155.186.235.0/24 sous-réseau 155.186.235.0/24 sur Internet
loc:192.168.1.1,192.168.1.2 les nœuds 192.168.1.1.1 et 192.168.1.2 du réseau local
loc:~00-A0-C9-15-39-78 dans le réseau local avec adresse MAC 00C939 : 78
réseau:192.0.2.11-192.0.2.17 de 192.0.2.11 à 192.0.2.17 sur Internet
réseau:!192.0.2.11-192.0.2.17 tous les nœuds sur Internet, à l'exception de ceux de 192.0.2.11 à 192.0.2.17
réseau:155.186.235.0/24!155.186.235.16/28 sous-réseau 155.186.235.0/24 sur Internet, à l'exception du 155.186.235.16/28

To learn more about how to edit this file, type man shorewall-rules.

Détection de tunnels de réseau

Pour que Shorewall ne réinitialise pas le trafic crypté, le tunnel doit être décrit dans /etc/shorewall/tunnels . Ce fichier décrit les règles de transmission du trafic encapsulé (généralement crypté) entre Shorewall et une passerelle distante.

The description contains the type of tunnel (TYPE), the original zone (ZONE) and the address of the remote gateway (GATEWAY).

As an example, define an IPSEC tunnel (ESP) between the current gateway and the remote one (at ~4.33.99.124~).

/etc/shorewall/tunnels

#TYPE           ZONE        GATEWAY
ipsec:esp       net         4.33.99.124

To learn more about how to edit this file, type man shorewall-tunnels.

Ajouter Shorewall au démarrage automatique

Pour que Shorewall démarre lorsque la passerelle est démarrée, exécutez:

rc-update add shorewall boot

Configuration de la gestion de la bande passante

L'organisation de la file d'attente (file d'attente) détermine comment les données sont envoyées. Il est important de comprendre que seul le débit de transmission des données envoyées peut être géré.

As the Internet appears now, we cannot control the amount of incoming traffic. C'est un peu comme une boîte aux lettres installée à l'intérieur de votre porte: vous ne pouvez pas choisir la quantité de courrier que vous recevez, à moins que vous ne parliez à tous ceux qui vous écrivent.

However, the Internet mostly operates based on the TCP/IP protocol, which has a few useful features. TCP/IP ignore la bande passante du réseau entre deux hôtes, de sorte qu'il envoie les données de plus en plus vite (ce qu'on appelle "slow start"). En cas de surcharge, les paquets sont perdus et la connexion devient lente. (C'est un peu plus compliqué - et plus intelligent que, comme nous l'expliquerons plus loin.)

Les disciplines de traitement des files d'attente définissent la façon dont les données sont transmises. Les disciplines peuvent être "sans classe" ou "classé". Ils reçoivent généralement les données, les réordonnent, les retardent ou les détruisent. Les disciplines Classées permettent d'utiliser des classes pour un type de trafic spécifique. Par conséquent, il existe une discipline racine pour l'interface donnée qui est soit classée, soit sans classe. Une discipline de classe, à son tour, contient plusieurs classes qui vous permettent de gérer le trafic.

Pour gérer le trafic, il est nécessaire de définir la discipline fondamentale appliquée à l'appareil.

Le trafic entrant est introduit dans la discipline entrante, qui peut contenir un certain nombre de filtres pour traiter les paquets. Celles-ci peuvent donc être jetées, perdues, filtrées. This is called policing.
Cela se produit assez tôt dans le temps, avant que le paquet ne soit transmis pour un traitement ultérieur, afin de diminuer l'utilisation du CPU.

Si un paquet passe cette étape en toute sécurité, il peut être transféré soit vers des applications locales (dans ce cas, il se retrouve dans la pile IP pour un traitement ultérieur), soit vers le réseau via le classificateur sortant vers un autre noeud du réseau. Les applications utilisateur peuvent également envoyer des données au réseau, qui sont également transmises par le classificateur sortant. Le classificateur sortant divise le trafic en files d'attente, chacune ayant sa propre discipline. Par défaut, pfifo_fast est la seule file d'attente sortante. C'est ce qu'on appelle la "file d'attente".

Une fois dans une file d'attente, le paquet attend que le noyau le transmette à l'interface réseau. C'est ce qu'on appelle "aller chercher dans la file d'attente".

Activer la gestion du trafic sur une interface

Pour activer la gestion du trafic, éditez le fichier /etc/shorewall/tcdevices.

Ce fichier décrit la largeur de canal de l'interface sur laquelle vous souhaitez utiliser la gestion de la bande passante. La largeur du canal peut être mesurée en kbps, mbps, kbit, mbit et bps.

IN-BANDWIDTH définit la largeur de bande du signal entrant pour l'interface. Keep in mind that you cannot manage incoming traffic, because it has already been received. What you can do is limit the allowed traffic. Then packets that exceed this value will be dumped. If you do not want to dump, set value to 0 or -.

OUT-BANDWIDTH définit la largeur de bande du signal de sortie de l'interface. Cette vitesse maximale est utilisée comme "pleine" lors de la classification du trafic. The incoming traffic that exceeds this value will be dumped.

Si Shorewall est installé sur une passerelle sur laquelle il est important de gérer le trafic de transit, il est nécessaire de ne pas spécifier le trafic entrant pour les deux interfaces, car il peut y avoir des problèmes plus tard dans la gestion de la bande passante.

Here is how to set a channel of 10 mbit at the gateway (incoming traffic from the Internet is managed as outcoming to the local network):

/etc/shorewall/tcdevices

#NUMBER:        IN-BANDWITH     OUT-BANDWIDTH
eth0            -               10mbit
eth1            -               10mbit

To learn more about how to edit this file, type man shorewall-tcdevices.

Définition de la classe de trafic

Les classes sont définies dans /etc/shorewall/tcclasses. Chaque ligne définit une classe de trafic, à savoir : l'INTERFACE pour laquelle la classe est créée, le MARQUE pour définir le trafic de la classe, le TAUX de trafic garanti, le débit souhaité (CEIL), la PRIORITÉ et les OPTIONS supplémentaires.

The marker will be used when setting the rules (tcrules) for traffic belonging to a specific class. The guaranteed and desired bandwidth can be specified as an absolute value or compared to the total bandwidth provided for the interface (e.g. 2*full/3, two thirds of the channel). _ Largeur de bande garantie_ signifie qu'aux charges de pointe, ce type de trafic aura au moins la largeur de bande spécifiée, _ largeur de bande désirée_ signifie que la largeur de bande pour ce type de trafic ne dépassera pas la valeur spécifiée. Plus la valeur de priorité est basse, plus la priorité du trafic est élevée. Le trafic de priorité inférieure ne sera pas traité tant que le trafic de priorité supérieure n'aura pas été traité. Les autres paramètres sont séparés par des virgules et peuvent prendre les valeurs suivantes:

  • default est la classe par défaut. Tout le trafic non marqué sera mis ici.
  • tos=0xvalue[/0xmask] means traffic classification based on TOS .
  • tos-tosname establishes TOS traffic classification based on five standard values
  • tcp-ack - pour la détection des paquets tcp ask dont la taille est inférieure à 64 octets
  • pfifo tells to use the pfifo discipline instead of SFQ for the class.
  • Limite = nombre - spécifie le nombre maximum de paquets qui peuvent être placés dans cette file d'attente.

Pour un exemple de classification, voir ci-dessous:

  • 100-180kbit for TOS byte 68/b8 traffic (EF and AFF3-1 VOIP traffic)
  • Le trafic interactif, les acks TCP et tout paquet marqué comme 2 auront un quart garanti de la bande passante totale et pourront prendre le canal entier.
  • Le trafic non classifié et les paquets marqués 3 auront un quart garanti de la bande passante totale et pourront prendre le canal entier.
  • Les paquets marqués 4 ont la priorité la plus basse, ils sont garantis 1/8 de la bande passante et peuvent prendre 80% du canal.

/etc/shorewall/tcclasses

#INTERFACE  MARK    RATE        CEIL        PRIO        OPTIONS
eth0        1       100kbit     180kbit     1           tos=0x68/0xfc,tos=0xb8/0xfc
eth0        2       full/4      full        2           tcp-ack,tos-minimize-delay
eth0        3       full/4      full        3           default
eth0        4       full/8      full*8/10   4

To learn more about how to edit this file, type man shorewall-tcclasses.

Configuration de marquage du trafic

Traffic marking can be configured by editing /etc/shorewall/mangle. Grâce au marquage, les entrées de ce fichier déterminent la classe à laquelle le paquet appartient. Les zones définissant les conditions marquées sont les suivantes:

  • ACTION
  • SOURCE représente l'expéditeur du paquet.
  • DEST représente le destinataire du paquet.
  • PROTO représente le protocole de connexion.
  • DEST PORT représente le(s) port(s) du destinataire.
  • SOURCE PORT représente le(s) port(s) de l'expéditeur.
  • USER is the user who owns the process that created the packet (it makes sense only for traffic originating from the firewall itself).
  • TEST représente le marqueur défini.
  • LENGTH représente la taille du paquet.
  • TOS stands for the TOS byte value
  • CONNBYTES est l'abréviation de l'ensemble des données de connexion transmises.
  • HELPER is the name of the Netfiler helper module, e.g. to define ftp, sip, amanda, etc.

La marque est définie comme suit:

  • "MARK(value)[:{C|F|P|T|CF|CP|CT}]"
    "F" - marked in the FORWARD chain
    "P" - marked in the PREROUTING chain
    "T" - marked in the POSTROUTING chain
    "CF" - marked in the FORWARD chain
    "CP" - marked in the PREROUTING chain
    "CT" - marked in the POSTROUTING chain
  • "RESTORE[/mask]" - restaure la marque du paquet à partir de la marque de connexion
  • "SAVE[/mask]" - sauvegarde la marque de paquet sur la marque de connexion
  • CONTINUER - ne pas traiter les règles suivantes dans la table de marquage

Exemple:

  • All GRE packets (protocol 47), that were not created in the firewall system and with target IP 155.186.235.151 must be marked as 1.
  • All SSH packets coming from 192.168.1.0/24 and going to 155.186.235.151 must be marked as 2.
  • All P2P packets are to be marked as 4.

/etc/shorewall/mangle

#ACTION         SOURCE          DEST            PROTO       DPORT       SPORT    USER      TEST
MARK(1):T       0.0.0.0/0       155.182.235.151 47
MARK(2):T       192.168.1.0/24  155.182.235.151 tcp         22
RESTORE         0.0.0.0/0       0.0.0.0/0       all         -           -        -         0
CONTINUE        0.0.0.0/0       0.0.0.0/0       all         -           -        -         !0
MARK(4):T       0.0.0.0/0       0.0.0.0/0       ipp2p:all
SAVE            0.0.0.0/0       0.0.0.0/0       all         -           -        -         !0

Ces quatre dernières règles signifient ce qui suit:

Si le paquet n'a pas été classé (marqué comme 0), copiez la marque de connexion sur la marque de paquet. Si la marque du paquet est déjà définie, aucune autre action n'est nécessaire. Si le paquet est P2P, définissez la marque du paquet tom 4. Si la marque du paquet est définie, enregistrez-la comme marque de connexion.

To learn more about how to edit this file, type man shorewall-tcrules.

Exemples de configuration

Example of firewall configuration with VPN

Imagine that below is your network:

Example of configuration with VPN

  • computers in the internal network have IPs ~192.168.1.0/24~
  • a Calculate Directory Server, connected to the internal network at eth1 with the IP address set 192.168.1.1 and with Internet access at eth0 with the IP address set ~1.2.3.4~ (gateway)
  • OpenVPN or WireGuard server with network 192.168.20.0/24

First define the necessary zones: net for Internet, loc for local network, fw for firewall, vpn for VPN:

/etc/shorewall/zones

#ZONE       TYPE
fw          firewall
net         ipv4
loc         ipv4
vpn         ipv4

Now define net as served by the eth0 interface, loc~ as served by eth1, ~vpn as served by ~tun0~. The incoming traffic will be filtered on both network interfaces with tcpflags, routefilter, nosmurfs, and logmartians:

/etc/shorewall/interfaces

?FORMAT 2
#ZONE       INTERFACE       OPTIONS
net         eth0            tcpflags,nosmurfs,routefilter,logmartians
loc         eth1            tcpflags,nosmurfs,routefilter,logmartians
vpn         tun0
#vpn        wg0

Describe the default rules, or policies for transport through the gateway: the local network (~loc) and gateway ($FW~) are allowed access to all zones, packets from the network (~net) are dumped, the REJECT rule with logging is applied to the rest:

/etc/shorewall/policy

#SOURCE     DEST        POLICY          LOGLEVEL
loc         all         ACCEPT
vpn         all         ACCEPT
$FW         all         ACCEPT
net         all         DROP
all         all         REJECT          info

Add masks for the local network packages going to the Internet via VPN:

/etc/shorewall/snat

#ACTION         SOURCE              DEST
SNAT(1.2.3.4)   192.168.1.0/24      eth0
SNAT(1.2.3.4)   192.168.20.0/24     eth0

Describe a OpenVPN tunnel, associating it to the vpn zone:

/etc/shorewall/tunnels

#TYPE                   ZONE            GATEWAY                 GATEWAY_ZONE
openvpnserver:udp       net             0.0.0.0/0               vpn

Or else describe a WireGuard tunnel, associating it to the vpn zone as well:

/etc/shorewall/tunnels

#TYPE                   ZONE            GATEWAY                 GATEWAY_ZONE
openvpnserver:udp:51820 net             0.0.0.0/0               vpn

The gateway providing Internet access to the local network is ready to use. Add some rules:

  • autoriser les pings de passerelle à partir d'Internet
  • allow remote SSH connection to the gateway

/etc/shorewall/rules

?SECTION NEW
#ACTION         SOURCE                              DEST
Ping/ACCEPT     net                                 fw
SSH/ACCEPT      net                                 fw

Enable IP forwarding, TCP Clamp MSS and shorewall startup:

/etc/shorewall/shorewall.conf

...
IP_FORWARDING=Yes
CLAMPMSS=Yes
STARTUP_ENABLED=Yes

Configuration de la passerelle

Imagine that below is your network:

exemple de configuration de la passerelle

  • computers in the internal network have IPs ~192.168.1.0/24~
  • a Calculate Directory Server, connected to the internal network at eth1 with the IP address set 192.168.1.1 and with Internet access at eth0 with the IP address set ~1.2.3.4~ (gateway)
  • the local network has a mail server, 192.168.1.10

Définissez d'abord les zones nécessaires:'net' pour Internet,'loc' pour le réseau local,'fw' pour CDS :

/etc/shorewall/zones

#ZONE       TYPE
fw          firewall
net         ipv4
loc         ipv4

Now associate net with the eth0 interface and loc with the eth1 interface. The incoming traffic will be filtered on both network interfaces with tcpflags, routefilter, nosmurfs, and logmartians:

/etc/shorewall/interfaces

?FORMAT 2
#ZONE       INTERFACE       OPTIONS
net         eth0            tcpflags,nosmurfs,routefilter,logmartians
loc         eth1            tcpflags,nosmurfs,routefilter,logmartians

Describe the default rules (or policies) for traffic passing through the gateway: local network (~loc) and gateway (~$FW) allowed access to all zones, packets from the Internet (net) are dumped, the REJECT rule is applied to all other packets and the whole process is logged:

/etc/shorewall/policy

#SOURCE     DEST        POLICY          LOGLEVEL
loc         all         ACCEPT
$FW         all         ACCEPT
net         all         DROP
all         all         REJECT          info

Add masquerading for packets coming from the local network to the Internet:

/etc/shorewall/snat

#ACTION         SOURCE              DEST
SNAT(1.2.3.4)   192.168.1.0/24      eth0

The gateway providing Internet access to the local network is ready to use. Now add some rules:

  • autoriser les pings de passerelle à partir d'Internet
  • allow remote SSH connection to the gateway
  • deny Internet connection from IPs 192.168.1.100 to 192.168.1.254
  • transférer les ports IMAP/IMAPS pour l'accès au serveur de messagerie à partir d'Internet
  • rediriger le port SMTP vers le serveur de messagerie

/etc/shorewall/rules

?SECTION NEW
#ACTION         SOURCE                              DEST
Ping/ACCEPT     net                                 fw
SSH/ACCEPT      net                                 fw
REJECT          loc:192.168.1.100-192.168.1.254     net
IMAP/DNAT       net                                 loc:192.168.1.10
IMAPS/DNAT      net                                 loc:192.168.1.10
SMTP/DNAT       net                                 loc:192.168.1.10

Permettre à Shorewall de démarrer :

/etc/shorewall/shorewall.conf

STARTUP_ENABLED=Yes

Enabling IP telephony

Add IP telephony to the previous example:

Enabling IP telephony

  • the phones are connected to the main network and their IP addresses range from ~192.168.1.70~ to ~192.168.1.99~~
  • install Asterisk on server 192.168.1.10

Declare a new zone, phone~ for phones. ~phone must be announced before loc~:

/etc/shorewall/zones

#ZONE       TYPE
fw          firewall
net         ipv4
phone       ipv4
loc         ipv4

Assign phones from the loc zone to phone:

/etc/shorewall/hosts

#ZONE       HOST
phone       eth1:192.168.1.70-192.168.1.99

Describe a policy forbidding phones (~phone) from going online (~net):

/etc/shorewall/policy

#SOURCE     DEST        POLICY          LOG
phone       net         DROP
loc         all         ACCEPT
$FW         all         ACCEPT
net         all         DROP
all         all         REJECT          info

Ping the SIP and IAX ports at 192.168.1.10:

/etc/shorewall/rules

?SECTION NEW
#ACTION         SOURCE          DEST                PROTO       DEST
...
SMTP/DNAT       net             loc:192.168.1.10
# SIP
DNAT            net             loc:192.168.1.10    udp         5060
# IAX
DNAT            net             loc:192.168.1.10    udp         4569

Tunnelage IPSEC

Modify the network of the previous example according to the diagram (adding a remote subnet):

tunnelage IPSEC

  • The gateway establishes an ipsec tunnel with a remote gateway, connecting segment ~192.168.3.0/24~+
  • The IP of the remote gateway is 1.2.3.5

Ajoutez la zone "vpn" pour le sous-réseau distant:

/etc/shorewall/zones

#ZONE       TYPE
fw          firewall
vpn         ipv4
net         ipv4
phone       ipv4
loc         ipv4

Define vpn (packets coming to eth0 and located in subnet ~192.168.3.0/24~):

/etc/shorewall/hosts

#ZONE       HOSTS
phone       eth1:192.168.1.70-192.168.1.99
vpn         eth0:192.168.3.0/24

Describe the tunnel: ipsec, the tunnel goes via the net~ zone, the IP address of the remote gateway is as follows:

/etc/shorewall/tunnels

#TYPE      ZONE        GATEWAY          GATEWAY ZONE
ipsec      net         1.2.3.5

Disable masquerading for packets sent from the local network (~loc) to the remote subnet (~vpn):

/etc/shorewall/snat

#ACTION         SOURCE              DEST
SNAT(1.2.3.4)   192.168.1.0/24      eth0:!192.168.3.0/24

Describe the policy to allow "vpn" connection to the local loc zone:

/etc/shorewall/policy

#SOURCE     DEST        POLICY          LOGLEVEL
phone       net         DROP
vpn         loc         ACCEPT
loc         all         ACCEPT
fw          all         ACCEPT
net         all         DROP
all         all         REJECT          info

Exemple de gestion du trafic

You have a 5 Mbit channel that you want to split as follows:

  • SIP depuis Internet, 256Kbit garanti et maximum, priorité maximale
  • SIP à travers un tunnel à 1 Mbit, garanti et maximum, priorité maximale
  • RDP à travers un tunnel de 1 Mbit garanti et le canal entier moins SIP maximum (5Mbit-1Mbit-256Kbit), priorité normale
  • trafic http avec une faible priorité, 256 Kbit garanti et le canal entier moins le maximum SIP
  • trafic ftp avec haute priorité, 256 Kbit garanti et le canal entier moins le maximum SIP
  • priorité régulière pour tous les autres trafics, 256 Kbit garantis et le canal entier moins SIP maximum

Définissez la largeur des canaux d'entrée et de sortie:

/etc/shorewall/tcdevices

#NUMBER:        IN-BANDWITH     OUT-BANDWIDTH
eth0            -               5mbit
eth1            -               5mbit

Définir les classes de trafic. Since eth0 handles the Internet connection, it must be referred to for all outcoming traffic, while eth1 is used for local connections and, therefore, all incoming traffic relates to it.

/etc/shorewall/tcclasses

#INTERFACE      MARK        RATE        CEIL        PRIO
# INBOUND
eth1            1           256kbit     256kbit     1
eth1            2           1mbit       1mbit       1
eth1            3           1mbit       3768kbit    3
eth1            4           256kbit     3768kbit    2
eth1            5           256kbit     3768kbit    4
eth1            256         256kbit     3768kbit    3

# OUTBOUND
eth1            1           256kbit     256kbit     1
eth1            2           1mbit       1mbit       1
eth1            3           1mbit       3768kbit    3
eth1            4           256kbit     3768kbit    2
eth1            5           256kbit     3768kbit    4
eth1            256         256kbit     3768kbit    3

Définissez les règles du trafic à affecter à une classe particulière:

/etc/shorewall/mangle

#MARK       SOURCE          DEST            PROTO   DEST        SOURCE      USER    TEST    LENGTH  TOS     CONNBYTES   HELPER
# SIP internet
MARK(1)     0.0.0.0/24      0.0.0.0/24      udp     5060
MARK(1)     0.0.0.0/24      0.0.0.0/24      udp     -           5060
MARK(1)     0.0.0.0/24      0.0.0.0/24      all     -           -           -       -       -       -       -           sip
# SIP tunnel
MARK(2)     192.168.3.0/24  192.168.1.0/24  udp     5060
MARK(2)     192.168.1.0/24  192.168.3.0/24  udp     5060
MARK(2)     192.168.3.0/24  192.168.1.0/24  udp     -           5060
MARK(2)     192.168.1.0/24  192.168.3.0/24  udp     -           5060
MARK(2)     192.168.3.0/24  192.168.1.0/24  all     -           -           -       -       -       -       -           sip
MARK(2)     192.168.1.0/24  192.168.3.0/24  all     -           -           -       -       -       -       -           sip
# RDP tunnel
MARK(3)     192.168.3.0/24  192.168.1.0/24  tcp     3389
MARK(3)     192.168.1.0/24  192.168.3.0/24  tcp     3389
MARK(3)     192.168.3.0/24  192.168.1.0/24  tcp     -           3389
MARK(3)     192.168.1.0/24  192.168.3.0/24  tcp     -           3389
# high priority FTP
MARK(4)     0.0.0.0/24      0.0.0.0/24      all     -           -           -       -       -       -       -           ftp
# low priority http,https
MARK(5)     0.0.0.0/24      0.0.0.0/24      tcp     http,https

There is something special in this configuration: since all classes are directly subordinated to the root discipline, RDP and http (for instance) together may take the entire channel. If you do not want the channel allocated for sip traffic to deal with other traffic, use a hierarchical structure similar to this one:

exemple de gestion du trafic

Dans l'utilisation de cette classification, vous devez spécifier l'option "classifier" pour chaque interface:

/etc/shorewall/tcdevices

#INTERFACE      IN_BANDWITH     OUT_BANDWIDTH       OPTIONS
eth0            -               5mbit               classify
eth1            -               5mbit               classify

Modifions les classes de trafic selon la structure présentée ci-dessus:

/etc/shorewall/tcclasses

#INTERFACE      MARK        RATE        CEIL        PRIO
# SIP
1:10            -           1256kbit    1256kbit    1
eth1:10:101     -           256kbit     256kbit     1
eth1:10:102     -           1mbit       1mbit       1

# OTHER
1:20            -           3768kbit    3768kbit    2
eth1:20:201     -           1mbit       3768kbit    3
eth1:20:202     -           256kbit     3768kbit    2
eth1:20:203     -           256kbit     3768kbit    4
eth1:20:204     -           256kbit     3768kbit    3

# OUTBOUND
2:30            -           1256kbit    1256kbit    1
eth0:30:301     -           256kbit     256kbit     1
eth0:30:302     -           1mbit       1mbit       1

# OTHER
2:40            -           3768kbit    3768kbit    2
eth0:40:401     -           1mbit       3768kbit    3
eth0:40:402     -           256kbit     3768kbit    2
eth0:40:403     -           256kbit     3768kbit    4
eth0:40:404     -           256kbit     3768kbit    3

Redéfinir les règles de trafic à affecter à une classe:

/etc/shorewall/mangle

#MARK               SOURCE          DEST            PROTO   DEST        SOURCE  USER    TEST    LENGTH  TOS   CONNBYTES HELPER
# SIP internet
CLASSIFY(10:101)    0.0.0.0/24      0.0.0.0/24      udp     5060
CLASSIFY(10:101)    0.0.0.0/24      0.0.0.0/24      udp     -           5060
CLASSIFY(10:101)    0.0.0.0/24      0.0.0.0/24      all     -           -       -       -       -       -     -         sip
CLASSIFY(30:301)    0.0.0.0/24      0.0.0.0/24      udp     5060
CLASSIFY(30:301)    0.0.0.0/24      0.0.0.0/24      udp     -           5060
CLASSIFY(30:301)    0.0.0.0/24      0.0.0.0/24      all     -           -       -       -       -       -     -         sip

# SIP tunnel
CLASSIFY(10:102)    192.168.3.0/24  192.168.1.0/24  udp     5060
CLASSIFY(30:302)    192.168.1.0/24  192.168.3.0/24  udp     5060
CLASSIFY(10:102)    192.168.3.0/24  192.168.1.0/24  udp     -           5060
CLASSIFY(30:302)    192.168.1.0/24  192.168.3.0/24  udp     -           5060
CLASSIFY(10:102)    192.168.3.0/24  192.168.1.0/24  all     -           -       -       -       -       -     -         sip
CLASSIFY(10:302)    192.168.1.0/24  192.168.3.0/24  all     -           -       -       -       -       -     -         sip
# RDP tunnel
CLASSIFY(20:201)    192.168.3.0/24  192.168.1.0/24  tcp     3389
CLASSIFY(40:401)    192.168.1.0/24  192.168.3.0/24  tcp     3389
CLASSIFY(20:201)    192.168.3.0/24  192.168.1.0/24  tcp     -           3389
CLASSIFY(40:401)    192.168.1.0/24  192.168.3.0/24  tcp     -           3389
# high priority FTP
CLASSIFY(20:203)    0.0.0.0/24      0.0.0.0/24      all     -           -       -       -       -       -     -         ftp
CLASSIFY(40:403)    0.0.0.0/24      0.0.0.0/24      all     -           -       -       -       -       -     -         ftp
# low priority http,https
CLASSIFY(20:204)    0.0.0.0/24      0.0.0.0/24      tcp     http,https
CLASSIFY(40:404)    0.0.0.0/24      0.0.0.0/24      tcp     http,https