FitPC2 palomuuriksi ja reitittimeksi

Jälleen sai uusi (vanha) kone uuden paikan. Kuten aikaisemmin jo totesin, päätin siirrellä hieman eri toiminnallisuuksia yhdeltä koneelta parille muulle. Tällä kertaa vuorossa oli reititin, palomuuri ja kotiautomaatio. Ja koneena oli pari kuukautta sitten hankittu FitPC2.

Fit-PC2 ja modeemi

FitPC2 on siitä kiitollinen alusta, että kyseessä on ihan perinteistä PC-rautaa. Vain pienemmässä koossa. Prosessorina paikkaa pitelee Intelin Atom noin 1 Ghz:n nopeudella, kiintolevynä on 50 Gigan SSD-levy, muistia Gigan verran ja kaverina on lisäksi 2 kpl Gigabit-ethernet -portteja. Eli oikein soppelia rautaa reitittimen ja palomuurin rooliin. Ja vähän muuhunkin.

Asennus ja perussäädöt

Asennusmediaksi valikoitui tuttu ja turvallinen Debian netinstaller. Tuolta asennusmetodina expert ja oletuksena ei root-tunnuksia. Lisäksi mitään ylimääräistä ei tullut valittua, eli ei työpöytäympäristöä tai palvelinpaketteja. Uudelleenkäynnistyksen jälkeen oltiin puhtaassa ympäristössä jonne asensin openssh:n ja vim:n, jotta säätäminen onnistuu etäyhteyden läpi suosikkieditorilla. Ssh:n kohdalla suosittelen säätämään /etc/sshd_config -tiedostosta portin (Port) ja root-kirjautumisen (PermitRootLogin) muuksi kuin oletukseksi. Eli seuraavat kohdat

Port 222 # esimerkiksi 222, oletus on 22
PermitRootLogin no # Oletus on yes

Tässä vaiheessa siirsin FitPC2:n lähes lopulliseen fyysiseen sijaintiin työhuoneeseen modeemin viereen.

Reitittimen säädöt

Asennusten jäljiltä kone oli vielä yhden yhteyden varassa eikä näin ollen soveltunut reitittimeksi tai palomuuriksi. Vielä. Yhteydenotto koneeseen ja dnsmasq-ohjelma käyttöön.

> sudo apt-get install dnsmasq

Dnsmasq on kevyt DHCP-palvelin ja DNS-toistin, joten yhdellä softalla saan hoidettua kaikki näppärästi. Dnsmasq soveltuu hyvin kotiympäristöön NAT-käyttöön, joten en ihan ensimmäisenä tätä useamman sadan koneen ympäristöön ajattelisi. Mutta näppärä ja yksinkertainen softa säädettäväksi.

Ennen Dnsmasqin säätöä meidän tulee kuitenkin laittaa verkot kuosiin. Debianissa verkot saa säädettyä /etc/network/interfaces -tiedostosta, joten lempieditori käsiin, oikeustaso kohdalle ja säätämään. Oma tiedosto näyttää seuraavalta.

lo eth0 eth1
iface lo inet loopback

iface eth0 inet static
    address 192.168.10.1
    netmask 255.255.255.0
    broadcast 192.168.10.255
    network 192.168.10.0

iface eth1 inet dhcp

Lyhyt yhteenveto kertoo seuraavaa: eth0 on sisäverkossa käytettävä verkkosovitin ja se vastaa osoitteesta 192.168.10.1 (varmista ettei tässä ole päällekkäisyyksiä). Eth1 taasen menee internetin suuntaan ja saa oman ip-osoitteen palveluntarjoajalta, jonka takia käytetään dhcp:tä.

Kun yhteydet on säädetty päästään itse asiaan eli Dnsmasqin säätöön. Ja se on itseasiassa aika simppeliä. Jälleen sudolla oikeudet kohdalleen ja editorilla /etc/dnsmasq.conf auki. Tässä jälleen olennaisimmat säädettävät kohdat:

# If you want dnsmasq to listen for DHCP and DNS requests only on
# specified interfaces (and the loopback) give the name of the
# interface (eg eth0) here.
# Repeat the line for more than one interface.
interface=eth0

ja

# Uncomment this to enable the integrated DHCP server, you need
# to supply the range of addresses available for lease and optionally
# a lease time. If you have more than one network, you will need to
# repeat this for each network on which you want to supply DHCP
# service.
dhcp-range=192.168.10.100,192.168.10.150,24h

Jälleen lyhyt kuvaus. Ensin määritellään, mistä verkkosovittimesta kuunnellaan dhcp- ja dns-pyyntöjä. Tässä tapauksessa sovitin on sisäverkon sovitin, eli eth0. Tämän jälkeen kerrotaan mikä osoiteavaruus on tarjolla dhcp:n kanssa. 192.168.10.100 - 192.168.10.150n riittää tällä hetkellä minun koneille oikein mainiosti.

Dnsmasqin avulla on myös mahdollista kiinnittää tiettyjä sisäverkon ip-osoitteita jonkin koneen verkkosovittimen mac-osoitteen avulla. Nämä on dokumentoitu tuohon asetustiedostoon, joten mikäli aihe kiinnostaa niin asetustiedostoa lukemaan.

Tässä vaiheessa meillä on käytössä molemmat verkkosovittimet sekä dns- ja dhcp-palvelin. Kannattaa huomioida ja varmistaa, ettei sisäverkossa ole muita dhcp-palvelimia, ettei tule vahingossa väärinymmärryksiä liikenteen suhteen. Vaikka dns ja dhcp pelaavatkin ei meillä ole vielä käytössä palomuuria tai jaettua yhteyttä ulkomaailmaan. Eli seuraa palomuuri- ja reititinosuus.

