FreeBSD – Een eigen webserver

Een website is een goede manier om informatie beschikbaar te maken voor anderen, maar ook om informatie voor jezelf te archiveren. Nu doe ik dat al door op m’n eigen website deze artikelen te plaatsen, maar een lokale webserver kan ook gebruikt worden om bijvoorbeeld de resultaten van poudriere te bekijken, een lokale cloud te draaien met behulp van nextcloud, of een web interface aan te bieden voor de git repositories.

Apache of Nginx

Voor het draaien van een website zijn er een aantal mogelijkheden maar met name apache en nginx worden hier veelvuldig voor gebruikt. Elk heeft zo zijn voor- en nadelen maar zelf heb ik gekozen voor apache aangezien ik daar wat meer ervaring mee heb dan met nginx.

Installatie

Installatie van apache is vrij eenvoudig. Het begint met het bouwen van de juiste package en dan is het een kwestie van installeren. Bij de opties moeten de volgende features aangezet zijn: SSL, MPM_SHARED. Voor de overige opties zijn de defaults voldoende.

# echo www/apache24 >> /usr/local/etc/poudriere.d/12amd64.pkglist
# poudriere ports -u
# poudriere options -c www/apache24
# poudriere bulk -j 12amd64 -f /usr/local/etc/poudriere.d/12amd64.pkglist

Na het bouwen kan het package geïnstalleerd worden.

# pkg install www/apache24

Configuratie

Met het commando

# service apache24 onestart

kunnen we controleren of de software correct is geïnstalleerd. Open een browser en ga naar http://filevault.home.lan/ en dan moet de volgende tekst getoond worden.

It works!

We stoppen de apache server met service apache24 onestop en gaan verder met het installeren van onder andere PHP. Maar eerst voeren we nog even onderstaand commando uit om bij een herstart apache automatisch op te starten.

# sysrc apache24_enable="YES"

Installatie van PHP

PHP is een veelgebruikte scripttaal voor het schrijven van interactive webpagina’s. In dit geval installeren we een van de laatste versie van PHP, namelijk 7.2. Er is al wel een nieuwere versie maar deze wordt nog niet veel ondersteund door de diverse PHP applicaties.

Als eerste moeten we een aantal PHP packages toevoegen aan ons build systeem en deze bouwen. Tevens voegen we gelijk de apache module voor ondersteuning van PHP toe.

# echo lang/php72 >> /usr/local/etc/poudriere.d/12amd64.pkglist
# echo lang/php72-extensions >> /usr/local/etc/poudriere.d/12amd64.pkglist
# echo www/mod_php72 >> /usr/local/etc/poudriere.d/12amd64.pkglist
# poudriere options -c lang/php72 lang/php72-extensions www/mod_php72
# poudriere bulk -j 12amd64 -f /usr/local/etc/poudriere.d/12amd64.pkglist

Na het bouwen van de packages kunnen we deze vervolgens installeren.

# pkg update && pkg install php72 mod_php72

Daarnaast moeten we ook nog een aantal van de PHP extensies installeren.

# pkg install php72-mbstring php72-zlib php72-curl php72-gd php72-json

Voor het gebruik van PHP binnen apache moet we de geïnstalleerde module toevoegen aan de apache configuratie. Voeg aan het bestand /usr/local/etc/apache24/httpd.conf de volgende regel toe:

LoadModule php7_module        libexec/apache24/libphp7.so

Tevens moeten we ervoor zorgen dat .php bestanden als zodanig worden behandeld. Hiervoor creëren we het bestand /usr/local/etc/apache24/modules.d/080_mod_php.conf met de volgende inhoud:

<FilesMatch "\.php$">
SetHandler application/x-httpd-php
</FilesMatch>

<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>

Om een en ander te testen voeren we de volgende commando’s uit om apache opnieuw te starten en maken we een simpele testpagina.

# echo '<?php phpinfo(); ?>' | tee -a /usr/local/www/apache24/data/info.php
# service apache24 restart

