Datenhaufen zu IT und Elektronik.

Kategorie: Linux & BSD (Seite 3 von 4)

FreeBSD als IPsec/L2TP-Client für Microsoft Windows Routing und RAS VPN

FreeBSD IPsec L2TP Client to Microsoft Windows Routing RAS Server Diagramm.

Vor einigen Monaten habe ich meinen FreeBSD (damals noch 11 heute 12) Desktop an einen Microsoft Windows Routing und RAS VPN Server angebunden. Das eingesetzte VPN war ein IPsec L2TP. Heute schaffe ich es endlich das Thema mal wegzuschreiben. Grob gesehen ist dieses der Aufbau.

Der FreeBSD Desktop hat dabei die IPv4 Adresse 192.168.10.57, der Windows Routing RAS VPN Server hat den FQDN vpnserver.domain.tld mit der IPv4 88.88.88.88 und der IPsec Tunnel hat den Namen vpnname. Die Netze im Unternehmen sind 172.16.0.0/12 und 10.0.0.0/8.

Tunneltyp ist ein IPsec L2TP an dem Windows „Ding“ mit PSK für den IPsec Tunnel und normaler Dämenenanmeldung über L2TP.

Auf meinem FreeBSD Desktop brauche ich also ipsec für den Tunnel und ich nutze mpd5 für L2TP. Ich „glaube“ l2tpd wäre vielleicht etwas besser, da mpd5 etwas manuelle Arbeit benötigt. Da ich an ein paar anderen Stellen ebenfalls mpd5 nutze und hier ohne Windows auch keine Handarbeit mehr nötig ist…. Es geht mir halt leichter von der Hand 🙂 Insg. ist die gesamte Konfiguration aber sehr einfach.

Meine ipsec Konfiguration sie wie folgt aus:

/usr/local/etc/ipsec.conf

# ipsec.conf - strongSwan IPsec configuration file

# basic configuration

#config setup
	# strictcrlpolicy=yes
	# uniqueids = no

# Add connections here.

# Sample VPN connections

#conn sample-self-signed
#      leftsubnet=10.1.0.0/16
#      leftcert=selfCert.der
#      leftsendcert=never
#      right=192.168.0.2
#      rightsubnet=10.2.0.0/16
#      rightcert=peerCert.der
#      auto=start

#conn sample-with-ca-cert
#      leftsubnet=10.1.0.0/16
#      leftcert=myCert.pem
#      right=192.168.0.2
#      rightsubnet=10.2.0.0/16
#      rightid="C=CH, O=Linux strongSwan CN=peer name"
#      auto=start

config setup

conn %default
        ikelifetime=60m
        keylife=20m
        rekeymargin=3m
        keyingtries=1
        keyexchange=ikev1
        authby=psk

conn vpnname
        type=transport
        leftfirewall=yes
        right=vpnserver.domain.tld
        rightid = %any
        rightsubnet=0.0.0.0/0
        auto=add
        left=%defaultroute
        leftprotoport=17/%any
        rightprotoport=17/1701
        ike=3des-sha1-modp1024!
        esp=3des-sha1
        modeconfig=push

Der PSK steht in der /usr/local/etc/ipsec.secrets

# ipsec.secrets - strongSwan IPsec secrets file
vpnserver.domain.tld %any : PSK "abcdefg1234567"

Den IPsec Tunnel baut man nun einfach wie folgt auf:

root@errortest:~ # ipsec up vpnname
initiating Main Mode IKE_SA vpnname[20] to 88.88.88.88
generating ID_PROT request 0 [ SA V V V V V ]
sending packet: from 192.168.10.57[500] to 88.88.88.88[500] (176 bytes)
received packet: from 88.88.88.88[500] to 192.168.10.57[500] (208 bytes)
parsed ID_PROT response 0 [ SA V V V V V V ]
received MS NT5 ISAKMPOAKLEY vendor ID
received NAT-T (RFC 3947) vendor ID
received draft-ietf-ipsec-nat-t-ike-02\n vendor ID
received FRAGMENTATION vendor ID
received unknown vendor ID: fb:1d:e3:cd:f3:41:b7:ea:16:b7:e5:be:08:55:f1:20
received unknown vendor ID: e3:a5:96:6a:76:37:9f:e7:07:22:82:31:e5:ce:86:52
selected proposal: IKE:3DES_CBC/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
generating ID_PROT request 0 [ KE No NAT-D NAT-D ]
sending packet: from 192.168.10.57[500] to 88.88.88.88[500] (244 bytes)
received packet: from 88.88.88.88[500] to 192.168.10.57[500] (260 bytes)
parsed ID_PROT response 0 [ KE No NAT-D NAT-D ]
local host is behind NAT, sending keep alives
generating ID_PROT request 0 [ ID HASH ]
sending packet: from 192.168.10.57[4500] to 88.88.88.88[4500] (68 bytes)
received packet: from 88.88.88.88[4500] to 192.168.10.57[4500] (68 bytes)
parsed ID_PROT response 0 [ ID HASH ]
IKE_SA vpnname[20] established between 192.168.10.57[192.168.10.57]...88.88.88.88[88.88.88.88]
scheduling reauthentication in 3402s
maximum IKE_SA lifetime 3582s
generating QUICK_MODE request 2082742542 [ HASH SA No ID ID NAT-OA NAT-OA ]
sending packet: from 192.168.10.57[4500] to 88.88.88.88[4500] (220 bytes)
received packet: from 88.88.88.88[4500] to 192.168.10.57[4500] (212 bytes)
parsed QUICK_MODE response 2082742542 [ HASH SA No ID ID NAT-OA NAT-OA ]
selected proposal: ESP:3DES_CBC/HMAC_SHA1_96/NO_EXT_SEQ
CHILD_SA vpnname{38} established with SPIs c387d93f_i 4720cab6_o and TS 192.168.10.57/32[udp] === 88.88.88.88/32[udp/l2f]
connection 'vpnname' established successfully

Ob der IPsec Tunnel steht sieht man mit:

