ipv6_logoWenn man schon IPv4 und IPv6 aktiviert und seine Dienste über beide Protokolle zur Verfügung stellt, möchte man manchmal auch wissen wie viel Traffic über die einzelnen Wege zustande kommt.

Anbei ein kleines Shellscript welches Apache-acceslogs vom gestrigen Tag auswertet.
Ontop zu einem regulären IPv4/IPv6 Test – Goldwert :-)

Man wundere sich nicht über den etwas sehr abgespaceten IPv6 Regex :-)

Dies lässt sich natürlich beliebig auf Dienste wie Mail, FTP usw erweitern.

#!/bin/bash

# title: apache duals stack traffic analyse
# contact: basti@baebeca.de
# source: baebeca.de
# article: http://blog.baebeca.de/2013/02/20/ipv4ipv6-dualstack-traffic-analyse/
# date: 20130216
# version: v.1.0

# ipv4 regex validation / visits
cat /var/log/apache2/access*.log | grep $(date -d yesterday +%d/%b/%Y) | grep -E '[0-9]{1,3}(\.[0-9]{1,3}){3}' | grep -v "(internal dummy connection)" | grep -v "Monitoring" | grep -v "Python-urllib" | grep -v "get_crawler.php" > /var/log/apache_traffic_ipv4

IPV4_VISITS=`cat /var/log/apache_traffic_ipv4 | wc -l`
echo "$IPV4_VISITS IPv4 visits"
echo ""

# ipv6 regex validation / visits
# ipv6 grep regex by Dicky (http://www.violato.net/blog/others/40-ipv6-regex-validation)
cat /var/log/apache2/access*.log | grep $(date -d yesterday +%d/%b/%Y) | grep -E '((([0-9A-Fa-f]{1,4}:){7}(([0-9A-Fa-f]{1,4})|:))|(([0-9A-Fa-f]{1,4}:){6}(:|((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})|(:[0-9A-Fa-f]{1,4})))|(([0-9A-Fa-f]{1,4}:){5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){0,1}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){0,2}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){0,3}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:)(:[0-9A-Fa-f]{1,4}){0,4}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(:(:[0-9A-Fa-f]{1,4}){0,5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})))' | grep -v "(internal dummy connection)" | grep -v "Monitoring" | grep -v "Python-urllib" | grep -v "get_crawler.php" > /var/log/apache_traffic_ipv6

IPV6_VISITS=`cat /var/log/apache_traffic_ipv6 | wc -l`
echo "$IPV6_VISITS IPv6 visits"
echo ""

# mysql inserts for statistics
# ipv4
mysql -u root -p<pass> <database> -e "INSERT INTO <table> SET date = '$(date --date='(date -d yesterday +%d/%b/%Y) 00:00:01 UTC+1 -86401 second' +%s)', apache_traffic_ipv4=$IPV4_VISITS ON DUPLICATE KEY UPDATE apache_traffic_ipv4=$IPV4_VISITS;"

# ipv6
mysql -u root -p<pass> <database> -e "INSERT INTO <table> SET date = '$(date --date='(date -d yesterday +%d/%b/%Y) 00:00:01 UTC+1 -86401 second' +%s)', apache_traffic_ipv6=$IPV6_VISITS ON DUPLICATE KEY UPDATE apache_traffic_ipv6=$IPV6_VISITS;"

 

Lebst du noch oder IPv6′st du schon :-}

Nun gibt es unseren IPv4 / IPv6 Test für alle Websites zum einbinden.

Die Einbindung erfolgt relativ simpel per Javascript. Einfach den folgenden Code im <body> einbinden. Bei Bedarf kann das Layout und Funktionen mittels Parameter in der URL angepasst werden.

<script src="https://www.baebeca.de/six/six.php"></script>

Folgende Parameter in der URL sind optional möglich:

?left=<0-100> (Prozentangabe - Horizontale Position von Links)
?hide=true (Check wird ausgeführt, jedoch nicht angezeigt)

ipv6_test_screen

Demo: https://www.baebeca.de/six/

