{"id":355,"date":"2014-12-13T18:46:07","date_gmt":"2014-12-13T16:46:07","guid":{"rendered":"http:\/\/grenzdebiel.no-ip.biz\/?p=355"},"modified":"2016-10-28T19:22:37","modified_gmt":"2016-10-28T17:22:37","slug":"lxc-kleines-how-to","status":"publish","type":"post","link":"https:\/\/blog.grenzdebiel.dynv6.net\/?p=355","title":{"rendered":"LXC &#8211; Netzwerkbr\u00fccke"},"content":{"rendered":"<p>LXC war mir ja schon ein Beitrag wert. Da ich sehr gerne damit arbeite gibt es noch einen.<br \/>\nDiesmal wird die Einrichtung ohne &#8222;libvirt&#8220; beschrieben. Mich haben die Firewall-Regeln genervt deshalb wollte ich das Paket loswerden da ich auf meinem Cubie keinen weiteren Hypervisor o.\u00e4. nutze.<!--more--><\/p>\n<p>Als erstes braucht man eine Netzwerkbr\u00fccke die die Daten von der &#8222;echten&#8220; Netzwerkschnittstelle an\u00a0 die Container \u00fcbergibt. Hier kann man sich entscheiden zwischen einer richtigen Bridge oder ob man das ganze &#8222;DNAT-tet&#8220; also ein weiteres Netzwerk welches die Container benutzen.<\/p>\n<p>Vorteil der echten Bridge ist das es ohne iptables-geraffel auskommt. Die Container haben direkten Zugriff auf euer LAN, bekommen also z.b. einen IP von eurem DHCP-Server. Um von einem Client auf einen Container zugreifen zu wollen braucht man nirgens Einstellungen vornehmen zu m\u00fcssen.<\/p>\n<p>Wollt ihr hingegen das die Container ein eigenes Netzwerk benutzen kann man dies &#8222;NAT-ten&#8220; um Zugriff von den Containern in die Welt zu bekommen. Soll hingegen ein Client Zugriff auf ein Container haben muss hier die route im Client zum Container eingetragen sein oder ihr f\u00fcgt eine route in eurem Standard-Gateway hinzu wo hin er das Netz routen soll.<\/p>\n<p>Der vollst\u00e4ndigkeit m\u00f6chte ich noch erw\u00e4hnen das man auch mit VLAN arbeiten kann doch das ist selbst mir zu \u00fcbertrieben bzw. habe ich einfach keine Lust darauf.<\/p>\n<p>Kommen wir zur Konfiguration. Ich gehe von einer Netzwerkschnittstelle aus wie z.b. beim Cubie.<\/p>\n<p>F\u00fcr eine echte Bridge sollte eure <strong>\/etc\/network\/interfaces<\/strong> wie folgt aussehen:<\/p>\n<pre class=\"lang:sh decode:true\">auto lo\r\niface lo inet loopback\r\n\r\n# kann man weglassen - ich gehe lieber auf nummer sicher\r\niface eth0 inet manual\r\n\r\n# f\u00fcr DHCP:\r\nauto lxc-br0\r\niface lxc-br0 inet dhcp\r\n    bridge_ports eth0\r\n    bridge_stp off\r\n    bridge_fd 0\r\n    bridge_maxwait 0\r\n\r\n# f\u00fcr statische adresse:\r\nauto lxc-br0\r\niface lxc-br0 inet static\r\n    address &lt;ip-adresse&gt;\r\n    netmask &lt;subnet&gt;\r\n    gateway &lt;gateway&gt;\r\n    bridge_ports eth0\r\n    bridge_stp off\r\n    bridge_fd 0\r\n    bridge_maxwait 0\r\n<\/pre>\n<p>Nach einem Neustart solltet ihr mit <strong>ifconfig<\/strong> oder <strong>ip a<\/strong> u.a. das Device &#8222;<strong>lxc-br0<\/strong>&#8220; mit einer IP sehen.<\/p>\n<p>F\u00fcr eine &#8222;NAT-Bridge&#8220; editiert eure <strong>\/etc\/network\/interfaces<\/strong> so:<\/p>\n<pre class=\"lang:sh decode:true\">auto lo\r\niface lo inet loopback\r\n\r\n# kann man weglassen - ich gehe lieber auf nummer sicher\r\niface eth0 inet manual\r\n\r\nauto lxc-br0\r\niface lxc-br0 inet static\r\naddress &lt;ip-adresse&gt;\r\nnetmask &lt;subnet&gt;\r\nbridge_ports none\r\nbridge_stp off\r\n\r\npost-up echo 1 &gt; \/proc\/sys\/net\/ipv4\/ip_forward\r\npost-up iptables -t nat -F POSTROUTING\r\npost-up iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE\r\n\r\npre-down echo 0 &gt; \/proc\/sys\/net\/ipv4\/ip_forward\r\npre-down iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE\r\n<\/pre>\n<p>In einem anderen Beitrag habe ich beschrieben wie ein <a title=\"LXC \u2013 chroot auf Steroide\" href=\"http:\/\/grenzdebiel.no-ip.biz\/?p=282\">lx-container erzeugt<\/a> wird. Um die Netzwerkschnittstellen im Container als auch auf dem Host besser lesbar zu gestalten und vor allem zuordnen zu k\u00f6nnen k\u00f6nnt ihr folgendes zu der &#8222;<strong>config<\/strong>&#8220; des Containers hinzuf\u00fcgen:<\/p>\n<pre class=\"lang:sh decode:true \">lxc.network.type = veth\r\nlxc.network.flags = up\r\nlxc.network.link = lxc-br0\r\nlxc.network.name = eth0\r\nlxc.network.veth.pair = veth-webserver2\r\nlxc.network.ipv4 = &lt;ip-adresse\/subnet&gt;\r\nlxc.network.ipv4.gateway = &lt;gateway&gt;\r\nlxc.network.hwaddr = 00:1E:CH:AN:GE:ME<\/pre>\n<p>Zeile 3: br\u00fccke zur Virtuelle Schnittstelle (veth-*)<br \/>\nZeile 4: Netzwerkschnittstellenname im Container<br \/>\nZeile 5: Netzwerkschnittstellenname im Host<\/p>\n<p>So hat man etwas \u00dcberblick.<\/p>\n<p>M\u00f6chtet ihr jetzt Zugriff von au\u00dfen auf den Container zugreifen kann man im Client eine route setzen wohin der Client die Verbindung aufbauen soll z.b.:<\/p>\n<p>Host-IP: 192.168.0.1<br \/>\nContainer-IP: 192.168.254.10<br \/>\nClient: 192.168.0.13<\/p>\n<p>So w\u00fcrde die route wie folgt aussehen: <strong>route add -net 192.168.254.0\/24 gw 192.168.0.1<\/strong><\/p>\n<p>Eine andere M\u00f6glichkeit ist es mit iptables auf dem Host eine Port-Weiterleitung einzurichten. Man gibt also nicht die IP-Adresse des Containers an sondern die des Host und die Firewall erkennt das ihr eigentlich woanders hinwollt. Dies nennt sich Destination-NAT. Um dies an ein Beispiel festzumachen, ihr habt einen Container in dem ein Webserver l\u00e4uft den ihr erreichen wollt.<\/p>\n<p>Folgendes Beispiel verwendet die gleichen Daten wie im obigen.<br \/>\nGebt im Host folgende Zeilen ein und der Client kann eine Verbindung aufbauen:<\/p>\n<pre class=\"lang:sh decode:true \">iptables -t nat -A PREROUTING -d 192.168.0.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.254.10\r\niptables -t nat -A OUTPUT -d 192.168.0.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.254.10<\/pre>\n<p>Und ihr erreicht euren Webserver.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>LXC war mir ja schon ein Beitrag wert. Da ich sehr gerne damit arbeite gibt es noch einen. Diesmal wird die Einrichtung ohne &#8222;libvirt&#8220; beschrieben. Mich haben die Firewall-Regeln genervt deshalb wollte ich das Paket loswerden da ich auf meinem Cubie keinen weiteren Hypervisor o.\u00e4. nutze.<\/p>\n","protected":false},"author":3,"featured_media":381,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[43,27,12],"tags":[87,74,88,118,89],"class_list":["post-355","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cubietruck","category-linux","category-software-pi","tag-bridge","tag-lxc","tag-nat","tag-netzwerk","tag-veth"],"_links":{"self":[{"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/posts\/355","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=355"}],"version-history":[{"count":1,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/posts\/355\/revisions"}],"predecessor-version":[{"id":492,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/posts\/355\/revisions\/492"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/media\/381"}],"wp:attachment":[{"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=355"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=355"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=355"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}