root@errortest:~ # ipsec statusall
Status of IKE charon daemon (strongSwan 5.7.1, FreeBSD 12.0-RELEASE-p3, amd64):
  uptime: 12 hours, since Apr 03 21:26:07 2019
  worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 5
  loaded plugins: charon aes des blowfish rc2 sha2 sha1 md4 md5 random nonce x509 revocation constraints pubkey pkcs1 pkcs7 pkcs8 pkcs12 pgp dnskey sshkey pem openssl fips-prf curve25519 xcbc cmac hmac curl attr kernel-pfkey kernel-pfroute resolve socket-default stroke vici updown eap-identity eap-md5 eap-mschapv2 eap-tls eap-ttls eap-peap xauth-generic whitelist addrblock counters
Listening IP addresses:
  2003:88:53dd:a800:eef4:bbff:fe47:c54c
  fd00::eef4:bbff:fe47:c54c
  192.168.10.57
Connections:
      vpnname:  %any...vpnserver.domain.tld  IKEv1
      vpnname:   local:  [192.168.10.57] uses pre-shared key authentication
      vpnname:   remote: uses pre-shared key authentication
      vpnname:   child:  dynamic[udp] === 0.0.0.0/0[udp/l2f] TRANSPORT
Security Associations (1 up, 0 connecting):
      vpnname[20]: ESTABLISHED 14 seconds ago, 192.168.10.57[192.168.10.57]...88.88.88.88[88.88.88.88]
      vpnname[20]: IKEv1 SPIs: 8d3cfef7264b42cc_i* 0d322a1593a9db84_r, pre-shared key reauthentication in 56 minutes
      vpnname[20]: IKE proposal: 3DES_CBC/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
      vpnname{38}:  INSTALLED, TRANSPORT, reqid 10, ESP in UDP SPIs: c387d93f_i 4720cab6_o
      vpnname{38}:  3DES_CBC/HMAC_SHA1_96, 0 bytes_i, 0 bytes_o, rekeying in 14 minutes
      vpnname{38}:   192.168.10.57/32[udp] === 88.88.88.88/32[udp/l2f]

Jetzt fehlt also nur noch L2TP, meine mpd5 Konfiguration sieht dabei so aus /usr/local/etc/mpd5/mpd.conf :

startup:
      # Set web self 127.0.0.1 5008
      # Set user vpntest vpntest admin
      # Set web open
log +ALL +EVENTS -FRAME -ECHO
default:
      load L2TP_client

L2TP_client:
    create bundle static B1
	set iface up-script /home/kernel/vpnname-up.sh
	set iface down-script /home/kernel/vpnname-down.sh
	set bundle enable crypt-reqd
	set bundle enable compression
	set bundle enable ipv6cp
	set ccp yes mppc
	set mppc no e40 e56
	set mppc yes e128 stateless
	set ipcp ranges 0.0.0.0/0 0.0.0.0/0
	set ipcp enable req-pri-dns
	set ipcp enable req-sec-dns
	set iface route 172.16.0.0/12
	set iface route 10.0.0.0/8
	set iface enable tcpmssfix



    create link static L1 l2tp
    set link action bundle B1
    set auth authname "AD-USERNAME"
    set auth password "AD-PASSWORD"
    set link max-redial 0
    set link mtu 1400
    set link keep-alive 20 75
    set link accept chap-msv2
	set link no pap eap


    set l2tp peer vpnserver.domain.tld
    open

Einfach starten mit:

root@errortest:/ # mpd5
Multi-link PPP daemon for FreeBSD

