gadean
Depp vom Dienst!
Guten Morgen,
ich bräuchte mal wieder etwas Hilfe, heute geht es ums NAT (pf) und jails.
Ich möchte in naher Zukunft bei Hetzner einen Server mieten, Erfahrungen mit BSD sind in so weit vorhanden das ich bei mir Daheim seit mehreren Jahren ein Server betreibe und mit dem m.M.n. ganz gut umgehen kann. Jedoch unterscheidet sich das hosten eines Servers im RZ von dem Daheim, ich sitz nicht hinter einer ded. Firewall und habe nicht die Möglichkeit frei IPs zu nutzen, also habe ich mir erst mal ein Plan aufgestellt was ich will und wie ich es konfigurieren. Dazu hab ich mir eine VM erstellt um alles zu testen.
Was nun neu für mich ist, ist PF (fürs NAT) und das binden der Jails auf ein geklontes Interface ( cloned_interfaces="lo1" ).
Ziel ist das die Jails über jail0 untereinander kommunizieren können und über eth0 nach draußen ge-nat-et werden bzw. eingehende Anfragen auf die entsprechende Jail. Dazu hab ich folgende configs.
/etc/rc.conf
/etc/jail.conf
/etc/pf.conf
Die Regeln funktionieren so nicht richtig, ich komm zwar von der Jail ins Netz, jedoch nicht auf die Jail per ssh (egal von wo - Port: 2143), ändere ich in der markierten Zeile "$if_int" zu "$if_ext" komm ich von außen (andere PCs - nicht vom Host) in die Jail (was ich nicht nachvollziehen kann, die Jails laufen doch übers if "jail0"). Was jedoch gar nicht funktioniert ist die interne Kommunikation (vom Host (10.0.0.1) zur Jail (10.0.0.2:2143) wird geblockt).
Und in der Jail sieht die Ausgabe von "ifconfig" m.M.n. merkwürdig aus:
Könntet Ihr mich evtl. erleuchten? Ist das vorgehen so überhaupt üblich oder würdet ihr das anders lösen? Und wie müssten die Regeln ausschauen damit folgendes funktioniert:
Liebe Grüße
ich bräuchte mal wieder etwas Hilfe, heute geht es ums NAT (pf) und jails.
Ich möchte in naher Zukunft bei Hetzner einen Server mieten, Erfahrungen mit BSD sind in so weit vorhanden das ich bei mir Daheim seit mehreren Jahren ein Server betreibe und mit dem m.M.n. ganz gut umgehen kann. Jedoch unterscheidet sich das hosten eines Servers im RZ von dem Daheim, ich sitz nicht hinter einer ded. Firewall und habe nicht die Möglichkeit frei IPs zu nutzen, also habe ich mir erst mal ein Plan aufgestellt was ich will und wie ich es konfigurieren. Dazu hab ich mir eine VM erstellt um alles zu testen.
Was nun neu für mich ist, ist PF (fürs NAT) und das binden der Jails auf ein geklontes Interface ( cloned_interfaces="lo1" ).
Ziel ist das die Jails über jail0 untereinander kommunizieren können und über eth0 nach draußen ge-nat-et werden bzw. eingehende Anfragen auf die entsprechende Jail. Dazu hab ich folgende configs.
/etc/rc.conf
Code:
#...
## Network
gateway_enable="YES"
gateway_if="eth0"
gateway_ip="192.168.178.1"
ifconfig_em0_name="eth0"
ifconfig_eth0="inet 192.168.178.140 netmask 255.255.255.0"
static_routes="gateway default"
route_gateway="-host $gateway_ip -interface $gateway_if"
route_default="default $gateway_ip"
# Jail-Network
cloned_interfaces="lo1"
ifconfig_lo1_name="jail0"
ifconfig_jail0="inet 10.0.0.1 netmask 255.255.255.0"
ifconfig_jail0_aliases="inet 10.0.0.2 netmask 255.255.255.0"
#...
/etc/jail.conf
Code:
# Startscript (sleep 1 second to prevent races)
exec.start="sleep 1";
exec.start+="/bin/sh /etc/rc";
# Shutdownscript
exec.stop = "/bin/sh /etc/rc.shutdown";
# Execute in a clean environment
exec.clean;
# Devfs
mount.devfs;
# Jail ruleset by default
devfs_ruleset=4;
path = "/tank/jails/$name";
# test1
test1 {
host.hostname = "test1.local";
ip4.addr = "10.0.0.2";
}
/etc/pf.conf
Code:
if_ext = "{ eth0 }"
if_int = "{ jail0 }"
table <rfc1918> persist { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 224.0.0.0/5 }
icmp_types = "echoreq"
open_tcp = "{ 2142, 2143 }"
open_udp = "{ ntp }"
jails = "{ 10.0.0.1, 10.0.0.2 }"
ip = 192.168.178.140
www = 10.0.0.2
set block-policy drop
set skip on lo0
set loginterface eth0
set optimization normal
set require-order yes
set fingerprints "/etc/pf.os"
set ruleset-optimization basic
scrub in all fragment reassemble random-id
rdr on $if_ext proto tcp from any to $if_int port { 2143 } -> $www # wird im Text unten erwähnt
nat on $if_ext proto {tcp udp icmp} from $jails to any -> $ip
block log all
block return
block in quick on $if_ext inet from <rfc1918> to any
antispoof quick for $if_ext
pass in on $if_ext proto tcp from any to any port $open_tcp keep state
pass in on $if_ext proto udp from any to any port $open_udp keep state
pass out quick all keep state
pass in on $if_ext inet proto icmp all icmp-type $icmp_types keep state
pass in on $if_ext inet proto udp from any to any port 33433 >< 33626 keep state
Und in der Jail sieht die Ausgabe von "ifconfig" m.M.n. merkwürdig aus:
Code:
eth0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
ether 00:50:56:29:84:95
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
jail0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
inet 10.0.0.2 netmask 0xffffff00
Könntet Ihr mich evtl. erleuchten? Ist das vorgehen so überhaupt üblich oder würdet ihr das anders lösen? Und wie müssten die Regeln ausschauen damit folgendes funktioniert:
Code:
host = 192.168.178.140 / 10.0.0.1
jail1 = 10.0.0.2
jail2 = 10.0.0.3
# "host der die verbindung aufbaut" -> "ziel host":"ziel port"
externe Anfrage -> host:2142
externe Anfrage -> jail1:2143
externe Anfrage -> jail2:2144
host -> jail1:2143 (nur übers interne if)
jail1 -> jail2:2144 (nur übers interne if)
# usw.
Liebe Grüße