Als we nu naar http://filevault.home.lan/info.php gaan, dan moet nu de status pagina voor de PHP ondersteuning binnen apache getoond worden.

In een volgend artikel ga ik verder met het toevoegen van SSL ondersteuning.

FreeBSD – Lokaal mail versturen

Diverse processen die draaien op de server kunnen via e-mail status berichten en logs versturen. Deze blijven echter op het systeem staan zodat het lastig is om deze berichten te lezen. Door gebruik te maken van mail/postfix wordt het mogelijk om deze e-mails via Gmail door te sturen.

Installatie

We starten met het bouwen van het installatie package via poudriere door dit aan de lijst van packages toe te voegen, de instellingen aan te passen en dan alles te bouwen. Bij de opties moet SASL aangezet zijn, voor de andere opties kunnen de defaults gebruikt worden.

# echo mail/postfix >> /usr/local/etc/poudriere.d/12amd64.pkglist
# poudriere ports -u
# poudriere options -j 12amd64 -c mail/postfix
# poudriere bulk -j 12amd64 -f /usr/local/etc/poudriere.d/12amd64.pkglist

Als het installatie package gebouwd is kan het geïnstalleerd worden.

# pkg install mail/postfix

Bevestig de vraag of postfix geactiveerd moet worden met een y. Dit zorgt ervoor dat we in plaats van sendmail nu postfix gaan gebruiken. Om sendmail helemaal uit te schakelen zijn nog een aantal acties nodig. Deze acties worden beschreven bij de installatie van het postfix package.

In het bestand /etc/rc.conf zorgen we ervoor dat sendmail niet meer wordt opgestart en dat we in plaats hiervan postfix opstarten.

# - disable sendmail
sendmail_enable="NONE"

# - enable postfix
postfix_enable="YES"

Voeg onderstaande regels toe aan het bestand /etc/periodic.conf om deze sendmail specifieke zaken uit te zetten.

# disable sendmail tasks
daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"

Gmail authenticatie

Om mail door te kunnen sturen naar Gmail is het nodig om de juiste account gegevens vast te leggen. Dit doen we in het bestand /usr/local/etc/postfix/sasl_passwd.

[smtp.gmail.com]:587    username@gmail.com:password

Vul hierbij het juiste e-mail adres en Gmail wachtwoord in. Verder moeten we ervoor zorgen dat alleen root het bestand kan lezen.

chmod 600 /usr/local/etc/postfix/sasl_passwd

Postfix configuratie

De configuratie van postfix is redelijk simpel. Vervang de inhoud van /usr/local/etc/postfix/main.cf met de volgende regels.

# General options
queue_directory = /var/spool/postfix
command_directory = /usr/local/sbin
daemon_directory = /usr/local/libexec/postfix
data_directory = /var/db/postfix
mail_owner = postfix
unknown_local_recipient_reject_code = 550
debug_peer_level = 2

# Alias maps
alias_maps = hash:/etc/aliases
virtual_alias_maps = hash:/usr/local/etc/postfix/virtual

# Address rewriting
recipient_canonical_maps = hash:/usr/local/etc/postfix/canonical

# My hostname, domain, origin, networks
myhostname = filevault.home.lan
mydomain = home.lan
myorigin = home.lan
inet_interfaces = 172.16.123.11
inet_protocols = ipv4
mynetworks = 127.0.0.0/8, 172.16.123.0/24

# SASL options
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/usr/local/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous

# TLS options
smtp_use_tls = yes
smtp_tls_security_level = encrypt
tls_random_source = dev:/dev/urandom

# Relay host
relayhost = [smtp.gmail.com]:587

# Disable compatibility mode
compatibility_level = 2

Belangrijk hierbij is dat de gegevens van het lokale netwerk correct zijn zoals host naam en IP adres van de server, lokale domein naam en op welk IP netwerk de server zit. De SASL, TLS en relayhost configuratie zijn nodig voor het doorsturen van mail naar Gmail.