process 10142 started, version 5.8 (root@120amd64-quarterly-job-15 02:54  8-Feb-2019)
[B1] Bundle: Interface ng0 created
[L1] [L1] Link: OPEN event
[L1] LCP: Open event
[L1] LCP: state change Initial --> Starting
[L1] LCP: LayerStart
L2TP: Initiating control connection 0x800caa310 0.0.0.0 0 <-> 88.88.88.88 1701
L2TP: Control connection 0x800caa310 192.168.10.57 38844 <-> 88.88.88.88 1701 connected
[L1] L2TP: Incoming call #7540000 via control connection 0x800caa310 initiated
[L1] L2TP: Call #7540000 connected
[L1] Link: UP event
[L1] LCP: Up event
[L1] LCP: state change Starting --> Req-Sent
[L1] LCP: SendConfigReq #1
[L1]   ACFCOMP
[L1]   PROTOCOMP
[L1]   MRU 1500
[L1]   MAGICNUM 0x2d8654b6
[L1] LCP: SendConfigReq #2
[L1]   ACFCOMP
[L1]   PROTOCOMP
[L1]   MRU 1500
[L1]   MAGICNUM 0x2d8654b6
[L1] LCP: rec'd Configure Request #0 (Req-Sent)
[L1]   MRU 1400
[L1]   AUTHPROTO EAP
[L1]   MAGICNUM 0x74943399
[L1]   PROTOCOMP
[L1]   ACFCOMP
[L1]   CALLBACK 6
[L1]   MP MRRU 1614
[L1]   ENDPOINTDISC [LOCAL] 01 d0 15 a9 b4 71 4f f4 a0 97 8e 3c e4 ef 93 d7 00 00 0
[L1] LCP: SendConfigRej #0
[L1]   CALLBACK 6
[L1]   MP MRRU 1614
[L1] LCP: rec'd Configure Ack #2 (Req-Sent)
[L1]   ACFCOMP
[L1]   PROTOCOMP
[L1]   MRU 1500
[L1]   MAGICNUM 0x2d8654b6
[L1] LCP: state change Req-Sent --> Ack-Rcvd
[L1] LCP: rec'd Configure Request #1 (Ack-Rcvd)
[L1]   MRU 1400
[L1]   AUTHPROTO EAP
[L1]   MAGICNUM 0x74943399
[L1]   PROTOCOMP
[L1]   ACFCOMP
[L1]   ENDPOINTDISC [LOCAL] 01 d0 15 a9 b4 71 4f f4 a0 97 8e 3c e4 ef 93 d7 00 00 0
[L1] LCP: SendConfigNak #1
[L1]   AUTHPROTO CHAP MSOFTv2
[L1] LCP: rec'd Configure Request #2 (Ack-Rcvd)
[L1]   MRU 1400
[L1]   AUTHPROTO CHAP MSOFTv2
[L1]   MAGICNUM 0x74943399
[L1]   PROTOCOMP
[L1]   ACFCOMP
[L1]   ENDPOINTDISC [LOCAL] 01 d0 15 a9 b4 71 4f f4 a0 97 8e 3c e4 ef 93 d7 00 00 0
[L1] LCP: SendConfigAck #2
[L1]   MRU 1400
[L1]   AUTHPROTO CHAP MSOFTv2
[L1]   MAGICNUM 0x74943399
[L1]   PROTOCOMP
[L1]   ACFCOMP
[L1]   ENDPOINTDISC [LOCAL] 01 d0 15 a9 b4 71 4f f4 a0 97 8e 3c e4 ef 93 d7 00 00 0
[L1] LCP: state change Ack-Rcvd --> Opened
[L1] LCP: auth: peer wants CHAP, I want nothing
[L1] LCP: LayerUp
[L1] CHAP: rec'd CHALLENGE #0 len: 26
[L1]   Name: "VPN-SERVER"
[L1] CHAP: Using authname "AD-USERNAME"
[L1] CHAP: sending RESPONSE #0 len: 60
[L1] CHAP: rec'd SUCCESS #0 len: 46
[L1]   MESG: S=39CCB87E756B7996C5A261EEC4CA14D30E4616E0
[L1] LCP: authorization successful
[L1] Link: Matched action 'bundle "B1" ""'
[L1] Link: Join bundle "B1"
[B1] Bundle: Status update: up 1 link, total bandwidth 64000 bps
[B1] IPCP: Open event
[B1] IPCP: state change Initial --> Starting
[B1] IPCP: LayerStart
[B1] IPV6CP: Open event
[B1] IPV6CP: state change Initial --> Starting
[B1] IPV6CP: LayerStart
[B1] CCP: Open event
[B1] CCP: state change Initial --> Starting
[B1] CCP: LayerStart
[B1] IPCP: Up event
[B1] IPCP: state change Starting --> Req-Sent
[B1] IPCP: SendConfigReq #1
[B1]   IPADDR 0.0.0.0
[B1]   COMPPROTO VJCOMP, 16 comp. channels, no comp-cid
[B1]   PRIDNS 0.0.0.0
[B1]   SECDNS 0.0.0.0
[B1] IPV6CP: Up event
[B1] IPV6CP: state change Starting --> Req-Sent
[B1] IPV6CP: SendConfigReq #1
[B1] CCP: Up event
[B1] CCP: state change Starting --> Req-Sent
[B1] CCP: SendConfigReq #1
[B1]   MPPC
[B1]     0x01000040:MPPE(128 bits), stateless
[B1] IPV6CP: rec'd Configure Request #4 (Req-Sent)
[B1] IPV6CP: SendConfigAck #4
[B1] IPV6CP: state change Req-Sent --> Ack-Sent
[B1] CCP: rec'd Configure Request #5 (Req-Sent)
[B1]   MPPC
[B1]     0x01000001:MPPC, stateless
[B1] CCP: SendConfigNak #5
[B1]   MPPC
[B1]     0x01000040:MPPE(128 bits), stateless
[B1] IPCP: rec'd Configure Request #6 (Req-Sent)
[B1]   IPADDR 10.16.100.13
[B1]     10.16.100.13 is OK
[B1] IPCP: SendConfigAck #6
[B1]   IPADDR 10.16.100.13
[B1] IPCP: state change Req-Sent --> Ack-Sent
[B1] IPCP: rec'd Configure Reject #1 (Ack-Sent)
[B1]   COMPPROTO VJCOMP, 16 comp. channels, no comp-cid
[B1] IPCP: SendConfigReq #2
[B1]   IPADDR 0.0.0.0
[B1]   PRIDNS 0.0.0.0
[B1]   SECDNS 0.0.0.0
[B1] IPV6CP: rec'd Configure Ack #1 (Ack-Sent)
[B1] IPV6CP: state change Ack-Sent --> Opened
[B1] IPV6CP: LayerUp
[B1]   eef4:bbff:fe47:c54c -> e467:e46a:5b1f:dfc1
[B1] IFACE: Up event
[B1] CCP: rec'd Configure Ack #1 (Req-Sent)
[B1]   MPPC
[B1]     0x01000040:MPPE(128 bits), stateless
[B1] CCP: state change Req-Sent --> Ack-Rcvd
[B1] CCP: rec'd Configure Request #7 (Ack-Rcvd)
[B1]   MPPC
[B1]     0x01000040:MPPE(128 bits), stateless
[B1] CCP: SendConfigAck #7
[B1]   MPPC
[B1]     0x01000040:MPPE(128 bits), stateless
[B1] CCP: state change Ack-Rcvd --> Opened
[B1] CCP: LayerUp
[B1] CCP: Compress using: mppc (MPPE(128 bits), stateless)
[B1] CCP: Decompress using: mppc (MPPE(128 bits), stateless)
[B1] IPCP: rec'd Configure Nak #2 (Ack-Sent)
[B1]   IPADDR 10.16.100.34
[B1]     10.16.100.34 is OK
[B1]   PRIDNS 10.16.0.53
[B1]   SECDNS 10.16.0.52
[B1] IPCP: SendConfigReq #3
[B1]   IPADDR 10.16.100.34
[B1]   PRIDNS 10.16.0.53
[B1]   SECDNS 10.16.0.52
[B1] IPCP: rec'd Configure Ack #3 (Ack-Sent)
[B1]   IPADDR 10.16.100.34
[B1]   PRIDNS 10.16.0.53
[B1]   SECDNS 10.16.0.52
[B1] IPCP: state change Ack-Sent --> Opened
[B1] IPCP: LayerUp
[B1]   10.16.100.34 -> 10.16.100.13

Ob alles steht sieht man ebenfalls mit ifconfig :

ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> metric 0 mtu 1396
	inet6 fe80::eef4:bbff:fe47:c54c%ng0 prefixlen 64 scopeid 0x3
	inet 10.16.100.34 --> 10.16.100.13 netmask 0xffffffff
	nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>

Damit sollte auch schon der Tunnel stehen.

