Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
centos:mail_c6:mta_14 [28.03.2014 10:27. ] djangocentos:mail_c6:mta_14 [21.11.2022 20:53. ] (aktuell) – [SRS - Sender Rewriting Scheme] django
Zeile 5: Zeile 5:
 Das nachfolgende Schaubild verdeutlicht, warum bei zu strenger Wahl des SPF-Records der Versand bei einer Weiterleitung (alias) fehlschlägt. Der empfangende Mailserver überprüft die Angaben **HELO** und **MAIL FROM** im **Envelop** der eMail. Hierzu frägt der Mailserver den SPF-Record des sendenden Systems ab und vergleicht die IP-Adresse/Namen des einliefernden Empfängers mit den legitimen Sendern des SMF-Records. Ist der einliefernde Mailserver berechtigt, kann mit der weiteren Annahme und Prüfung fortgefahren werden. Ist der einliefernde Mailserver aber __**nicht**__ berechtigt, quittiert das System den Zustellversuch mit einem Fehler-(code) **550**. Das nachfolgende Schaubild verdeutlicht, warum bei zu strenger Wahl des SPF-Records der Versand bei einer Weiterleitung (alias) fehlschlägt. Der empfangende Mailserver überprüft die Angaben **HELO** und **MAIL FROM** im **Envelop** der eMail. Hierzu frägt der Mailserver den SPF-Record des sendenden Systems ab und vergleicht die IP-Adresse/Namen des einliefernden Empfängers mit den legitimen Sendern des SMF-Records. Ist der einliefernde Mailserver berechtigt, kann mit der weiteren Annahme und Prüfung fortgefahren werden. Ist der einliefernde Mailserver aber __**nicht**__ berechtigt, quittiert das System den Zustellversuch mit einem Fehler-(code) **550**.
  
-<uml w=900>+<uml>
  
 title Mailversand einer eMail bei Weiterleitung (alias)\n title Mailversand einer eMail bei Weiterleitung (alias)\n
-skin BlueModern+
 participant "\n Mail-Server mx1.example.org \n 88.217.127.21 \n" as links participant "\n Mail-Server mx1.example.org \n 88.217.127.21 \n" as links
 participant "\n Mail-Server mx01.nausch.org \n 217.91.103.190 \n" as mitte participant "\n Mail-Server mx01.nausch.org \n 217.91.103.190 \n" as mitte
Zeile 170: Zeile 170:
  
 ==== Postfix ==== ==== Postfix ====