De virtual_alias_maps zorgt ervoor dat alle gebruikers herschreven worden naar mijn Gmail e-mail adres. Zet hiervoor de volgende regel in het /usr/local/etc/postfix/virtual bestand.

.*    username@gmail.com

In het bestand /etc/aliases moet alleen de alias voor root aangepast worden.

root: username@gmail.com

Run nu het commando newaliases om de alias database aan te maken.

# newaliases

Het bestand /usr/local/etc/postfix/canonical wordt gebruikt om de lokaal gebruikte domein namen om te zetten.

@poudriere.home.lan    username@gmail.com
@git.home.lan username@gmail.com
@home.lan username@gmail.com

De databases voor de verschillende configuratie bestanden moeten nu nog aangemaakt worden. Voor de aliases is dit al gedaan via newaliases, de overige moeten gemaakt worden met behulp van postmap.

# postmap /usr/local/etc/postfix/sasl_passwd
# postmap /usr/local/etc/postfix/canonical
# postmap /usr/local/etc/postfix/virtual

We kunnen nu postfix opstarten.

# service postfix start

Veiligheidniveau bij Gmail aanpassen

Normaal gesproken kunnen we geen mail via Gmail doorsturen. Hiervoor moet de instelling Allow less secure apps aangezet worden. Meer hierover kun je lezen op de support pagina Allowing less secure apps to access your account van Google.

Test e-mail versturen

Het versturen van een test e-mail is erg eenvoudig.

# echo "Test" | mail -s "Test" test@domain.com

In de verzonden items bij Gmail moet je nu dit bericht zien. Onafhankelijk vanaf welk gebruikersaccount dit is verstuurd, de afzender moet gelijk zijn aan het e-mail adres zoals ingevuld in /usr/local/etc/postfix/virtual.

Referenties

FreeBSD – File sharing via NFS

Om gemakkelijk bij de bestanden op de server te komen is het nodig om de betreffende datasets beschikbaar te maken via het netwerk. Dit kan via bijvoorbeeld AFP of Samba maar aangezien het netwerk hier een Unix netwerk betreft, is de keuze voor NFS snel gemaakt.

Wat betreft de configuratie moeten we eerst aangeven wat er precies beschikbaar gesteld moet worden. Dit doen we in het /etc/exports bestand.

V4: /
/usr/home/kdb -network 172.16.123.0 -mask 255.255.255.0 -mapall=kdb:kdb
/storage/media -network 172.16.123.0 -mask 255.255.255.0 -mapall=media:media

De eerste regel forceert het gebruik van NFS v4 in plaats van v3 wat een aantal voordelen biedt zoals betere beveiliging en hogere snelheid. De 2 volgende regels beschrijven de datasets welke beschikbaar zijn en welke Unix gebruiker en groep gebruikt moet worden.

Voor het starten van de NFS server moeten de volgende regels toegevoegd worden aan /etc/rc.conf.

# enable NFS server
nfs_server_enable="YES"
# use both UDP and TCP, 6 threads
nfs_server_flags="-u -t -n 6"
# enable NFS v4, including user/group info
nfsv4_server_enable="YES"
nfsuserd_enable="YES"
# enable RPC binding
rpcbind_enable="YES"
# allow RPC mount requests for normal files
mountd_flags="-r"

Als laatste moeten we nog de NFS service starten.

# service start nfsd

Referenties

FreeBSD – DNS en DHCP

Hoewel de Fritz!Box redelijk te configureren valt met betrekking tot DNS en DHCP, is het toch lastig om hostnamen te koppelen aan bijvoorbeeld een MAC adres en hier dan een vast IP adres aan toe te kennen. Door gebruik te maken van dns/dnsmasq is het mogelijk om zowel de DNS alsook de DHCP functionaliteit beschikbaar te maken.

Installatie

We voegen dns/dnsmasq toe aan de lijst van port packages welke gebouwd moeten worden met poudriere en configureren het port package. Hierbij gebruiken we alle defaults.

# poudriere options -j 12amd64 dns/dnsmasq

Na het bouwen kunnen we het port package installeren.