Der Windows VPN Server übermittelt zwar eigentlich die Routen, DNS Server usw., dieses nimmt der mpd5 aber nicht alles gut an. Das meinte ich mit manueller Handarbeit. Sicher nichts für die Masse aber wenn man als Admin „ran“ möchte sicher kein größeres Problem. set ccp yes mppc activiert hierbei die MPPC Komprimierung und Verschlüsselung. set mppc yes e128 stateless ist dabei für die Zusammenarbeit mit dem Windows Server wichtig, denn e128 / stateless ermöglicht als einzige Option die Zusammenarbeit mit MS-CHAPv2 (was hier zum Einsatz kommt). Per IPCP frage ich zwar die Konfiguration wie die ersten beiden DNS-Server ab ( set ipcp enable req-pri-dns / set ipcp enable req-sec-dns ), aktuell mache ich aber damit nichts. Diese Werte werden automatisch mit an die iface up-scripte/down-scripte übermittelt und könnten dort mitbenutzt werden, da ich nur eine solche Verbindung habe und die DNS Konfiguration kenne, nutze die die up/down-scripte nur um die jeweilige /etc/resolv.conf zu kopieren.

Mit den Routen ist es ähnlich, ich kenne die Routen und kann sie also einfach mitgeben: set iface route 172.16.0.0/12 / set iface route 10.0.0.0/8 diese Liste kann nach Belieben eingepasst werden.

Wie gesagt, alles sehr einfach und überschaubar.

Ich starte IPsec und in folge mpd5 meist von Hand, wenn ich es mal brauche, man kann aber auch alles per Dienst starten lassen oder sich irgendeinen Startknopf bauen.

Fragen? Dann fragen!

Postfix: E-Mail-Verschleierung gezielt einrichten

Um sich vor Angreifern zu schützen ist ein ganz gutes Mittel, dem Angreifer nicht direkt zu erzählen welche Software genau und in welcher Version man diese einsetzte. Bei Webservern ist dieses fast überall gängige Praxis, meist bekommt man nur noch das Produkt angezeigt. Oder wie bei einem Kollegen nur YOUR MUM. Warum ist das nun ggf. hilfreich? Ganz simples Beispiel. Man setzt einen verwundbaren Mailclient auf seinem Desktop ein, oder hat einen phpmailer (*würk*) in seiner Webseite eingebaut. Versendet man über diesen nun eine E-Mail schreibt er meist seinen eigenen Namen mit der eingesetzten Version in die E-Mail Header. Copy & Paste fertig für einen möglichen Angreifer, damit er die „Bugzilla Page“ nach den brauchbarsten Löchern durchwühlen kann. Dann muss er nur noch eine passende präparierte E-Mail schreiben und der Client wird leiden.

Ähnlich ist es mit den IP Adressen. Die IP Adresse des Clients landet ebenfalls in den Mail Headern. So hat der Angreifer schon mal eine Idee über die Netztopologie oder es gibt ihm ggf. eine Möglichkeit den Benutzer durch verschiedene Netze zu „tracken“.

Beides lässt sich über die smtp_header_checks etwas entschärfen. Über diesen Weg kann man per RegEx bestimmte Mail Header heraussuchen und löschen oder nach eigenem Ermessen ersetzten.

Hier der Eintrag für die main.cf:

root@smtp:/usr/local/etc/postfix # postconf smtp_header_checks
smtp_header_checks = pcre:/usr/local/etc/postfix/header_cleanup

Hier das Beispiel für die /usr/local/etc/postfix/header_cleanup:

/^(Received: from)[^\n]*(.*)/ REPLACE $1 ::88 (YOUR MOM [::88])$2
/^X-Originating-IP/ IGNORE
/^User-Agent*(.*)/ REPLACE User-Agent: YOUR MOMS MAILER
/^X-Mailer*(.*)/ REPLACE X-Mailer: YOUR MOMS MAILER

Im Ergebnis sieht es dann wie folgt aus:

[...]
Received: from ::88 (YOUR MOM [::88])
	(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))
	(No client certificate requested)
	by smtp.kernel-error.de (Postfix) with ESMTPSA id 7458E7B802
	for <wurst@example.com>; Wed, 27 Mar 2019 21:44:10 +0100 (CET)
[...]
X-Mailer: YOUR MOMS MAILER
[...]

Ganz wichtig ist natürlich die Frage ob dabei Signaturen gebrochen werden; das werden sie nicht. Auch DKIM usw. nicht.

Dann mal viel Spaß!

Postfix-Fehlerantworten anpassen: So gehst du vor

Wieder wurde ich gefragt wie ich bei meinem Postfix den Error Reply für rejected 5xx E-Mails geändert habe. Nun ja, das habe ich überhaupt nicht.

Postfix hat seit vielen Jahren die Option: smtpd_reject_footer diese wurde in 2011 beim „Aufräumen“ umbenannt in: smtpd_reject_footer

Cleanup: smtpd_reject_contact_information is renamed to smtpd_reject_footer, because it can be used for non-contact information.

Beide Optionen sind anscheinend eher unbekannt. Was ich gut verstehen kann. Denn setzt man nun in seiner main.cf den smtpd_reject_footer wird diese zwar brav angehangen und taucht sogar beim Absender im Postfach auf, nur welcher Benutzer liest diese schon und folgt dann noch dem jeweiligen Hinweis? Bisher ist diese Rückmeldung meines Systems nur sehr wenigen überhaupt aufgefallen ;-P

Vor ~12 Jahren habe ich sie wohl zum ersten Mal gesetzt. Ich meine da auf die Adresse vom Postmaster verwiesen zu haben, damit die Nutzer sich dort hin melden können. Später hatte ich mal einen Link auf eine zweisprachige Hilfeseite bei mir und noch später etwas wie: „Das Problem ist zu 99% dein Mailserver, frag DEINEN Admin!“. Dieses war es bis heute, denn heute habe ich die erneute Frage zum Anlass genommen, dieses hier zu schreiben und natürlich direkt auf riot.im zu verlinken. Dann kann man mich direkt anschreiben. Sicher etwas freundlicher als: „geh weg du bist eh das Problem“ und einfacher als noch eine E-Mail an den Postmaster zu schreiben. Sicher werde ich nun durch diese Nachricht 1 oder 2 mal im Jahr angeschrieben, wenn es dieses überhaupt wird.

Achja, so sieht der Eintrag in der main.cf von Postfix aus:

root@smtp:/usr/local/etc/postfix # postconf smtpd_reject_footer
smtpd_reject_footer = For assistance, visit https://matrix.to/#/@kernel-error:kernel-error.com

Damit lässt sich nun dieses Ergebnis erzielen:

