{"id":1276,"date":"2012-08-01T22:46:49","date_gmt":"2012-08-01T20:46:49","guid":{"rendered":"http:\/\/blog.benny-baumann.de\/?p=1276"},"modified":"2012-08-01T22:46:49","modified_gmt":"2012-08-01T20:46:49","slug":"absender-adressen-erzwingen","status":"publish","type":"post","link":"https:\/\/blog.benny-baumann.de\/?p=1276","title":{"rendered":"Absender-Adressen erzwingen"},"content":{"rendered":"<p>Hat man einen <a href=\"http:\/\/blog.benny-baumann.de\/?p=1082\">Server mit mehreren IP-Adressen<\/a>, gibt es gewisse Situationen, in denen man ausgehende Verbindungen gezielt routen m\u00f6chte. Hat man da n\u00e4mlich einen Mail-Server am Laufen, der auf allen Adressen annehmen, aber nur unter einer bestimmten Adresse versenden soll, artet es leicht in Gefrickel aus. Aber es geht einfacher.<!--more--><\/p>\n<p>F\u00fcr den Zweck des Routings gibt es zwar zum einen mit <\/p>\n<pre lang=\"bash\">ip route<\/pre>\n<p>ein m\u00e4chtiges Werkzeug, was einem das Routing erfolgreich so einrichten kann, dass versucht wird, bestimmte Adressbereiche \u00fcber spezifische Interfaces anzusprechen, aber dies ist in seiner brauchbaren Form sehr darauf begrenzt, dass man seine Ziele kennt und daher nicht einfach zu brauchen.<\/p>\n<p>Daneben gibt es mit<\/p>\n<pre lang=\"bash\">ip rule<\/pre>\n<p>aber auch einen m\u00e4chtigen Zwilling, mit dem man die im Kernel definierten Source Routing Rules \u00fcberschreiben kann. Dies findet zwar haupts\u00e4chlich in <a href=\"http:\/\/blog.benny-baumann.de\/?p=1054\">Mesh-Netzwerken mit OLSR<\/a> eine Anwendung, w\u00e4re aber prinzipiell auch f\u00fcr mein Problem eine L\u00f6sung, w\u00fcrde es denn auf Port-Ebene arbeiten: Tut es aber leider nicht.<\/p>\n<p>Also muss man doch etwas anders an die Sache ran. Und witziger Weise k\u00f6nnen Firewalls nicht nur Pakete wegwerfen oder die <a href=\"http:\/\/blog.benny-baumann.de\/?p=1163\">Lautst\u00e4rke der Namensaufl\u00f6sung<\/a> begrenzen, sondern auch &#8222;The Right Thing&#8220; tuen, um die Quelle einer TCP-Verbindung umzuleiten.<\/p>\n<p>Und wie das bei Linux-Firewalls nun einmal ist, k\u00f6nnen die manchmal mehr, als man nach zwei Stunden Studium des Handbuches \u00fcberblickt. Da geh\u00f6rt das Binden auf eine bestimmte Quell-IP so eher in die Morgen\u00fcbungen der Firewall, wenn der Rauschende Datenstrom des n\u00e4chtlichen Backups nocht nicht ganz \u00fcberstanden ist.<\/p>\n<p>Aber zur\u00fcck zum Problem: Gegeben sei ein beliebiger Mailserver aus der Kategorie &#8222;<a href=\"https:\/\/www.usenix.org\/conference\/lisa10\/postfix-past-present-and-future\">Why Broken Software Works<\/a>&#8222;, sowie ein Server mit mehreren IPv4-Adressen, von denen nur eine zum Versenden von Email verwendet werden soll.<\/p>\n<p>Und weil das so einfach ist, kann das sogar jeder Plaste-Router zu hause. Nunja, er tut es einfach, wenn auch etwas anders: Er NATtet. Denn der Trick ist an sich ganz einfach: Statt direkte Verbindungen nach au\u00dfen umzuschreiben, kann man auch einfach dem Kernel sagen, er soll jede ausgehende Verbindung mit einer Source-NAT versehen, die die zu verwendende Adresse enth\u00e4lt. Nun w\u00e4re das alleine sicherlich keinen Blog-Post wert, w\u00e4re da nicht die Sache mit dem: Nur der Mailserver. Das Interessante hieran ist n\u00e4mlich, dass f\u00fcr den Mail-Server ausgehend nur ganz wenige Ports \u00fcberhaupt von Bedeutung sind:<\/p>\n<ul>\n<li>Port 25: F\u00fcr ein- und ausgehende Mails ohne SSL<\/li>\n<li>Port 465: F\u00fcr ein- und ausgehende Mails mit SSL<\/li>\n<li>Port 587: F\u00fcr eingehende Mails mit Authentifizierung<\/li>\n<\/ul>\n<p>Von diesen 3 Ports ist Port 465 inzwischen &#8222;veraltet&#8220; und sollte daher nicht mehr verwendet werden, womit f\u00fcr ausgehende Mails allein Port 25 \u00fcbrig bleibt. Also kann man gezielt auch nur diesen ausgehend NATen:<\/p>\n<pre lang=\"bash\">iptables -t nat -A POSTROUTING -m iprange --src-range $START-$ENDE -p tcp -m tcp --dport 25 -j SNAT --to-source $ZIEL<\/pre>\n<p>And that&#8217;s it! Eine Zeile in der Firewall und jede ausgehende Mail ist automagisch auf die Ziel-IP (also die zu verwendende Quelladresse) gebunden, egal, von welcher der IPs der Server versucht zu senden. Und schon klappt das auch mit dem <a href=\"http:\/\/en.wikipedia.org\/wiki\/Sender_Policy_Framework\">SPF<\/a> \ud83d\ude09<\/p>\n<p class=\"wp-flattr-button\"><a href=\"https:\/\/blog.benny-baumann.de\/?flattrss_redirect&amp;id=1276&amp;md5=b353370ae29a71230adda27ba8588dfa\" title=\"Flattr\" target=\"_blank\"><img src=\"http:\/\/blog.benny-baumann.de\/wp-content\/plugins\/flattr\/img\/flattr-badge-large.png\" srcset=\"http:\/\/blog.benny-baumann.de\/wp-content\/plugins\/flattr\/img\/flattr-badge-large.png\" alt=\"Flattr this!\"\/><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Hat man einen Server mit mehreren IP-Adressen, gibt es gewisse Situationen, in denen man ausgehende Verbindungen gezielt routen m\u00f6chte. Hat man da n\u00e4mlich einen Mail-Server am Laufen, der auf allen Adressen annehmen, aber nur unter einer bestimmten Adresse versenden soll, artet es leicht in Gefrickel aus. Aber es geht einfacher.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[4],"tags":[204,346],"class_list":["post-1276","post","type-post","status-publish","format-standard","hentry","category-server","tag-postfix","tag-server"],"_links":{"self":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/1276","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1276"}],"version-history":[{"count":2,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/1276\/revisions"}],"predecessor-version":[{"id":1294,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/1276\/revisions\/1294"}],"wp:attachment":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1276"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1276"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1276"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}