# pkg update && pkg install dns/dnsmasq

Configuratie

De configuratie staat in het bestand /usr/local/etc/dnsmasq.conf en bevat al een voorbeeld configuratie. Deze verwijderen we en beginnen vanaf scratch.

Als eerste stellen we ons eigen domein in en forceren dat dit altijd gebruikt wordt. Ook zorgen we ervoor dat niet-publieke IP adressen niet doorgestuurd worden naar de upstream DNS servers.

# Hosts zonder domein worden niet doorgestuurd
domain-needed

# Niet-routeerbare IP adressen worden genegeerd
bogus-priv

# Forceer eigen domein wanneer het niet wordt gebruikt
domain=home.lan
expand-hosts
local=/home.lan/

Vervolgens stellen we de IP adressen in waarop dnsmasq moet luisteren naar requests.

# Luister naar requests op IP adres 127.0.0.1 (localhost) en 172.16.123.11 (server IP)
listen-address=127.0.0.1
listen-address=172.16.123.11

# Luister op alle interfaces
bind-interfaces

Als laatste vertellen we dnsmasq welke upstream DNS servers gebruikt moeten worden.

# Upstream DNS - Google en OpenDNS
strict-order
server=8.8.8.8
server=208.67.220.220
server=8.8.4.4
server=208.67.222.222

Tot zover de DNS configuratie en kunnen we verder met de DHCP configuratie. Hiervoor stellen we IP adresbereik in van waaruit de IP adressen uitgedeeld worden. Verder definiëren we ook de opties voor de DHCP client zoals DNS server en router.

# DHCP
dhcp-range=172.16.123.100,172.16.123.200,255.255.255.0,24h
dhcp-option=option:router,172.16.123.1
dhcp-option=option:dns-server,172.16.123.11

# Bewaar DHCP leases
dhcp-leasefile=/var/db/dnsmasq/dnsmasq.leases

Normaal gesproken kun je er als DHCP client niet van uit gaan dat je altijd hetzelfde IP adres krijgt toegewezen. Op basis van het MAC adres kunnen we dit echter wel forceren door voor elk MAC adres een dhcp-host regel toe te voegen.

dhcp-host=xx:xx:xx:xx:xx:xx,<ip-adres>

Voor alle belangrijke systemen, zoals de Fritz!Box, de WiFi versterkers en de computers, heb ik een regel toegevoegd zodat ze altijd hetzelfde IP adres krijgen toegewezen. Voor mobiele telefoons en de tablets heb ik dit niet gedaan.

Tot slot hebben we nog de mogelijkheid om aan een IP adres een host naam te koppelen. Dit kan dus alleen voor systemen welke een vast IP adres hebben. We maken een bestand /usr/local/etc/hosts waarin we deze koppeling vastleggen.

# Localhost
127.0.0.1 localhost

# Overige hosts
<ip-adres> <host naam> <host alias>

In de dnsmasq configuratie voegen we de volgende regel toe om de koppeling daadwerkelijk te gebruiken.

# Hosts file
addn-hosts=/usr/local/etc/hosts

We kunnen de configuratie testen met het commando:

# dnsmasq --test

Service starten

Omdat het niet gewenst is om meerdere DHCP servers op 1 netwerk te hebben, moeten we eerst de DHCP server in de Fritz!Box uitzetten. Let op dat alleen de IPv4 DHCP server wordt uitgezet.

Om gebruik te maken van onze eigen DNS service moet het bestand /etc/resolv.conf aangepast worden.

# Search local domain
search local
nameserver 172.16.123.11

Vervolgens kunnen we de dnsmasq service opstarten.

# service dnsmasq onestart

Hernieuw de DHCP leases op de verschillende computers of verbreek eventjes de WiFi verbinding van mobiele apparaten om te controleren dat een nieuw IP adres wordt toegekend. Bezoek ook een aantal websites om te zien dat externe hosts nog benaderbaar zijn en gebruik tools als dig of nslookup om te zien of zowel het juiste IP adres wordt gevonden voor een host naam en ook onze eigen DNS server wordt gebruikt.