banane@bsd03:~ # telnet smtp.kernel-error.de 25
Trying 2a01:4f8:150:1095::25...
Connected to smtp.kernel-error.de.
Escape character is '^]'.
220 smtp.kernel-error.de ESMTP Postfix
helo asdf
250 smtp.kernel-error.de
mail from: <test@spam.de>
250 2.1.0 Ok
rcpt to: <spamlover@kernel-error.com>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
subject: test
.test
.
554-5.7.1 Spam message rejected
554 5.7.1 For assistance, visit https://matrix.to/#/@kernel-error:kernel-error.com
Connection closed by foreign host.

Fragen? Dann wie immer bitte fragen…

Postfix MTA-STS Resolver für FreeBSD mit Logfile einrichten

Ich habe heute auch mal den postfix-mta-sts-resolver auf meinem privaten System zugeschaltet. Einfach um es mal zu „probieren“.

Tut einfach und wie beschrieben, ist so aber sicher nicht für größeren und produktiven Betrieb gedacht. So wie der resolver kommt schreibt er alle Meldungen leider nur in die Konsole, es gibt keinen File-Logger. Ich ähm will/brauch den aber!

Also habe ich einen Fork erstellt und ihn überredet in eine Datei zu loggen und direkt noch ein sehr rudimentäres rc.d init script beigelegt: https://github.com/Kernel-Error/postfix-mta-sts-resolver

Wer es also ebenfalls mal probieren möchte, viel Spaß.

Der mta-sts-daemon loggt nun per default in /var/log/mta-sts.log. Config über yml ist ebenfalls nun drin genau wie die Konfiguration per Startparameter. Das rc.d script für FreeBSD könnte sicher schöner sein und hätte gerne im default den Benutzer mta-sts im System. Wir wollen es ja nicht als Root laufen lassen, hm?

Das einzelne Programm mta-sts-query greift auf den gleichen Logger zu, gibt damit also nichts mehr in der Konsole aus sondern auch im Logfile. Vielleicht passe ich dieses noch an, wenn dann mache ich auch einen pull request. Sonst gehe ich mal davon aus, dass es eh bald im postifx ist *daumen-drück*


Update

Habe ich jetzt gemacht. Pullrequest wurde angenommen und das neue Release ist auch schon gemacht. Jetzt also mit Logfile und rc.d script für FreeBSD.

Fragen? Dann fragen 🙂

SMTP MTA-STS: Strict Transport Security für deinen Mailserver

Haben wir uns schon über MTA STS / RFC 8461 unterhalten? Nicht? Dann dann wird es aber Zeit 🙂

MTA STS ist ein RFC von Ende 2018. So kann man eine Policy veröffentlichen um anderen Mailservern mitzuteilen, dass man seine E-Mails bitte nur per TLS (also mit Transportverschlüsselung) erhalten möchte und an welchen MX…

Eine ganz nette Idee nur…. Wenn man keine E-Mail ohne Transportverschlüsselung erhalten möchte, dann könnte man ja einfach keine E-Mails ohne Transportverschlüsselung annehmen?!?!? Natürlich sagt man anderen Mailservern zusätzlich noch an welchen sie bitte die Mails zustellen sollen, das es eine Transportverschlüsselung geben muss und alles nur mit einem gültigen Zertifikat ablaufen kann.

Fehlt da nicht noch etwas? Klar reporting… Dazu gibt es im Moment ein RFC: SMTP TLS Reportingdraft-ietf-uta-smtp-tlsrpt-23

Ein einfaches Onlinetool zum Testen gibt es ebenfalls: MTA-STS validator

Was muss man dafür nun tun? Ohne Frage muss der eigene Mailserver sauber TLS sprechen… Dann wirfst man einen TXT RR in die jeweilige DNS Zone:

$ dig IN TXT _mta-sts.kernel-error.de +short
"v=STSv1;id=20190202111557Z;"

Die eigentliche Policy veröffentlich man nun per Webserver jeweils für die Zone unter: mta-sts.domain.tld https://mta-sts.kernel-error.de/.well-known/mta-sts.txt

Das Reporting lässt sich ebenfalls schnell per TXT RR in der DNS Zone einrichten:

$ dig IN TXT _smtp._tls.kernel-error.de +short
"v=TLSRPTv1;rua=mailto:postmaster@kernel-error.de"

Beides ist sehr schnell und einfach eingerichtet. Postfix selbst berücksichtigt dieses leider noch nicht. Es gibt natürlich schon eine Implementierung, welche ich persönlich noch nicht ganz glücklich finde. Wer schon mal schauen will: https://github.com/Snawoot/postfix-mta-sts-resolver

Fragen? Dann einfach mal fragen 🙂

TLS 1.3 für Postfix & Dovecot: Einrichtung und Konfiguration​

Sowohl mein Postfix als auch der Dovecot sprechen nun sauber TLS 1.3.

Wenn Postfix sowie Dovecot sauber gegen OpenSSL 1.1.1 gebaut sind fehlen nur zwei Configänderungen.

Dovecot spricht es meist sofort wenn man hier die minimale TLS Version ind der 10-ssl.conf:

ssl_min_protocol = TLSv1.1

Beim Postfix setzt man einfach die zu nutzenden TLS Versionen in der main.cf:

smtpd_tls_protocols = TLSv1.3, TLSv1.2, !TLSv1.1, !TLSv1, !SSLv2, !SSLv3
smtp_tls_protocols = TLSv1.3, TLSv1.2, !TLSv1.1, !TLSv1, !SSLv2, !SSLv3
smtpd_tls_mandatory_protocols = TLSv1.3, TLSv1.2, !TLSv1.1, !TLSv1, !SSLv2, !SSLv3
smtp_tls_mandatory_protocols = TLSv1.3, TLSv1.2, !TLSv1.1, !TLSv1, !SSLv2, !SSLv3

Schon spricht Postfix TLS 1.3 mit anderen Server und beide Dienste sind in der Lage dieses mit Clients zu sprechen!

Test für smtp:

$ openssl s_client -starttls smtp -crlf -connect smtp.kernel-error.de:25
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 3944 bytes and written 404 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 4096 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---

Test für imap:

$ openssl s_client -connect imap.kernel-error.de:993 -crlf
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 3944 bytes and written 404 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 4096 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---

