Re: Jail, IPFW und reverse NAT

From: Harold Gutch <logix(at)foobar.franken.de>
Date: Thu, 28 Dec 2017 09:01:49 +0100

Hi Peter,

On Thu, Dec 28, 2017 at 11:46:37AM +1100, Peter Ross wrote:
> Hallo Harold,
>
> Leider kann ich das nicht - es sei denn, dass Du den natd verwendest -
> damit kenne ich mich aus.
>
> Ich habe offensichtlich Kernel-NAT verschlafen.. und nachgeguckt, gibt es
> seit 2008 (FreeBSD 7)..
>
> .. aber nicht im Handbuch! (Das hat immer noch natd).

Vielleicht sollte ich es erst mit natd versuchen. Den hab ich vor
langem schon mal benutzt, und dann irgendwann nur noch die interne NAT
Implementation von ppp(8) (und inzwischen gar keins mehr, das NAT
übernimmt wird jetzt von einer anderen "black box" gemacht).

Das hier ist mein erster Versuch mit IPFW Kernel-NAT. Nach meinem
Verständnis konfiguriert man das fast identisch wie NAT mit natd, nur
werden die Pakete nicht an einen Userland-Prozess ausgeliefert der sie
dann umschreibt, sondern das alles wird in-Kernel gelöst. Das
natd-Prinzip fand ich schon immer irgendwie seltsam/unschön, aber es
erfüllte natürlich schon seinen Zweck.

> Vom Lesen her koennte "ip" die Loesung sein?
>
> "ipfw nat 1 config ip a.b.c.d reverse" ?

Vermutlich 127.0.0.2, oder? Das machte aber auch keinen Unterschied.

> Ich bin auf Deine Loesung gespannt, und werde vielleicht mal selbst die
> Tage damit spielen.

Vielleicht probier ich mal natd, das könnte im Zweifelsfall einfacher
zu debuggen sein als Kernel-NAT. An sich könnte ich ja auch pf oder
ipf für das NAT benutzen, aber zwei Paketfilter gleichzeitig zu haben
macht natürlich auch wieder die Fehlersuche schwer. Und soweit ich
weiß gibt es in pf und ipf kein Äquivalent zu "ipfw fwd", für
TCP-Dienste im Jail ist das schon sehr praktisch.

Auf jeden Fall dennoch danke!
  Harold

> Danke
> Peter
>
> On Wed, 27 Dec 2017, Harold Gutch wrote:
>
> >Hi,
> >
> >wenn man ein Jail mit loopback-net IP (z.B. 127.0.0.2) betreibt dann
> >kann man einen TCP-Dienst darin relativ einfach mit einer "ipfw fwd"
> >Regel von der Außenwelt erreichbar machen. Bei einem UDP-Dienst (in
> >diesem Fall named) sieht es aber anders aus. named bindet an
> >127.0.0.2:53, Pakete kommen mit Ziel a.b.c.d:53 (UDP) an, eine ipfw
> >Regel leitet die an den named weiter. Der sieht dass die Pakete
> >Zieladresse a.b.c.d:53 haben, sendet dann via sendmsg() die Antworten
> >mit Quelladresse a.b.c.d:53 zurück und der Kernel meckert mit einem
> >EFAULT weil diese IP-Adresse im Jail nicht verfügbar ist (bei TCP
> >braucht es das alles nicht, da schickt man die Pakete einfach über den
> >Verbindungssocket zurück ohne sich um irgendwelche Adressen zu kümmern
> >und der Kernel übernimmt den Rest).
> >
> >Was also tun? Destination-NAT (reverse NAT) um für einkommende Pakete
> >an UDP a.b.c.d:53 die Zieladresse auf 127.0.0.2:53 umzuschreiben. Nur
> >probiere ich das ganze nun schon ein paar Stunden ohne großen Erfolg.
> >Egal was ich mache, named sieht keine einkommenden Pakete.
> >
> >Was ich versuche ist im Prinzip:
> >
> > ipfw add 100 nat 1 udp from any to a.b.c.d 53
> > ipfw nat 1 config redirect_port udp 127.0.0.2:53 53 reverse
> >
> >(wohlgemerkt, ohne irgendeine "ipfw fwd" Regel), alternativ
> >
> > ipfw nat 1 config redirect_proto udp 127.0.0.2 a.b.c.d reverse
> >
> >oder
> >
> > ipfw nat 1 config redirect_addr 127.0.0.2 a.b.c.d reverse
> >
> >aber nichts davon funktioniert bisher, irgendwo stehe ich also derzeit
> >auf dem Schlauch.
> >
> >Hat irgendjemand vielleicht einen Tipp, einen minimalen Satz an
> >IPFW-Regeln die DNAT zu einem Jail machen? Oder wenn mir jemand
> >alternativ sagt dass (und wieso?) das bei einem Jail so gar nicht
> >funktionieren kann würde das wohl auch helfen.
> >
> >
> >Danke und noch erholsame Tage zum Jahreswechsel,
> > Harold
> >
> >
> >To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
> >with "unsubscribe de-bsd-questions" in the body of the message
> >

To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Thu 28 Dec 2017 - 09:02:00 CET

search this site