Sofern weitere Anpassungsmöglichkeiten gewünscht sind, bitte bescheid geben ;)
Diese werden dann natürlich ergänzt.

Apache im Dual-stack mit IPv4 und IPv6.

– Apache muss auf die nötigen Adressen lauschen (hier durch das Sternchen)
– Jeder vHost muss entsprechend konfiguriert werden dass er alle IP Adressen auf Port 80 bedient  (hier durch das Sternchen)

$ vim /etc/apache2/ports.conf 
NameVirtualHost *:80
Listen 80

$ vim /etc/apache2/sites-enabled/domain.de
<VirtualHost *:80>
        Servername domain.de
        ServerAlias www.domain.de

        <Directory /var/www/www.domain.de/>         
                 Options -Indexes FollowSymLinks MultiViews                 
                 AllowOverride All                 
                 Order allow,deny                 
                 allow from all         
        </Directory>
        DocumentRoot /var/www/www.domain.de
        CustomLog /var/log/apache-domain.de.log combined
</VirtualHost>

Freischaltung, Konfiguration und Anpassung laufender Dienste auf IPv6 ist super, jedoch sollte die Firewall nicht vergessen werden!

Postfix und Dovecot im Dual-stack mit IPv4 und IPv6.

$ vim /etc/postfix/main.cf
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
inet_interfaces = all
inet_protocols = ipv4,ipv6
$ /etc/init.d/postfix restart

$ vim /etc/dovecot/dovecot.conf
listen = *,[::]
$ /etc/init.d/dovecot restart

Mit einer Test-Mail an ipv6@test-ipv6.veznat.com lässt sich die Konfiguration prüfen. Hier erhält man relativ zeitnah einen autoresponder mit Mailheader und DNS Auflösung zurück.

Freischaltung, Konfiguration und Anpassung laufender Dienste auf IPv6 ist super, jedoch sollte die Firewall nicht vergessen werden!

ipv6_logoWer IPv6 benutzt, sollte sich nicht nur über Konnektivität und Erreichbarkeit der Services Gedanken machen. Ein großer Punkt – der gerne vergessen wird – ist Security

Sobald IPv6 aktiv ist, ist – auf aktuellen Systemen – sofort ein ssh, FTP, Mail usw. Login möglich – und zwar von überall.
Gleiches gilt natürlich bis hin zur Applikation, die ein Verzeichnis via htaccess mit IPv4 Adressen reglementiert oder IP-Adressen in einer char(16) Spalte vorhält ;)

#!/bin/sh

# demo IPv6 Firewall - start
# source: baebeca.de 
# article: http://blog.baebeca.de/2012/12/21/ipv6-firewall-demo/
# 20121221 - v.1.0

# deny ALL  incoming packages
ip6tables -P INPUT DROP

# allow icmp6
ip6tables -A INPUT -p icmpv6 -j ACCEPT

# allow custom ports (feel free to modify)
  # ssh
  ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
  # http  
  ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
  # https
  ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
  # mysql
  ip6tables -A INPUT -p tcp --dport 3306 -j ACCEPT
  # SMPT 
  ip6tables -A INPUT -p tcp --dport 25 -j ACCEPT
  # IMAP
  ip6tables -A INPUT -p tcp --dport 143 -j ACCEPT

ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT
ip6tables -A INPUT -j REJECT

 

#!/bin/sh

# demo IPv6 Firewall - stop
# source: baebeca.de
# article: http://blog.baebeca.de/2012/12/21/ipv6-firewall-demo/
# 20121221 - v.1.0

# delete all restrictions
ip6tables -F
ip6tables -X
ip6tables -P INPUT ACCEPT
ip6tables -P FORWARD ACCEPT
ip6tables -P OUTPUT ACCEPT

Da man dieses – sinnigerweise – in seine bestehende IPv4 Firewall eingliedert, gibt es an dieser Stelle nur Script-Snippets zum aktivieren und deaktivieren

Sollte jemand ein vollwertiges Script mit Parameterübergabe daraus erstellen, werde ich es gerne anhängen.

ipv6_logoLebst du noch oder IPv6’st du schon :-}

Unsere Testseite: https://www.baebeca.de/six