So sieht ein Logfile doch schon viel mehr nach 2019 aus, oder?

Feb 15 16:05:43 smtp postfix/smtp[7475]: Verified TLS connection established to mx1.freebsd.org[2610:1c1:1:606c::19:1]:25: TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256

Bei Fragen, einfach fragen 🙂

FreeBSD Kernel Quellen installieren | How to install FreeBSD kernel sources

Wie immer wenn mich eine Frage oft erreicht, gibt es hier dazu eine kurze Erklärung. Dieser Beitrag wird wirklich extrem kurz, denn um die Kernel Quellen für sein FreeBSD zu installieren nutze ich selbst immer folgenden Einzeiler:

# sudo svn checkout https://svn.freebsd.org/base/releng/`uname -r | cut -d'-' -f1,1` /usr/src

Tja, ich sag doch… Einfach und kurz 🙂 Viel Spaß

root@errortest:/etc/X11 # cd /usr/ports/graphics/drm-current-kmod/ && make install clean
===>  drm-current-kmod-4.16.g20190430 requires kernel source files in /usr/src.
*** Error code 1

Stop.
make: stopped in /usr/ports/graphics/drm-current-kmod

FreeBSD 11.1 Jail auf 11.2 upgraden: Lösungen für häufige Probleme

Nachdem FreeBSD 11.2 nun aktuell ist wurde es natürlich Zeit alles auf diese Version zu haben. FreeBSD macht es einem zum Glück sehr einfach mittels freebsd-update.

Ein Upgrade auf eine neue Version sieht im Groben immer so aus:

root@hostname:/ # freebsd-update -r 11.1-RELEASE upgrade
root@hostname:/ # freebsd-update install
root@hostname:/ # reboot
root@hostname:/ # freebsd-update install
root@hostname:/ # Alle möglichen Programme auf den aktuellen Stand bringen (aus den ports oder die fertigen Pakete mit pkg).
root@hostname:/ # freebsd-update install
root@hostname:/ # fertig.. (vielleicht noch zpool upgrade)

FreeBSD trennt (ganz grob gesehen) das eigentliche System und die Anwendungen. Man zerlegt sich also nicht so leicht wie mit einem „dist upgrade“ sein System. Zusammen mit Boot Environments wie in Solaris und auch der Rollbackfunktion kommt man eigentlich immer schnell wieder auf ein sauberes System, wenn wirklich mal etwas schief gehen sollte.

Setzt man auf kein spezielles Management für seine Jails kommen die Jails über den gleichen Weg auf die neue Version.

root@hostname:/ # service jail status
 JID             IP Address      Hostname                      Path
 test            10.18.10.200   test.test          /zroot/jails/test
root@hostname:/ # freebsd-update -r 11.2-RELEASE upgrade -b /zroot/jails/test
root@hostname:/ # freebsd-update install -b /zroot/jails/test
root@hostname:/ # service jail restart test
Stopping jails: test.
Starting jails: test.
root@hostname:/ # freebsd-update install -b /zroot/jails/test
root@hostname:/ # Alle möglichen Programme auf den aktuellen Stand bringen (aus den ports oder die fertigen Pakete mit pkg).
root@hostname:/ # freebsd-update install -b /zroot/jails/test
root@hostname:/ # fertig..

Leider war in meinem Fall freebsd-update fest davon überzeugt, dass die Jail schon auf Version 11.2 ist. War die Jail aber nicht:

root@hostname:/ # jexec test freebsd-version
11.1-RELEASE-p9

Man kann freebsd-update in solchen Fällen fest vorgeben welche Version aktuell in der Jail läuft und so dieses Problem erschlagen:

root@hostname:/ # freebsd-update -b /zroot/jails/test --currently-running 11.1-RELEASE-p9 -r 11.2-RELEASE upgrade

Zack schon ist alles auf der richtigen Version 😀

OpenPOWER-Testsystem mit POWER8-CPU von Thomas-Krenn im Detail​

Die netten Leute von Thomas Krenn haben uns ihr OpenPower Testsystem zur Verfügung gestellt \o/ Wir wollten dieses System schon etwas länger in die Finger bekommen. Jetzt hat es endlich geklappt!

Der Server verballert mit seinen zwei 1200 Watt Netzteilen in der Spitze etwas um 370Watt (im normalen Betrieb etwas um die 230Watt) und soll laut TK 1.325 BTU/h produzieren.

Verbaut sind 128GB RAM und natürlich eine Power8 CPU:

root@ubuntu:/home/tk# lscpu
Architecture:          ppc64le
Byte Order:            Little Endian
CPU(s):                64
On-line CPU(s) list:   0-63
Thread(s) per core:    8
Core(s) per socket:    8
Socket(s):             1
NUMA node(s):          1
Model:                 2.0 (pvr 004d 0200)
Model name:            POWER8 (raw), altivec supported
CPU max MHz:           3857.0000
CPU min MHz:           2061.0000
Hypervisor vendor:     horizontal
Virtualization type:   full
L1d cache:             64K
L1i cache:             32K
L2 cache:              512K
L3 cache:              8192K
NUMA node0 CPU(s):     0-63

OS ist ein Ubuntu:

root@ubuntu:/home/tk# lsb_release -a          
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 16.04.4 LTS
Release:	16.04
Codename:	xenial

Die im Testsystem mitgelieferten Festplatten (3,5″ Nearline SAS mit 7,2k) waren für unseren Datenbanktest etwas zu langsam, daher haben wir ein paar ältere 15k 2,5″ Platten aus unserem Lager verbaut und diese in ein Raid 10 geworfen. Damit ist das lokale Storage-Backend nun laut pg_test_fsync vergleichbar mit unseren anderen Testsystemen. Wir wollen ja sehen welche CPU "schneller" ist und nicht welche Festplatte am meisten "bremst".

So „einfach“ ist es nicht zu sagen welche CPU nun wirklich schneller ist als eine andere. Ich habe als erstes versucht ein paar alltägliche Dinge miteinander zu vergleichen:

 CPU SHA256-hashing 500 MB bzip2-compressing 500 MB AES-encrypting 500 MB 
 2 x Intel(R) Xeon(R) CPU E5-2665 0 @ 2.40GHz 3.859 seconds 5.445 seconds 1.337 seconds
 1 x Power8 2.0 (pvr 004d 0200) 3.803 seconds 7.868 seconds 0.866 seconds
 1 x Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz 2.370 seconds 4.207 seconds 0.831 seconds
 2 x Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz 2.652 seconds 5.413 seconds 1.585 seconds
 2 x Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz 2.484 seconds 5.217 seconds 1.500 seconds