Als alles correct functioneert voegen we nog een regel toe aan /etc/rc.conf zodat de service automatisch wordt opgestart bij het starten van de server. Ook definiëren we de naam van het configuratiebestand.

# - DNS cache and DHCP server
dnsmasq_enable="YES"
dnsmasq_conf="/usr/local/etc/dnsmasq.conf"

Referenties

FreeBSD – Port packages maken met Poudriere

Je kunt natuurlijk gebruik maken van de port packages welke door FreeBSD beschikbaar worden gesteld maar dan mis je de mogelijkheid om aanpassingen te maken in de configuratie van deze packages. Bijvoorbeeld heb ik geen X11 windows server draaien en dan hoeft dat ook niet in de packages meegenomen te worden.

De oplossing is dus om zelf de port packages te bouwen. Dit kan direct in de ports boom op het systeem maar hier kleven een aantal nadelen aan, met name wat betreft het afhandelen van afhankelijkheden tussen de verschillende ports. Om dit op te vangen maak ik gebruik van ports-mgmt/poudriere om in een afgeschermde omgeving de port packages te bouwen welke dan lokaal geïnstalleerd kunnen worden.

Poudriere configuratie

Voordat we kunnen beginnen moeten we de configuratie voor de standaard port packages aanpassen. Normaal wordt gebruik gemaakt van kwartaalupdates maar we willen dit aanpassen naar de laatste versies. Dit kan door het bestand /usr/local/etc/pkg/repos/FreeBSD.conf te maken met de volgende inhoud:

FreeBSD: {
url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
mirror_type: "srv",
signature_type: "fingerprints",
fingerprints: "/usr/share/keys/pkg",
enabled: yes
}

Nu dit is aangepast kunnen we poudriere installeren. Hierbij wordt gevraagd om ook de laatste versie van pkg te installeren. Daarnaast installeren we ook een port voor het afhandelen van de cache.

# pkg install ports-mgmt/poudriere devel/ccache

Na installatie kun je een voorbeeld configuratie vinden in /usr/local/etc/poudriere.conf.sample met uitleg over de verschillende parameters welke ingesteld kunnen worden. Voor onze configuratie maken we het bestand /usr/local/etc/poudriere.conf met de volgende inhoud:

# Poudriere configuration file

ZPOOL=zbase
ZROOTFS=/p
FREEBSD_HOST=ftp://ftp.nl.freebsd.org
RESOLV_CONF=/etc/resolv.conf
BASEFS=/poudriere
POUDRIERE_DATA=${BASEFS}/data
USE_PORTLINT=no
USE_TMPFS=all
DISTFILES_CACHE=/poudriere/distfiles
CHECK_CHANGED_OPTIONS=verbose
CHECK_CHANGED_DEPS=yes
PKG_REPO_SIGNING_KEY=/usr/local/etc/pki/poudriere/poudriere.key
CCACHE_DIR=/var/cache/ccache
WRKDIR_ARCHIVE_FORMAT=tbz
NOLINUX=yes
URL_BASE=http://poudriere.home.lan/poudriere/
ATOMIC_PACKAGE_REPOSITORY=yes
COMMIT_PACKAGES_ON_FAILURE=yes
KEEP_OLD_PACKAGES=yes
KEEP_OLD_PACKAGES_COUNT=3

Belangrijk in deze configuratie is dat de juiste ZFS pool naam gebruikt wordt, in mijn geval dus zbase. Verder configureren we alvast de URL voor de web client zodat we het bouwproces in de gaten kunnen houden.

Jails, ports en settings

Om gebruik te kunnen maken van poudriere moeten we eerst een jail maken waarin de port packages gebouwd gaan worden. Dit en de vervolg stappen staan uitgebreid beschreven in het FreeBSD Handbook.

# poudriere jail -c -j 12amd64 -v 12.0-RELEASE

Vervolgens moeten we de ports tree ophalen. Deze bevat de makefiles en patches voor alle beschikbare port packages.

