Port Forwarding mit pf

lockdoc

Well-Known Member
Hi,

Ich wollte jetzt mal meine www-Jail draussen erreichbar machen. Bis jetzt habe ich mich noch ueberhaupt nicht mit pf beschaeftigt und da rasseln auch schon die Probleme rein.

Bis jetzt versuche ich folgendes
Code:
ext_if="em1"
int_if="em0"

webserver="192.168.0.12"

rdr on $ext_if proto tcp from any to $ext_if port 88 -> $webserver port 80

pass in all
pass out all

Leider ist der apache von aussen via port 88 noch nicht erreichbar.

Da es wirklich Neuland ist, weiss ich auch nicht ob ich ALTQ dafuer zwingend brauche oder nicht
Code:
root> /etc/rc.d/pf onestart
  Enabling pfNo ALTQ support in kernel
  ALTQ related functions disabled
  No ALTQ support in kernel
  ALTQ related functions disabled

root> /etc/rc.d/pf onestatus
No ALTQ support in kernel
ALTQ related functions disabled
Status: Enabled for 0 days 00:00:54           Debug: Urgent

State Table                          Total             Rate
  current entries                      142
  searches                            5145           95.3/s
  inserts                              142            2.6/s
  removals                             111            2.1/s
Counters
  match                               1587           29.4/s
  bad-offset                             0            0.0/s
  fragment                               0            0.0/s
  short                                  0            0.0/s
  normalize                              0            0.0/s
  memory                                 0            0.0/s
  bad-timestamp                          0            0.0/s
  congestion                             0            0.0/s
  ip-option                              2            0.0/s
  proto-cksum                            0            0.0/s
  state-mismatch                         0            0.0/s
  state-insert                           0            0.0/s
  state-limit                            0            0.0/s
  src-limit                              0            0.0/s
  synproxy                               0            0.0/s

Liegt es an dem ALTQ oder an der config?
 
Ich kenne mich mit der alten PF-Syntax nicht so aus, aber es liegt definitiv an der PF-Config. ALTQ brauchst Du dafür nicht!
 
Also ich habe jetzt mal die folgenden Zeilen alle probiert
Code:
rdr on $ext_if proto tcp from any to $ext_if port 88 -> $webserver port 80
rdr on $ext_if proto tcp from any to any port 80 -> 192.168.0.12
rdr on em1 proto tcp from any to any port 80 -> 192.168.0.12
rdr pass on $ext_if proto tcp from any to any port 80 -> 192.168.0.12

Leider ohne Erfolg. Dazu noch:
Ich habe keine statische IP Adresse, sondern bekomme eine via pppoe und lasse zudem dem pppoe das NAT machen. Haengt bei einem dieser Dinge der Fehler?
 
Hier ist tcpdump Dein Freund. Die Frage lautet, wie weit die Pakete kommen. Und dann muss das Paket ja auch wieder zurück. Schau Dir doch einfach mal an, was mit einem Paket an Port 88 geschieht und ob ein passendes an Deinen Web-Server gesendet wird.
Code:
tcpdump -ni em1 port 88
 
Ich habe jetzt mal das internet LAN Interface auf die Jail zeigen lassen. Damit kann ich auf den Server auf port 88 zugreifen und der Webserver der Jail liefert aus. Warum das externe Interface nicht geht ist mir schleierhaft.

Code:
rdr on $int_if proto tcp from any to $int_if port 88 -> $webserver port 80
 
Ok, es geht. Anscheinend ging es die ganze Zeit. Nur wenn ich vom lokalem LAN auf die externe IP zugreife macht der server irgendein voodoo. Sobald ich aber vom Internet auf meine externe IP zugreife klappt der forward
 
Ok, es geht. Anscheinend ging es die ganze Zeit. Nur wenn ich vom lokalem LAN auf die externe IP zugreife macht der server irgendein voodoo. Sobald ich aber vom Internet auf meine externe IP zugreife klappt der forward