Als nächstes habe ich unixbench.sh laufen lassen:

wget --no-check-certificate https://github.com/teddysun/across/raw/master/unixbench.sh
chmod +x unixbench.sh
./unixbench.sh

Hier sollte nun das OpenPower System einmal gegen einen Dell System mit zwei verbauten Intel(R) Xeon(R) CPU E5-2665 0 @ 2.40GHz antreten. Natürlich sind hier nur die Infos zu CPU/RAM spannend!

 2 x Intel(R) Xeon(R) CPU E5-2665 0 @ 2.40GHz    Power8 
 Dhrystone 2 using register variables  34551077.1 lps  (10.0 s, 7 samples)   27167563.6 lps  (10.0 s, 7 samples)
 Double-Precision Whetstone  4082.2 MWIPS  (9.9 s, 7 samples)   4092.2 MWIPS  (9.7 s, 7 samples)
 Execl Throughput  2124.0 lps  (30.0 s, 2 samples)   2776.0 lps  (29.9 s, 2 samples)
 File Copy 1024 bufsize 2000 maxblocks  1087796.7 KBps  (30.0 s, 2 samples)   299978.8 KBps  (30.0 s, 2 samples)
 File Copy 256 bufsize 500 maxblocks  299275.0 KBps  (30.0 s, 2 samples)   75847.4 KBps  (30.0 s, 2 samples)
 File Copy 4096 bufsize 8000 maxblocks  3350511.2 KBps  (30.0 s, 2 samples)   1079708.7 KBps  (30.0 s, 2 samples)
 Pipe Throughput  2067851.3 lps  (10.0 s, 7 samples)   465883.7 lps  (10.0 s, 7 samples)
 Pipe-based Context Switching  215476.9 lps  (10.0 s, 7 samples)   132003.3 lps  (10.0 s, 7 samples)
 Process Creation  4278.0 lps  (30.0 s, 2 samples)   7390.5 lps  (30.0 s, 2 samples)
 Shell Scripts (1 concurrent)  5542.8 lpm  (60.0 s, 2 samples)   7085.1 lpm  (60.0 s, 2 samples)
 Shell Scripts (8 concurrent)  6090.1 lpm  (60.0 s, 2 samples)   4356.5 lpm  (60.0 s, 2 samples)
 System Call Overhead  4186839.6 lps  (10.0 s, 7 samples)   344156.5 lps  (10.0 s, 7 samples)
      
 System Benchmarks Index Values  BASELINE  RESULT  INDEX  RESULT  INDEX
 Dhrystone 2 using register variables  116700.0  34551077.1  2960.7  27167563.6  2328.0
 Double-Precision Whetstone  55.0  4082.2  742.2  4092.2  744.0
 Execl Throughput  43.0  2124.0  494.0  2776.0  645.6
 File Copy 1024 bufsize 2000 maxblocks  3960.0  1087796.7  2747.0  299978.8  757.5
 File Copy 256 bufsize 500 maxblocks  1655.0  299275.0  1808.3  75847.4  458.3
 File Copy 4096 bufsize 8000 maxblocks  5800.0  3350511.2  5776.7  1079708.7  1861.6
 Pipe Throughput  12440.0  2067851.3  1662.3  465883.7  374.5
 Pipe-based Context Switching  4000.0  215476.9  538.7  132003.3  330.0
 Process Creation  126.0  4278.0  339.5  7390.5  586.5
 Shell Scripts (1 concurrent)  42.4  5542.8  1307.3  7085.1  1671.0
 Shell Scripts (8 concurrent)  6.0  6090.1  10150.2  4356.5  7260.8
 System Call Overhead 15000.0 4186839.6  2791.2  344156.5  229.4
      
 System Benchmarks Index Score   1629.6   851.8

Die hohe Anzahl Threads und die fette Speicheranbindung der CPU sind ein paar Besonderheiten, welche dieses System theoretisch sehr gut brauchbar als Datenbankserver machen sollten. Wir arbeiten viel mit PostgresSQL, daher war einer unserer Tests ein Restore unserer Testdatenbank.

 CPU Restore Zeit
 2 x Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz 129min 34s
 1 x Power8 2.0 (pvr 004d 0200) 120min 43s

Bisher zeigt sich folgendes Bild: Die Power8 CPU ist ohne Zweifel sehr leistungsstark. Die „bessere“ Speicheranbindung und die vielen Threads bemerkt man. Das OpenPower System von Thomas Krenn gibt es nur mit einem CPU Socket, also ist es immer eine singel CPU. Im direkten Vergleich mit einer Intel single CPU macht das Power8 System bei Datenbanken sicher den Stich. Da es preislich viel eher an einem dual Intel CPU System angesiedelt ist, muss es sich damit vergleichen lassen, selbst wenn es nicht ganz fair ist. Hier hat im direkten Vergleich ein solches Intel System die Nase vorne.

IBM hat im Jahr 2013 ihre Power8 CPU vorgestellt. Jetzt haben wir 2018…. Daher sind die Vergleichssysteme ebenfalls etwas älter. Unterm Strick: Echt tolle CPU, leider im Preis/Leistungsvergleich (für einen Datenbankserver) gegenüber eines Intel-Systems, der Verlierer! Was sicher im HPC oder bei Anbindungen von Nvidia Rechenbeschleunigern anders aussieht. Dual CPU Systeme wären spannend, besser noch direkt Power9 Systeme (mit AES und GZIP im Chip). Da IBM von diesen CPUs im Vergleich mit Intel nur sehr geringe Stückzahlen verkauft ist der Preis hoch. Vielleicht passiert hier ja noch mal irgendwann etwas?!?!

Wir haben hier noch ein paar Tests mehr gemacht und wir werden in den nächsten Tagen noch ein paar Experimente mit dem System vornehmen. Wenn sich also am ersten Eindruck noch etwas ändert schreibe ich es.

Hier habe ich noch ein paar Bilder..

Fragen? Na dann wie immer einfach fragen 🙂