-Leider unterstützt der aus dem Base-Repository stammende Postfix in der Version 2.6.6  keine TCP Lookup Tabellen, so dass wir auf eine neuere Version ausweichen müssen. Die Firma [[http://www.imt-systems.com/|IMT-Systems GmbH]] stellt auf ihrem [[http://download.imt-systems.com/postfix/2.10/2.10.0/x86_64/|Download-Server]] aktuellere **//Postfix 2.10.0//** RPM Pakete für CentOS 6 zur Verfügung.+Leider unterstützt der aus dem Base-Repository stammende Postfix in der Version 2.6.6  keine TCP Lookup Tabellen, so dass wir auf eine neuere Version ausweichen müssen.  
 + 
 +Die Firma [[http://www.imt-systems.com/|IMT-Systems GmbH]] stellt auf ihrem [[http://download.imt-systems.com/postfix/2.10/2.10.0/x86_64/|Download-Server]] aktuellere **//Postfix 2.10.0//** RPM Pakete für CentOS 6 zur Verfügung.
  
 Wir laden uns also die entsprechenden RPM-Pakete auf unseren Server, dazu wechslen wir aber erst in unser lokales Programmarchiv. Wir laden uns also die entsprechenden RPM-Pakete auf unseren Server, dazu wechslen wir aber erst in unser lokales Programmarchiv.
Zeile 235: Zeile 237:
  
 ==== SRS-Deamon ==== ==== SRS-Deamon ====
-Das Programm-Archiv von **PostSRSd** laden wir uns nun auf unseren Rechner. Ob dies nun gleich der eigentliche Mailserver sein muss, muß natürlich entsprechend hinterfragt werden. Wer will schon Entwicklerwerkzeuge, wie **cmake** auf einem produktiven Mailserver installieren.+Als laden wir uns das aktuelle RPM auf unseren Server 
 +   # cd /usr/local/src/packages
  
-In unserem Beispielsfall wurde die Installation von **cmake** und die Übersetzung von **PostSRSd** auf einem Entwicklungsrechner vorgenommen. Das übersetzte Programmpaket wurde anschließend auf den Mailserver kopiert und ist auch im Repository von nausch.org unter der [[http://repository.nausch.org/public/postsrsd|URL]] herunterladbar.+   # wget http://repository.nausch.org/public/x86_64/postsrsd-1.0.1-1.el6.x86_64.rpm
  
-Wollen wir das Paket selbst übersetzen, dann laden wir uns das entsprechende aktuelle ZIP-Archiv von **PostSRSd** auf unseren (Entwicklungs-)Rechner.  +Dann installieren wir das Paket.  
-   # wget https://github.com/roehling/postsrsd/archive/master.zip+   # yum localinstall postsrsd-1.0.1-1.el6.x86_64.rpm
  
-Anschließend entpacken wir das ZIP-Archiv. +Altenativ können wir das Paket natürlich auch direkt von [[http://repository.nausch.org/public/|Djangos Repository]] aus installieren.  
-   # unzip master +   # yum localinstall http://repository.nausch.org/public/x86_64/postsrsd-1.0.1-1.el6.x86_64.rpm
-<code>Archive master +
-6c0be7c5b306a354f082e4fc2bbc7b517361157f +
-   creating: postsrsd-master/ +
-  inflating: postsrsd-master/.gitignore   +
- extracting: postsrsd-master/.travis.yml   +
-  inflating: postsrsd-master/CMakeLists.txt   +
-  inflating: postsrsd-master/LICENSE   +
-  inflating: postsrsd-master/README.md   +
-  inflatingpostsrsd-master/main.cf.ex   +
-  inflating: postsrsd-master/makefile   +
-  inflating: postsrsd-master/postinstall.cmake.in   +
-  inflating: postsrsd-master/postsrsd.apparmor.in   +
-  inflating: postsrsd-master/postsrsd.c   +
-  inflating: postsrsd-master/postsrsd.default   +
-  inflating: postsrsd-master/postsrsd.lsb_init.in   +
-  inflating: postsrsd-master/postsrsd.rh_init.in   +
-  inflating: postsrsd-master/postsrsd.upstart.in   +
-  inflating: postsrsd-master/sha1.c   +
-  inflating: postsrsd-master/srs2.c   +
-  inflating: postsrsd-master/srs2.h +
-</code> +
-Bevor wir das Programm übersetzen, wechseln wirnoch in das entsprechende Programmarchiv. +
-   # cd postsrsd-master+
  
-Nun übersetzen wir das Programm mit folgendem Aufruf+Ein Update des Paketes geht entsprechend der Installation.  
-   # make+   # yum localupdate http://repository.nausch.org/public/x86_64/postsrsd-1.0.1-1.el6.x86_64.rpm
  
-Das wars dann auch schon mit der InstallationWir kopieren das erhaltene Binary an die entsprechende Stelle //**/usr/local/sbin/postsrsd**//.  +Was uns das Paket alles mitbringt, zeigt uns wie immer der Aufruf von **rpm -qil <paketname>**. 
-   # cp build/postsrsd /usr/local/sbin/+   # rpm -qil postsrsd 
 +<code>Name        : postsrsd                     Relocations: (not relocatable) 
 +Version     : 1.0.1                             Vendor: django 
 +Release     : 1.el6                         Build Date: Fri 28 Mar 2014 11:08:53 AM CET 
 +Install Date: Fri 28 Mar 2014 11:14:34 AM CET      Build Host: vml010039.intra.nausch.org 
 +Group       : System Environment/Daemons    Source RPM: postsrsd-1.0.1-1.el6.src.rpm 
 +Size        : 41781                            License: GPLV2+ 
 +Signature   : RSA/SHA1, Fri 28 Mar 2014 11:08:54 AM CET, Key ID 31b4758f7c65ab27 
 +Packager    : Django <django@nausch.org> 
 +URL         : https://github.com/roehling/postsrsd/archive/1.0.1.tar.gz 
 +Summary     : PostSRSd provides the Sender Rewriting Scheme (SRS) via TCP-based lookup tables for Postfix. 
 +Description : 
 +PostSRSd provides the Sender Rewriting Scheme (SRS) via TCP-based 
 +lookup tables for Postfix. SRS is needed if your mail server acts 
 +as forwarder. 
 +/etc/rc.d/init.d/postsrsd 
 +/etc/sysconfig/postsrsd 
 +/usr/sbin/postsrsd 
 +/usr/share/doc/postsrsd-1.0.1 
 +/usr/share/doc/postsrsd-1.0.1/README.md 
 +/usr/share/doc/postsrsd-1.0.1/main.cf.ex 
 +/var/lib/postsrsd 
 +</code>
  
-Wollen wir das Binary aus dem Repository von nausch.org nutzen, wechseln wir in das Zielverzeichnis und holen uns das Binary auf unseren Mailserver und passen zum Schluß noch die Dateioptionen an. 
-   # cd /usr/local/sbin/ 
- 
-   # wget http://repository.nausch.org/public/postsrsd 
- 
-   # chmod +x /usr/local/sbin/postsrsd 
- 
-Nun benötigen wir noch ein passendes Shell-Script für unseren **PostSRSd**. 
-   # vim /etc/init.d/postsrsd 
-<file bash /etc/init.d/postsrsd>#!/bin/bash 
-# 
-# postsrsd      Sender Rewriting Scheme (SRS) for Postfix 
-# 
-# chkconfig:         2345 75 35 
-# description:      PostSRSd provides Sender Rewriting Scheme (SRS) for \ 
-#                    the popular and secure Postfix Mail Transport Agent 
-# processname:      postsrsd 
-# pidfile:      /var/run/postsrsd.pid 
-# config:      /etc/default/postsrsd 
-# sec-key:      /etc/postsrsd.secret  
- 
-### BEGIN INIT INFO 
-# Provides:          postsrsd 
-# Required-Start:    $local_fs $network $remote_fs 
-# Required-Stop:     $local_fs $network $remote_fs 
-# Default-Start:     2 3 4 5 
-# Default-Stop:      0 1 6 
-# Short-Description: start and stop postsrsd 
-# Description:       PostSRSd provides Sender Rewriting Scheme (SRS) for 
-#                    the popular and secure Postfix Mail Transport Agent        
-### END INIT INFO 
- 
-# Source function library. 
-. /etc/rc.d/init.d/functions 
- 
-# Source networking configuration. 
-. /etc/sysconfig/network 
- 
-RETVAL=0 
-POSTSRSD_CONFIG="/etc/default/postsrsd" 
-NAME="postsrsd" 
-DAEMON="/usr/local/sbin/postsrsd" 
-PID_FILE="/var/run/$NAME.pid" 
-SCRIPTNAME="/etc/init.d/$NAME" 
-DESC="Postfix Sender Rewriting Scheme Daemon" 
- 
-if [ -f $POSTSRSD_CONFIG ]; then 
-  . $POSTSRSD_CONFIG 
-else 
-  exit 0 
-fi 
-  
-test -x $DAEMON || exit 0 
- 
-# Read config file if it is present. 
-if [ -r /etc/default/$NAME ] 
-then 
-    . /etc/default/$NAME 
-fi 
- 
-do_start() 
-{ 
- echo -n "Starting $DESC: " 
- daemon $DAEMON -4 -f"$SRS_FORWARD_PORT" -r"$SRS_REVERSE_PORT" -d"$SRS_DOMAIN" -s"$SRS_SECRET" \ 
-                -u"$RUN_AS" -p"$PIDFILE" -c"$CHROOT" -X"$SRS_EXCLUDE_DOMAINS" -D 
- RETVAL=$? 
- echo 
-    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$NAME 
-    return $RETVAL 
-} 
- 
-do_stop() 
-{ 
- echo -n "Stopping $DESC: " 
- killproc $NAME 
-        RETVAL=$? 
-        echo 
-        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$NAME 
-        return $RETVAL 
-} 
- 
-case "$1" in 
-  start) 
- do_start 
- ;; 
-  stop) 
- do_stop 
- ;; 
-  status) 
- status $NAME 
- ;; 
-  restart|force-reload) 
- do_stop 
- do_start 
- ;; 
-  reload) 
- ;; 
-  condrestart|try-restart) 
- if [ -f /var/lock/subsys/$NAME ]; then 
- do_stop 
- do_start 
- fi 
- ;; 
-  *) 
- echo "Usage: $NAME {start|stop|restart|condrestart|try-restart|reload|force-reload|status|usage}" 
- [ "$1" = "usage" ] && exit 0 
- exit 2 
- ;; 
-esac 
-exit $? 
-</file> 
 ===== Konfiguration ===== ===== Konfiguration =====
  
 ==== SRS-Deamon ==== ==== SRS-Deamon ====
-Auf unserem Entwicklungsrechner finden wir eine README-Datei mit weiteren Informationen. +Die Konfiguration des **postsrsd**-Daemons gestaltet sich vergleichsweise einfach und erfolgt lediglich mit Hilfe Der Datei //**/etc/sysconfig/postsrsd**//.  
-   # less /usr/local/src/postsrsd-master/README.md +Mit unserem Editor der Wahlz.Bvim bearbeiten wir diese Konfigurationsdatei.  
- +   # vim /etc/sysconfig/postsrsd 
-<file bash README.md> +<file bash /etc/sysconfig/postsrsd># Default settings for postsrsd
-About +
-===== +
-PostSRSd provides the Sender Rewriting Scheme (SRS) via TCP-based  +
-lookup tables for Postfix. SRS is needed if your mail server acts +
-as forwarder.  +
- +
-Imagine your server receives a mail from alice@example.com +
-that is to be forwarded. If example.com uses the Sender Policy Framework  +
-to indicate that all legit mails originate from their server, your  +
-forwarded mail might be bounced, because you have no permission to send +
-on behalf of example.com. The solution is that you map the address to +
-your own domain, e.g.  +
-SRS0+xxxx=yy=example.com=alice@yourdomain.org (forward SRS). If the +
-mail is bounced later and a notification arrives, you can extract the +
-original address from the rewritten one (revere SRS) and return the +
-notification to the sender. You might notice that the reverse SRS can +
-be abused to turn your server into an open relay. For this reason, xxxx +
-and yy are a cryptographic signature and a time stamp. If the signature +
-does not match, the address is forged and the mail can be discarded. +
- +
-Building +
-======== +
-PostSRSd requires a POSIX compatible system and CMake to build.  +
-Optionally, help2man is used to create a manual page. +
- +
-For convenience, a Makefile fragment is provided which calls CMake with +
-the recommended command line options. Just run `make`. +
- +
-Installing +
-========== +
-Run `make install` as root to install the daemon and the configuration +
-files. +
-Configuration +
-============= +
-The configuration is located in `/etc/default/postsrsd`. You must store +
-at least one secret key in `/etc/postsrsd.secret`. The installer tries to generate +
-one from `/dev/urandom`. Be careful that no one can guess your secret, +
-because anyone who knows it can use your mail server as open relay! +
-Each line of `/etc/postsrsd.secret` is used as secretThe first secret is +
-used for signing and verification, the others for verification only. +
- +
-PostSRSd exposes its functionality via two TCP lookup tables. The +
-recommended Postfix configuration is to add the following fragment to +
-your main.cf: +
- +
-    sender_canonical_maps = tcp:127.0.0.1:10001 +
-    sender_canonical_classes = envelope_sender +
-    recipient_canonical_maps = tcp:127.0.0.1:10002 +
-    recipient_canonical_classes= envelope_recipient +
- +
-This will transparently rewrite incoming and outgoing envelope addresses. +
-Run `service postsrsd start` and `postfix reload` as root, or reboot. +
-</file> +
- +
-Wir legen uns nun im ersten Schritt für unsere Konfigurationsdatei im entsprechende Verzeichnis an+
-   # vim /etc/default/postsrsd +
- +
-<file bash /etc/default/postsrsd># Default settings for postsrsd+
  
 # Local domain name.  # Local domain name. 
Zeile 455: Zeile 288:
 # is taken from `postconf -h mydomain` and probably okay. # is taken from `postconf -h mydomain` and probably okay.
 # #
-# Django : 2014-03-17 +#SRS_DOMAIN=example.com 
-# default: #SRS_DOMAIN=example.com+# Django : 2014-03-27
 SRS_DOMAIN=nausch.org SRS_DOMAIN=nausch.org
  
Zeile 470: Zeile 303:
 # and stored in /etc/postsrsd.secret. For most installations, that's just fine. # and stored in /etc/postsrsd.secret. For most installations, that's just fine.
 # #
 +#SRS_SECRET=/etc/postsrsd.secret
 +# Django : 2014-03-27
 SRS_SECRET=/etc/postsrsd.secret SRS_SECRET=/etc/postsrsd.secret
  
Zeile 478: Zeile 313:
 # the internet. # the internet.
 # #
 +#SRS_FORWARD_PORT=10001
 +#SRS_REVERSE_PORT=10002
 +# Django : 2014-03-27
 SRS_FORWARD_PORT=10001 SRS_FORWARD_PORT=10001
 SRS_REVERSE_PORT=10002 SRS_REVERSE_PORT=10002
Zeile 486: Zeile 324:
 RUN_AS=nobody RUN_AS=nobody
 </file> </file>
- 
-Zum Signieren der umgeschriebenen Adressen benötigen wir noch einen secret-key, den wir nun anlegen. 
-   # dd if=/dev/urandom bs=18 count=1 | base64  > /etc/postsrsd.secret 
- 
-Anschließend setzen wir die Dateirechte unseres privat-keys, damit diese nicht von unpreviligierten Usern ausgelesen werden kann. Der **PostSRSd** hat damit keine Probleme, da er den Schlüssel einliest, bevor diese seine Rechte abtritt/dropped. 
-   # chmod 400 /etc/postsrsd.secret 
- 
  
 ==== Postfix ==== ==== Postfix ====
Zeile 524: Zeile 355:
    # ps aux | grep postsrsd    # ps aux | grep postsrsd
  
-  nobody    5185  0.0  0.0   6184   344 ?        S    20:46   0:00 /usr/local/sbin/postsrsd -4 -f10001 -r10002 -dnausch.org -s/etc/postsrsd.secret -unobody -p -c -X -D+  nobody    6170  0.0  0.0   6184   352 ?        S    11:20   0:00 /usr/sbin/postsrsd -4 -f10001 -r10002 -dnausch.org -s/etc/postsrsd.secret -unobody -p -c -X -D 
 +  nobody    7151  0.0  0.0   6188   316 ?        S    11:41   0:00 /usr/sbin/postsrsd -4 -f10001 -r10002 -dnausch.org -s/etc/postsrsd.secret -unobody -p -c -X -D 
 +  nobody    7300  0.0  0.0   6188   500 ?        S    11:44   0:00 /usr/sbin/postsrsd -4 -f10001 -r10002 -dnausch.org -s/etc/postsrsd.secret -unobody -p -c -X -D 
 +  nobody    7301  0.0  0.0   6188   316 ?        S    11:44   0:00 /usr/sbin/postsrsd -4 -f10001 -r10002 -dnausch.org -s/etc/postsrsd.secret -unobody -p -c -X -D
  
 Mittels **netstat** können wir überpfüfen, ob die beiden Ports **10001** und **10002** geöffnet wurden. Mittels **netstat** können wir überpfüfen, ob die beiden Ports **10001** und **10002** geöffnet wurden.
Zeile 533: Zeile 367:
  
 Läuft unser Daemon kann mit Hilfe von **lsof** sehen wir nicht nur den geöffneten port, sondern auch die Verbindungen die dort anliegen. Läuft unser Daemon kann mit Hilfe von **lsof** sehen wir nicht nur den geöffneten port, sondern auch die Verbindungen die dort anliegen.
-   # lsof -i :10002 
-<code>COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME 
-postsrsd 5185  nobody    6u  IPv4  40634      0t0  TCP localhost:documentum (LISTEN) 
-smtpd    5364 postfix   39u  IPv4  43230      0t0  TCP localhost:48910->localhost:documentum (ESTABLISHED) 
-postsrsd 5367  nobody    0u  IPv4  43231      0t0  TCP localhost:documentum->localhost:48910 (ESTABLISHED) 
-postsrsd 5367  nobody    6u  IPv4  40634      0t0  TCP localhost:documentum (LISTEN) 
-cleanup  5369 postfix   23u  IPv4  43281      0t0  TCP localhost:48917->localhost:documentum (ESTABLISHED) 
-postsrsd 5370  nobody    6u  IPv4  40634      0t0  TCP localhost:documentum (LISTEN) 
-postsrsd 5371  nobody    0u  IPv4  43282      0t0  TCP localhost:documentum->localhost:48917 (ESTABLISHED) 
-postsrsd 5371  nobody    6u  IPv4  40634      0t0  TCP localhost:documentum (LISTEN) 
-</code> 
    # lsof -i :10001    # lsof -i :10001
-<code>COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME + 
-postsrsd 5185  nobody    5u  IPv4  40632      0t0  TCP localhost:scp-config (LISTEN) +  COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME 
-postsrsd 5367  nobody    5u  IPv4  40632      0t0  TCP localhost:scp-config (LISTEN) +  postsrsd 6170  nobody    5u  IPv4 574244      0t0  TCP localhost:scp-config (LISTEN) 
-cleanup  5369 postfix   22u  IPv4  43278      0t0  TCP localhost:56006->localhost:scp-config (ESTABLISHED) +  postsrsd 7151  nobody    5u  IPv4 574244      0t0  TCP localhost:scp-config (LISTEN) 
-postsrsd 5370  nobody    0u  IPv4  43279      0t0  TCP localhost:scp-config->localhost:56006 (ESTABLISHED) +  cleanup  7299 postfix   22u  IPv4 583245      0t0  TCP localhost:43341->localhost:scp-config (ESTABLISHED) 
-postsrsd 5370  nobody    5u  IPv4  40632      0t0  TCP localhost:scp-config (LISTEN) +  postsrsd 7300  nobody    0u  IPv4 583246      0t0  TCP localhost:scp-config->localhost:43341 (ESTABLISHED) 
-postsrsd 5371  nobody    5u  IPv4  40632      0t0  TCP localhost:scp-config (LISTEN) +  postsrsd 7300  nobody    5u  IPv4 574244      0t0  TCP localhost:scp-config (LISTEN) 
-</code>+  postsrsd 7301  nobody    5u  IPv4 574244      0t0  TCP localhost:scp-config (LISTEN) 
 + 
 +   # lsof -i :10002 
 + 
 +  postsrsd 6170  nobody    6u  IPv4 574246      0t0  TCP localhost:documentum (LISTEN) 
 +  smtpd    7146 postfix   40u  IPv4 582010      0t0  TCP localhost:57592->localhost:documentum (ESTABLISHED) 
 +  postsrsd 7151  nobody    0u  IPv4 582011      0t0  TCP localhost:documentum->localhost:57592 (ESTABLISHED) 
 +  postsrsd 7151  nobody    6u  IPv4 574246      0t0  TCP localhost:documentum (LISTEN) 
 +  cleanup  7299 postfix   23u  IPv4 583248      0t0  TCP localhost:57652->localhost:documentum (ESTABLISHED) 
 +  postsrsd 7300  nobody    6u  IPv4 574246      0t0  TCP localhost:documentum (LISTEN) 
 +  postsrsd 7301  nobody    0u  IPv4 583249      0t0  TCP localhost:documentum->localhost:57652 (ESTABLISHED) 
 +  postsrsd 7301  nobody    6u  IPv4 574246      0t0  TCP localhost:documentum (LISTEN)
  
 ==== automatisches Starten des Dienste beim Systemstart  ==== ==== automatisches Starten des Dienste beim Systemstart  ====
Zeile 585: Zeile 419:
   * **[[http://dokuwiki.nausch.org/doku.php/|Zurück zur Startseite]]**   * **[[http://dokuwiki.nausch.org/doku.php/|Zurück zur Startseite]]**
  
-~~DISCUSSION~~+
  
  • centos/mail_c6/mta_14.1396002430.txt.gz
  • Zuletzt geändert: 28.03.2014 10:27.
  • von django