portforwarding funktioniert leider nicht

Nicolinux

Member
Hi,

ich habe versucht unter OpenBSD 3.5 mit pf ein einfaches portforwarding (Port 22) auf einem anderen Rechner im LAN einzurichten. Leider funktioniert es nie - ich sehe weder dass die Pakete geblockt werden noch dass es geht...
Folgender kleiner Auszug aus der pf.conf:
Code:
# Definitions
ext_if = "tun0" 
int_if = "rl0"
int_net = "192.168.0.0/24"
priv_nets = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }"


# nat
nat on $ext_if from $int_if:network to any -> ($ext_if)


# rdr
rdr pass on $ext_if proto tcp from any to any port 22 -> 192.168.0.10 port 22
rdr pass on $ext_if proto tcp from !$int_net to any port 22 -> 192.168.0.10 port 22

Sowohl die erste als auch die zweite rdr Regel hat keine Wirkung. Auf der IP 192.168.0.10 läuft natürlich ein sshd Daemon. Auch kann ich mich direkt von der Firewall darauf verbinden.

Was kann da falsch laufen?

Danke

Grüße
Stefan
 
mmh, wenn ich den auszug so sehe scheint das so zu sein, daß du eine externe (öffentliche?) ip auf einen internen rechner umleiten willst. das kann aber routingtechnisch nicht gehen. du brauchst wenigstens eine binat rule, die die externen adressen auf eine interne umsetzt, damit der sshd-server auch antworten kann.
 
Ich habe nur eine öffentliche IP (die des Routers) und möchte eine Server im privaten LAN von außen erreichen (über den Router). Brauche ich wirklich binat dafür? So weit ich das im PF-Guide sehe würde dann der rechner im LAN auch eine öffentliche IP benötigen. Sollte ich dann bei der binat Regel die öffentliche IP des Routers nehmen?

However - probieren geht über studieren:
Code:
binat on $ext_if from 192.168.0.10 to any -> ($ext_if)

Bringt folgende Fehlermeldung:
Code:
/etc/pf.conf:41: invalid use of interface (tun0) as the redirect address of a binat rule

Danke nochmal
 
und output von:
Code:
pfctl -s nat

ps. wenn man nur eine einzelne IP rdr'en will sollte man nicht binat'en afaik.
 
Zuletzt bearbeitet:
Ok,

hier ist die pf.conf
Code:
#-------------,
# Definitions |
#-------------'
ext_if = "tun0"                         # External interface
int_if = "rl0"                          # Internal interface
int_net = "192.168.0.0/24"              # Internal net
priv_nets = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }"

#---------,
# options |
#---------'
set block-policy return
set loginterface $ext_if


#-------,
# scrub |
#-------'
#scrub log on $ext_if all random-id reassemble tcp


#-----,
# nat |
#-----'
#nat on $ext_if from $int_if:network to any -> ($ext_if)
nat on $ext_if from $int_net to any -> ($ext_if)

#rdr - test
#rdr pass on $ext_if proto tcp from !$int_net to any port 22 -> 192.168.0.10 port 22
rdr pass on $ext_if proto tcp from any to any port 22 -> 192.168.0.10 port 22

#---------------------,
# pass all - UNSAFE!! |
#---------------------'
#pass quick all


#---------------,
# default rules |
#---------------'
#block quick inet6
block log all


#------------------,
# loopback traffic |
#------------------'
pass quick on lo0 all


#----------------------------------------------------,
# block traffic to/from private nets to the internet |
#----------------------------------------------------'
block drop in  quick on $ext_if from $priv_nets to any
block drop out quick on $ext_if from any to $priv_nets


#-------------------------------------------------,
# allow incomming ping requests from the internet |
#-------------------------------------------------'
pass in quick on $ext_if inet proto icmp all icmp-type 8 code 0 keep state


#-------------------------------------------,
# traffic from the firewall to internal net |
#-------------------------------------------'
pass out quick on $int_if from 192.168.0.1 to $int_net keep state


#----------------------------------------------,
# ssh access to the firewall from internal net |
#----------------------------------------------'
pass in quick on $int_if inet proto tcp from $int_net to 192.168.0.1 port 22 flags S/SA keep state


#---------------------------------,
# ping firewall from internal net |
#---------------------------------'
pass in quick on $int_if inet proto icmp from $int_net to 192.168.0.1


#--------------------------------------------------------,
# block any trafic to the firewall from the internal net |
#--------------------------------------------------------'
#block in log on $int_if from any to 192.168.0.1


#------------------------------------------,
# ssh access to the firewall from internet |
#------------------------------------------'
#pass in quick on $ext_if inet proto tcp from any to any port 22 flags S/SA keep state