Typ-2-Hypervisor BHYVE von FreeBSD: Virtualisierung leicht gemacht

Aus euch bekannten Gründen nutze ich selbst auf meinen Desktops und Notebooks FreeBSD als OS. Zugegeben…. An bestimmten Stellen ist es ganz ohne Microsoft Systeme nicht ohne Einschränkungen möglich bestimmte Dinge zu erledigen. Echtes Word oder Excel lässt sich nur bis zu einem bestimmten Punkt „ersetzten“ vor allem wenn alle anderen damit arbeiten. Zwischen Outlook / Evolution oder OWA gibt es auch größere Unterschiede. Das Citrix XenCenter existiert so wie viele andere Software nur als Windows Version bei welcher es keinen Spaß macht diese durch Wine zu schieben….. Wie löst man dieses Problem? Richtig, mit einer VM in VirtualBox! Darf man ein Windows 10 Pro virtualisieren? Ja und nein… Man muss schon auf die passende Lizenz achten! Ähnlich ist es mit VirtualBox, hier ist der kostenlose Einsatz im Unternehmen an bestimmte Einschränkungen gekoppelt.

Alles kein Grund es nicht so zu machen. Die Windows und VirtualBox Lizenzen sind nicht unglaublich teuer und selbst mit den VirtualBox Einschränkungen könnte man sicher in vielen Fällen leben. FreeBSD kommt aber seit Version 10.0 mit einem eigenen Typ-2 Hypervisor mit dem Namen bhyve (gott ich vertippe mich immer bei dem Wort). Jetzt habe ich damit natürlich sehr neugierig experimentiert. Aber schnell gemerkt das es als VirtualBox Ersatz noch etwas Zeit benötigt. Für den täglichen FreeBSD Servereinsatz hatte ich keine Verwendung, hier lebe ich mit den jails 🙂 Inzwischen sind wir bei FreeBSD 11.1 und die Version 11.2 steht vor der Tür. Meine Windows VM hatte ebenfalls irgendein Problem mit welchem ich mich nicht beschäftigen wollte (ja ich vernachlässige sie sehr), also stand eh mal eine neue an. Mit den Basis Tools von bhyve lässt sich eine VM einrichten und nutzen. Ich würde es sogar empfehlen um die Idee dahinter zu verstehen. Für den normalen täglichen Umgang sollte man aber lieber ein Verwaltungstool nutzen. Für meinen neuen Test habe ich dieses mal auf vm-bhyve gesetzt. Weil… Na weil es in den Ports und ebenfalls direkt als binary über pkg zu bekommen ist. Ok ok, ich habe ebenfalls das Wiki in meine Überlegung einbezogen…

Im Wiki findet sich der Quickstart und ähm, ja das ist wirklich alles genau so nutzbar:

1. pkg install vm-bhyve [grub2-bhyve uefi-edk2-bhyve]
2. zfs create pool/vm
3. echo 'vm_enable="YES"' >> /etc/rc.conf
4. echo 'vm_dir="zfs:pool/vm"' >> /etc/rc.conf
5. vm init
6. cp /usr/local/share/examples/vm-bhyve/* /mountpoint/for/pool/vm/.templates/
7. vm switch create public
8. vm switch add public em0
9. vm iso ftp://ftp.freebsd.org/pub/FreeBSD/releases/ISO-IMAGES/10.3/FreeBSD-10.3-RELEASE-amd64-bootonly.iso
10. vm create myguest
11. vm [-f] install myguest FreeBSD-10.3-RELEASE-amd64-bootonly.iso
12. vm console myguest

Für meine Windows VM habe ich nur ein paar Dinge leicht anfassen müssen.

Die ISO hatte ich bereits auf meinem System liegen und schnell mit folgendem Aufruf „importiert“:

vm iso /home/kernel/Download/windoof-iso.iso

Das virtualisierte Windows benötigt am Ende noch Treiber für die Netzwerkkarte. Dabei passt der virtio-net Driver den ich erst heruntergeladen und dann direkt importiert habe:

fetch https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.149-1/virtio-win-0.1.149.iso
vm iso /home/kernel/Download/virtio-win-0.1.149.iso

Dann die eigentliche VM aus dem mitgelieferten Template erstellen:

vm create -t windows -s 200G windoof

Durch das Template kommt die VM mit 2 CPUs und 2GB RAM. Die Systemplatte hat durch meine Option -s 200G eine Größe von 200GB. Da ich die Installation aber irgendwie durchführen muss und ich gerne doch 4 CPUs mit 8GB RAM hätte änderte ich die Konfiguration der VM direkt wie folgt ab:

vm configure windoof

uefi="yes"
cpu=4
memory=8G
graphics="yes"
graphics_port="5999"
graphics_listen="127.0.0.1"
graphics_res="1280x1024"
graphics_wait="auto"
xhci_mouse="yes"
network0_type="virtio-net"
network0_switch="public"
disk0_type="ahci-hd"
disk0_name="disk0.img"
uuid="c36583eb-739e-11e8-8176-ecf4bb47c54c"
network0_mac="58:9c:fc:01:41:8a"

So und nun nur noch VM starten und ISO „einlegen“:

vm install windoof windoof-iso.iso

Nun einfach mit einem VNC Viewer der Wahl mit 127.0.0.1:5999 verbinden und Windows installieren. Nachher wieder über vm install die ISO mit den Netzwerktreibern „einlegen“ und Windows einfach dort die Netzwerkkartentreiber suchen lassen, klappt prima. Ich habe dann einfach für meinen Benutzer rdp aktiviert und verbinde mich für alles Zukünftige einfach über rdp mit der VM. Fertig is 🙂

An / aus / snapshot usw. läuft alles über vm. So zum Beispiel auch die Übersicht über alle laufenden VMs:

vm list
NAME            DATASTORE       LOADER      CPU    MEMORY    VNC                  AUTOSTART    STATE
windoof    default         uefi        4      8G        -                    No           Running (10638)

Im Grunde absolut selbsterklärend, oder? Bei mir rennt nun seit einigen Tagen die VM so und ich brauche kein VirtualBox mehr \o/ Fragen? Dann Fragen 🙂

« Ältere Beiträge Neuere Beiträge »

© 2025 -=Kernel-Error=-

Theme von Anders NorénHoch ↑