Nous considérons dans cette section que vous utilisez Linux 2.4 avec le firewall iptables (NdT : Netfilter plus précisément). Ici c'est un échantillon de la configuration du firewall, qui réalise du NAT pour les machines du réseau privé pour accéder à Internet, avec du suivi de sessions pour les flux sortants, ainsi qu'avec le support de OpenVPN :
sample-config-files/firewall.sh
#!/bin/bash # A Sample OpenVPN-aware firewall. # eth0 is connected to the internet. # eth1 is connected to a private subnet. # Change this subnet to correspond to your private # ethernet subnet. Home will use 10.0.1.0/24 and # Office will use 10.0.0.0/24. PRIVATE=10.0.0.0/24 # Loopback address LOOP=127.0.0.1 # Delete old iptables rules # and temporarily block all traffic. iptables -P OUTPUT DROP iptables -P INPUT DROP iptables -P FORWARD DROP iptables -F # Set default policies iptables -P OUTPUT ACCEPT iptables -P INPUT DROP iptables -P FORWARD DROP # Prevent external packets from using loopback addr iptables -A INPUT -i eth0 -s $LOOP -j DROP iptables -A FORWARD -i eth0 -s $LOOP -j DROP iptables -A INPUT -i eth0 -d $LOOP -j DROP iptables -A FORWARD -i eth0 -d $LOOP -j DROP # Anything coming from the Internet should have a real Internet address iptables -A FORWARD -i eth0 -s 192.168.0.0/16 -j DROP iptables -A FORWARD -i eth0 -s 172.16.0.0/12 -j DROP iptables -A FORWARD -i eth0 -s 10.0.0.0/8 -j DROP iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP # Block outgoing NetBios (if you have windows machines running # on the private subnet). This will not affect any NetBios # traffic that flows over the VPN tunnel, but it will stop # local windows machines from broadcasting themselves to # the internet. iptables -A FORWARD -p tcp --sport 137:139 -o eth0 -j DROP iptables -A FORWARD -p udp --sport 137:139 -o eth0 -j DROP iptables -A OUTPUT -p tcp --sport 137:139 -o eth0 -j DROP iptables -A OUTPUT -p udp --sport 137:139 -o eth0 -j DROP # Check source address validity on packets going out to internet iptables -A FORWARD -s ! $PRIVATE -i eth1 -j DROP # Allow local loopback iptables -A INPUT -s $LOOP -j ACCEPT iptables -A INPUT -d $LOOP -j ACCEPT # Allow incoming pings (can be disabled) iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # Allow services such as www and ssh (can be disabled) iptables -A INPUT -p tcp --dport http -j ACCEPT iptables -A INPUT -p tcp --dport ssh -j ACCEPT # Allow incoming OpenVPN packets # Duplicate the line below for each # OpenVPN tunnel, changing --dport n # to match the OpenVPN UDP port. # # In OpenVPN, the port number is # controlled by the --port n option. # If you put this option in the config # file, you can remove the leading '--' # # If you taking the stateful firewall # approach (see the OpenVPN HOWTO), # then comment out the line below. iptables -A INPUT -p udp --dport 5000 -j ACCEPT # Allow packets from TUN/TAP devices. # When OpenVPN is run in a secure mode, # it will authenticate packets prior # to their arriving on a tun or tap # interface. Therefore, it is not # necessary to add any filters here, # unless you want to restrict the # type of packets which can flow over # the tunnel. iptables -A INPUT -i tun+ -j ACCEPT iptables -A FORWARD -i tun+ -j ACCEPT iptables -A INPUT -i tap+ -j ACCEPT iptables -A FORWARD -i tap+ -j ACCEPT # Allow packets from private subnets iptables -A INPUT -i eth1 -j ACCEPT iptables -A FORWARD -i eth1 -j ACCEPT # Keep state of connections from local machine and private subnets iptables -A OUTPUT -m state --state NEW -o eth0 -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m state --state NEW -o eth0 -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # Masquerade local subnet iptables -t nat -A POSTROUTING -s $PRIVATE -o eth0 -j MASQUERADE
OpenVPN offre quelques options supplémentaires dans la configuration du firewall :
Si chacune des 2 extrémités de OpenVPN référence explicitement l'autre avec l'option --remote, et que les firewalls statefuls qui réalisent du suivi de session UDP (tel que iptables) existent entre les extrémités, il est possible de faire fonctionner OpenVPN sans règles de filtrage explicites, si chacune des deux extrémités envoie des ping à l'autre pour garder la connexion ouverte. Pour faire cela, lancez simplement OpenVPN avec l'option --remote peer, et spécifiez --ping 15 pour être sûr de générer un flot de paquets à travers le tunnel toutes les 15 secondes.
L'option ci-dessus est moins commode si un des pairs change son adresse IP fréquemment tel qu'avec DHCP, ou un accès modem. Dans ces cas, l'extrait de configuration du firewall ci-dessus autorisera l'entrée des paquets UDP par le port 5000 (c'est le port par défaut de OpenVPN) depuis n'importe quelle adresse IP. Cela peut être considéré comme sûr dans tous les modes sécurisés de OpenVPN, puisque tous les paquets du tunnel entrants doivent passer un test d'authentification, sinon ils seront seront rejettés.
Si vous décidez d'ouvrir entièrement le port UDP d'entrée de OpenVPN, comme dans l'extrait ci-dessus de configuration du firewall, vous pourriez vouloir tirer avantage de l'option --tls-auth pour réaliser une double authentification sur le canal de contrôle de TLS, en utilisant à la fois les clef RSA et une passphrase secrète pré-partagée, pour une deuxième ligne de défense contre les DoS ou les attaques actives. Pour plus d'information sur --tls-auth, reportez-vous à la page de man de openvpn.