Das ist normal. Wenn du z.B. dyndns benutzt, und auf deine externe IP oder deren hostnamen zugreifen willst klappt das nicht. Das wenn du das moechtest, kannst du z.B. dnsmasq (einen sehr einfachen DNS-Server) nehmen und dem sagen, dass er das lokal aufloesen soll (auf die Jail-IP).

edit: du kannst natuerlich auf PF sagen, dass er traffic vom int_if richtung ext_ip port 88 auf jail_ip port 80 umlenken soll, aber wenn sich ext_ip dauernd aendert muss du das immer aktualisieren.
 
Last edited:
Wenn Du aus dem internen Netz auf den Server zugreifst, dann kommst Du über das $Int_if und nicht über das $ext_if. Deshalb greift die Regel nicht.
In OpenBSD kannst Du mit ($ext_if) auf die IP eines Interfaces verweisen. Dann passt sich die Regel sozusagen den geänderten IPs an. Ich weis aber nicht, ob das in der FreeBSD-Version schon geht.
Code:
rdr on $ext_if proto tcp from any to ($ext_if) port 88 -> $webserver port 80
 
Wenn Du aus dem internen Netz auf den Server zugreifst, dann kommst Du über das $Int_if und nicht über das $ext_if. Deshalb greift die Regel nicht.
In OpenBSD kannst Du mit ($ext_if) auf die IP eines Interfaces verweisen. Dann passt sich die Regel sozusagen den geänderten IPs an. Ich weis aber nicht, ob das in der FreeBSD-Version schon geht.
Code:
rdr on $ext_if proto tcp from any to ($ext_if) port 88 -> $webserver port 80

Aktualisiert er das automatisch? Das letzte mal als ich OpenBSD beutzte (3.?) hat er das nur einmal bei Laden der Regel abgegelichen, IIRC.
 
Aktualisiert er das automatisch? Das letzte mal als ich OpenBSD beutzte (3.?) hat er das nur einmal bei Laden der Regel abgegelichen, IIRC.

ja, sonst gäb es auch schwierigkeiten mit NAT:

Code:
match out on $ext_if from $int_if:network nat-to ($ext_if)
 
So da muss ich doch noch mal nachfragen.

Also meine jetzige config ist folgendermassen
Code:
ext_if="tun0"
int_if="em0"
webserver="192.168.0.12"
rdr on $ext_if proto tcp from any to $ext_if port 80 -> $webserver port 80

Das funktioniert einwandfrei und ich komme von aussen auf meinen webserver in der jail.

Allerdings muss ich wohl jeden Tag die pf neu anschmeissen, weil der redirekt nicht mehr funktioniert. Da war meine erste Ueberlegung, dass die Zwangstrennung der Telekom was damit zu tun haben koennte.

ich mache dann immer einfach ein
Code:
/etc/rc.d/pf start
Und alles geht wieder.

Nur moechte ich auch irgendwie, dass es problemlos immer laeuft, ohne jetzt da was in cron reinzufrickeln. Also ich wuerd gern wissen wollen, warum das Problem genau besteht und wie ich da am besten rangehen koennte.

Jemand ne Idee
 
Hi,

dafür kannst Du ja z.B. bei ppp oifach mit /etc/ppp/ppp.linkup bzw. mit /etc/ppp/ppp.linkdown arbeiten und dort z.B. oifach pfctl drin nehmen mit dem richtig Rulefile. Klappt das bei Dir nicht ?

Gruß Bär
 
Code:
ext_if="tun0"
int_if="em0"
webserver="192.168.0.12"
rdr on $ext_if proto tcp from any to $ext_if port 80 -> $webserver port 80

Allerdings muss ich wohl jeden Tag die pf neu anschmeissen, weil der redirekt nicht mehr funktioniert.

Probier doch mal folgendes aus:
Code:
ext_if="tun0"
int_if="em0"
webserver="192.168.0.12"
rdr on $ext_if proto tcp from any to ($ext_if) port 80 -> $webserver port 80

Die Klammern um das Device sagen pf, dass sich die IP ändern kann. Ich weiß nur nicht, ob das auch in der FreeBSD-Version von PF funktioniert oder man eine neuere braucht.
 
Back
Top