Palomuuria yksinkertaisesti

Olen itse useamman vuoden ajan käyttänyt palomuurina ufw-softaa. Kyseessä on Uncomplicated Firewall eli yksinkertaistettu palomuuri. Pohjalla on Debianissa käytettävä iptables, jolla saa tehtyä todella hyviä palomuuriasetuksia. Olen käyttänyt myös iptablesia mutta ufw korvasi iptablesin lähinnä yksinkertaisemman säädön ansiosta. Eli minun käytössä säädöt ovat todella yksinkertaisia ja niiden asettaminen oli hankalampaa iptablesilla.

Jotta saamme yhteyden ulkomaailmaan meidän tulee tehdä seuraavat asiat

  1. reititys liikenteelle kuntoon
  2. palomuuri pystyyn
  3. palomuurin asetukset kuntoon

Hommiin siis.

sudo apt-get install ufw

Tämän jälkeen säädetään reititysasetukset ensin /etc/default/ufw-tiedostosta

DEFAULT_FORWARD_POLICY="ACCEPT"

ja /etc/ufw/sysctl.conf-tiedostosta

net/ipv4/ip_forward=1

Lisäksi meidän tulee asettaa NAT-säännöt ufw:lle. Tämä on se vaikein osuus palomuurissa. Eli editorilla /etc/ufw/before.rules-tiedostoon alkukommenttien jälkeen ensimmäiseksi säännöksi

# nat Table
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 192.168.10.0/24 -o eth1 -j MASQUERADE

COMMIT

Yhteenvetoa säännöstä: asetetaan POSTROUTING-sääntö, lähteenä (-s) sisäverkon koko osoiteavaruus (192.168.10.0/24) ja kohdesovittimena internetin verkkosovitin (eth1). Lopuksi hyväksytään sääntö.

Viimeistellään palomuuri käynnistämällä se

sudo ufw enable

Ja sallitaan sekä dhcp-liikenne että liikenne sisäverkosta ulos.

sudo ufw allow from 192.168.10.0/24
sudo ufw allow bootps

Tämän jälkeen (minun tapauksessa) vanha dhcp-palvelin sammutettiin, modeemin johdot kytkettiin FitPC2:n porttiin ja kone käynnistettiin uusiksi. Parin testin jälkeen homma tuntui pelaavan ok.

Bonusmateriaalia: OpenRemote ja kotiautomaatio

Käytössäni oleva kotiautomaatiosofta sai myös paikkansa FitPC2:sta. Fyysisinä laitteina minulla on nipullinen DIN-kiskoihin kytkettäviä X10-moduleja sekä usb-väylään kytkettävä CM15Pro-lähetin/vastaanotin.

Fit-PC2, modeemi ja CM15Pro X10 Dimmer Moduulit

Softan puolesta käytössä on sama setti kuin aikaisemminkin, eli mochad. Aikaisempaan asennukseen erona oli se, että githubista latasin hieman muutetun lähdekoodin ja käänsin sen. Muutoin homma rokkasi parissa minuutissa.

OpenRemotea varten piti asentaa Java-ympäristö ja ladata tuorein OpenRemote Controller-paketti koneelle.

sudo apt-get install openjdk-6-jdk

Tämän jälkeen purin OpenRemoten /opt/openremote-hakemistoon. Suoritusoikeudet openremote.sh-tiedostolle ja testi, että palvelin lähtee päälle varmistukseksi.

cd /opt/openremote/bin
sudo chmod +x openremote.sh
sudo ./openremote.sh

Selaimella osoitteeseen 192.168.10.1:8080/controller ja palvelin näytti vastaavan. Eli kaikki oli tähän mennessä ok. Enää tarvitsi saada OpenRemote starttaamaan uudelleenkäynnistyksen yhteydessä. Ja tähän oli olemassa Debian-ympäristöön sopiva init-skripti valmiina, joten copy’n’paste ja modaus omaan ympäristöön sopivaksi. Lopullisena versiona osimmoilleen tällanen

! /bin/sh
### BEGIN INIT INFO
# Provides:          openremote
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Openremote initscript
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO

# Author: Tommi Pääkkö <[email protected]>

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="OpenRemote Controller"
NAME=openremote
DAEMON=/opt/openremote/bin/$NAME
SCRIPTNAME=/etc/init.d/$NAME

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
    $DAEMON.sh start > /dev/null 2>&1 &
}

#
# Function that stops the daemon/service
#
do_stop()
{
    $DAEMON.sh stop > /dev/null 2>&1 &
}

cd /opt/openremote/bin
case "$1" in
  start)
    do_start
    ;;
  stop)
    do_stop
    ;;
  restart)
    #
    # If the "reload" option is implemented then remove the
    # 'force-reload' alias
    #
    do_stop
    sleep 10
    do_start
    ;;
  *)
    #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
    echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
    exit 3
    ;;
esac

Tuon viskasin /etc/init.d/-hakemistoon, annoin suoritusoikeudet ja komensin vielä käynnistymään kun kone käynnistyy.

sudo chmod +x /etc/init.d/openremote
sudo insserv openremote

Jälleen kerran konetta käyntiin ja testailemaan. Ja OpenRemote Controller tuntui vastaavan oikeassa paikassa. Näin ollen jälleen kerran on pistorasiat ja valot ohjattavissa puhelimella ja tietokoneella.