#-----------------------------,
# net -> firewall -> internet |
#-----------------------------'
pass in  on $int_if proto { udp, tcp, icmp } from $int_net to any keep state
pass out on $ext_if proto { udp, tcp, icmp } from any to any keep state


#-----------------------------------------------------------------,
# state modulation (check for SYN ACK flags, check if SYN is set) |
# for outbound traffic                                            |
#-----------------------------------------------------------------'
pass out on $ext_if proto tcp all modulate state flags S/SA

Die Ausgabe von "pfctl -snat"
Code:
nat on tun0 inet from 192.168.0.0/24 to any -> (tun0) round-robin
rdr on tun0 inet proto tcp from any to any port = ssh -> 192.168.0.10 port 22

Grüße

Stefan
 
warte mal, die rule muß doch heißen:

rdr on $ext_if proto tcp from any to any port 22 -> 192.168.0.10 port 22 und nicht
rdr pass on $ext_if proto tcp from any to any port 22 -> 192.168.0.10 port 22
 
Code:
rdr on $ext_if proto tcp from any to any port 22 -> 192.168.0.10 port 22
wuerde ich eigentlich auch zu:
Code:
rdr on $ext_if proto tcp from any to $ext_ip port 22 -> 192.168.0.10 port 22
machen ($ext_ip muss dann natuerlich einen wert haben).
 
sorry, hab' grad mist erzählt. habe leider keine richtig zeit, da auf arbeit. wenn ich bissel mehr zeit habe, gucke ich mir das nochmal genauer an.
 
sach mal, versuchst du auch wirklich von außen zu testen? hast du auch das redirecting eingeschalten: sysctl net.inet.ip.redirect ???
 
kith schrieb:
Code:
rdr on $ext_if proto tcp from any to any port 22 -> 192.168.0.10 port 22
wuerde ich eigentlich auch zu:
Code:
rdr on $ext_if proto tcp from any to $ext_ip port 22 -> 192.168.0.10 port 22
machen ($ext_ip muss dann natuerlich einen wert haben).

Leider habe ich eine dynamische IP - deswegen kann ich keine Wert dafür eintragen, andererseitz benutze ich einen dyndns client - vielleicht klappt es mit dem hostnamen.

Stefan
 
uwerler schrieb:
sorry, hab' grad mist erzählt. habe leider keine richtig zeit, da auf arbeit. wenn ich bissel mehr zeit habe, gucke ich mir das nochmal genauer an.

Kein problem - bin auch auf der Arbeit gerade und habe keinen Zugriff darauf :)

Stefan
 
uwerler schrieb:
sach mal, versuchst du auch wirklich von außen zu testen? hast du auch das redirecting eingeschalten: sysctl net.inet.ip.redirect ???

Gute Idee - es war mir nicht klar dass man das explizit aktiviren muss. Habe auch noch andere Firewalls installiert - wo das funktioniert und habe diese Variable nicht angerührt.
Ich werde heute Abend nachschauen.

Stefan
 
Nicolinux schrieb:
Gute Idee - es war mir nicht klar dass man das explizit aktiviren muss. Habe auch noch andere Firewalls installiert - wo das funktioniert und habe diese Variable nicht angerührt.
Ich werde heute Abend nachschauen.

Stefan

mmh, muß man wahrscheinlich auch nicht (bin noch nicht so richtig schlau draus geworden. was das genau bedeutet), habe das gerade mal bei mir auf 0 gesetzt - und es geht trotzdem.

ich habe mal ein ganz simples nat und rdr, ähnlich deinem, bei mir probiert - und es geht.
 
ich musste auch noch nie eine sysctl variable dafuer aendern.
ein aehnliches rdr geht bei mir auch problemlos... eigentlich genau das gleiche.
 
Hm,

dann muss ich woanders anfangen nachzuschauen... Ich habe von 3.4 auf 3.5 upgedated. Vielleicht ist da was schief gegangen.
Habt ihr sonst noch eine Idee?

Btw. Es sind ja 2 Netzwerkkarten drin. rl0 ist mit dem internen Netzwerk verbunden, rl1 mit dem DSL Modem. Kann man was mit rl1 anfangen?

Danke

Grüße
Stefan
 
uwerler schrieb:
du kannst natürlich auf rl1 filtern, ist ja das externe interface.
Das laeuft an dieser Stelle ueber das Tunnelinterface tun0 (Tunnel zwischen ISP und dir). Die rl1 hat normalerweise keine IP und ist hinsichtlich des PF "bedeutungslos". Es ist also tun0 zu verwenden.
 
Zuletzt bearbeitet:
Zurück
Oben