# poudriere ports -c

Het bestand /usr/local/etc/poudriere.d/make.conf bevat de algemene opties voor het bouwen van de ports.

# Use the OpenSSL port version where possible
DEFAULT_VERSIONS+=      ssl=openssl

# Default versions for some programs
DEFAULT_VERSIONS+=      bdb=5
DEFAULT_VERSIONS+=      mysql=10.2m
DEFAULT_VERSIONS+=      perl5=5.26
DEFAULT_VERSIONS+=      python=2.7
DEFAULT_VERSIONS+=      python2=2.7
DEFAULT_VERSIONS+=      python3=3.6
DEFAULT_VERSIONS+=      ruby=2.4
DEFAULT_VERSIONS+=      apache=2.4
DEFAULT_VERSIONS+=      php=7.2

# Enable some features by default
OPTIONS_SET+=   PKGNG
OPTIONS_SET+=   MANPAGES
OPTIONS_SET+=   VP8
OPTIONS_SET+=   ICONV
OPTIONS_SET+=   GSSAPI_MIT
OPTIONS_SET+=   READLINE_PORT
OPTIONS_SET+=   SSP_PORTS

# Disable some features by default
OPTIONS_UNSET+= X11
OPTIONS_UNSET+= WAYLAND
OPTIONS_UNSET+= CUPS
OPTIONS_UNSET+= LDAP
OPTIONS_UNSET+= TCL
OPTIONS_UNSET+= WXGTK
OPTIONS_UNSET+= OPENGL
OPTIONS_UNSET+= EGL
OPTIONS_UNSET+= NLS
OPTIONS_UNSET+= EXAMPLES
OPTIONS_UNSET+= LUA
OPTIONS_UNSET+= DEBUG
OPTIONS_UNSET+= SOUND
OPTIONS_UNSET+= ALSA
OPTIONS_UNSET+= PULSEAUDIO
OPTIONS_UNSET+= DOCBOOK
OPTIONS_UNSET+= GSSAPI_BASE

Als laatste maken we het bestand /usr/local/etc/poudriere.d/12amd64.pkglist met hierin alle port packages welke we gebouwd willen hebben.

ports-mgmt/pkg
ports-mgmt/poudriere
devel/ccache
ports-mgmt/dialog4ports

Hoewel we de algemene instellingen voor de port packages hebben aangemaakt, moeten we ook de individuele port packages nog configureren.

# poudriere options -j 12amd64 -f /usr/local/etc/poudriere.d/12amd64.pkglist

Dit zal alle gedefinieerde port packages aflopen, inclusief alle afhankelijke packages, en ons de mogelijkheid geven om de configuratie aan te passen. Deze configuratie wordt opgeslagen zodat dit niet elke keer gedaan hoeft te worden.

Port packages bouwen en gebruiken

Nu alle configuratie is gedaan, is het tijd om de port packages te bouwen. Hierbij zal poudriere zelf aangeven of er nog ontbrekende directories gemaakt moeten worden.

# poudriere bulk -j 12amd64 -f /usr/local/etc/poudriere.d/12amd64.pkglist

Als dit klaar is, dan kunnen we de gebouwde port packages gaan gebruiken op ons systeem. We moeten pkg dan wel vertellen waar de port packages staan. Dit doen we door het bestand /usr/local/etc/pkg/repos/Poudriere.conf te maken:

Poudriere: {
  url: "file:///poudriere/data/packages/12amd64-default",
  signature_type: "pubkey",
  pubkey: "/usr/local/etc/pki/poudriere/poudriere.crt",
  priority: 100,
  enabled: yes
}

Met de huidige configuratie worden ook nog port packages gebruikt van de officiële FreeBSD repository en dat willen we niet. Om dit uit te zetten veranderen we in /usr/local/etc/pkg/repos/FreeBSD.conf de parameter enabled naar no.

We kunnen nu de officiële port packages vervangen door de zojuist gebouwde port packages.

# pkg update
# pkg upgrade -f