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.

Superwolfbloedmaan

Een hele mond vol en het is niets anders dan de eerste volle maan van januari gecombineerd met een maansverduistering en het feit dat de aarde en maan relatief dicht bij elkaar staan.

De weersverwachtingen zijn erg gunstig: koud, weinig wind en zo goed als geen bewolking. Dus maar om half 4 ’s nachts m’n bed uit om dit eens op de foto te zetten. Het plan was om een mooie reeks van de maantransitie te schieten en deze te monteren zodat je de verschillende fases van de maan in 1 landschapsfoto ziet. Helaas ging dat niet helemaal zoals ik had voorzien.

Read More

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