I currently have an OpenBSD firewall running on an ancient 586. I have a mini-itx board, CF/IDE converter and a CF card and have been intending to upgrade.
However - rather than OpenBSD I'm going to try for debian (since I know that much better).
This post will end up being a "how I did it" - but at the minute is just a collection of the notes I'm grabbing for now.
For the initial install - I hung a CD-ROM as the slave IDE unit on the primary IDE channel.
I used the 4.0r3 etch netinst CD downloaded from debian.org.
Install went smoothly once I replaced the CF-IDE converter with a newer one that supported DMA (the newer CF card was DMA compatible) as I simply could not get the installer to disable DMA. However - see debian bug 475223 for information on how you could actually do that.
###Disk Mounting
From http://www.debian-administration.org/articles/179 I got a starter fstab and the hint about mtab. Here's the versions I ended up with:
/etc/fstab
proc /proc proc defaults 0 0
/dev/hda1 / ext2 noatime,errors=remount-ro 0 1
tmpfs /etc/network/run tmpfs defaults,noatime 0 0
tmpfs /tmp tmpfs defaults,noatime 0 0
tmpfs /var/lock tmpfs defaults,noatime 0 0
tmpfs /var/log tmpfs defaults,noatime 0 0
tmpfs /var/run tmpfs defaults,noatime 0 0
tmpfs /var/tmp tmpfs defaults,noatime 0 0
Warning: By mounting /var/log on tmpfs, logs will only be available for the current session.
/etc/mtab
rm -f /etc/mtab
ln -s /proc/mounts /etc/mtab
###Network
IPv6
I have some issues with things when IPv6 is running. So, to disable IPV6 I added:
blacklist ipv6
to /etc/modprobe.d/blacklist.
So - now the server boots, mounts the highly active parts of the system on tmpfs (we don't want to burn out the CF card).
Network
I need both ports to come up - one to the ISP, one internal.
TODO: what is the allow-hotplug bit?
/etc/network/interfaces
# The loopback network interface
auto lo eth0 eth1
iface lo inet loopback
# The external interface
allow-hotplug eth0
iface eth0 inet static
address 213.187.160.178
netmask 255.255.255.252
gateway 213.187.160.177
# The internal interface
iface eth1 inet static
address 192.168.1.2
netmask 255.255.255.0
###Services
SSH
Install ssh with aptitude.
I configured up ssh with the following sshd_config file (/etc/ssh):
Port 22
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
UsePrivilegeSeparation yes
KeyRegenerationInterval 3600
ServerKeyBits 768
SyslogFacility AUTH
LogLevel INFO
LoginGraceTime 120
PermitRootLogin yes
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
# Remember to make sure that you have a working set of .ssh/authorized_keys before changing this from yes to no!
PasswordAuthentication no
X11Forwarding no
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
UsePAM yes
DNS
Install bind9 with aptitude.
Two new files in /etc/bind:
/etc/bind/home.chrissearle.org
$ORIGIN .
$TTL 3600 ; 1 hour
home.chrissearle.org IN SOA ns.home.chrissearle.org. hostmaster.chrissearle.org. (
2008041201 ; serial
3600 ; refresh 1 hr
1800 ; retry 30 mins
604800 ; expire 1 wk
3600 ; minimum 1 hr
)
NS ns.home.chrissearle.org.
$ORIGIN home.chrissearle.org.
menavaur A 192.168.1.1 ; Old firewall
nornour A 192.168.1.2 ; New firewall
dolphin-tp A 192.168.1.3 ; Astrid mac mini LAN
dolphin A 192.168.1.4 ; Astrid mac mini WLAN
slippen-tp A 192.168.1.5 ; Chris laptop LAN
slippen A 192.168.1.6 ; Chris laptop WLAN
czar A 192.168.1.7 ; Linux file server
goldeneagle A 192.168.1.8 ; Astrid XP
galatea-tp A 192.168.1.9 ; Chris laptop (work) LAN
galatea A 192.168.1.10 ; Chris laptop (work) WLAN
bonnet A 192.168.1.11 ; Chris iMac
shah A 192.168.1.12 ; Unused
islander A 192.168.1.13 ; Unused
serica A 192.168.1.14 ; Unused
klondyke A 192.168.1.15 ; Unused
campernel A 192.168.1.16 ; Unused
bedroom-tp A 192.168.1.30 ; Airport
bedroom A 192.168.1.31 ; Airport
lounge-tp A 192.168.1.32 ; Airport
lounge A 192.168.1.33 ; Airport
store A 192.168.1.34 ; ReadyNAS NV+
wii A 192.168.1.35 ; Wii
dhcp50 A 192.168.1.50 ; DHCP
dhcp51 A 192.168.1.51 ; DHCP
dhcp52 A 192.168.1.52 ; DHCP
dhcp53 A 192.168.1.53 ; DHCP
dhcp54 A 192.168.1.54 ; DHCP
dhcp55 A 192.168.1.55 ; DHCP
dhcp56 A 192.168.1.56 ; DHCP
dhcp57 A 192.168.1.57 ; DHCP
dhcp58 A 192.168.1.58 ; DHCP
dhcp59 A 192.168.1.59 ; DHCP
dhcp60 A 192.168.1.60 ; DHCP
wifi1 A 192.168.1.200 ; Linksys AP
wifi2 A 192.168.1.201 ; Linksys AP
ns CNAME nornour
irc CNAME czar
web CNAME czar
1.168.192.in-addr.arpa
$ORIGIN .
$TTL 3600 ; 1 hour
1.168.192.in--addr.arpa IN SOA ns.home.chrissearle.org. hostmaster.chrissearle.org. (
2008041201 ; serial
3600 ; refresh 1 hr
1800 ; retry 30 mins
604800 ; expire 1 wk
3600 ; minimum 1 hr
)
NS ns.home.chrissearle.org.
$ORIGIN 1.168.192.in--addr.arpa.
1 PTR menavaur.home.chrissearle.org. ; Old firewall
2 PTR nornour.home.chrissearle.org. ; New firewall
3 PTR dolphin-tp.home.chrissearle.org. ; Astrid mac mini LAN
4 PTR dolphin.home.chrissearle.org. ; Astrid mac mini WLAN
5 PTR slippen-tp.home.chrissearle.org. ; Chris laptop LAN
6 PTR slippen.home.chrissearle.org. ; Chris laptop WLAN
7 PTR czar.home.chrissearle.org. ; Linux file server
8 PTR goldeneagle.home.chrissearle.org. ; Astrid XP
9 PTR galatea-tp.home.chrissearle.org. ; Chris laptop (work) LAN
10 PTR galatea.home.chrissearle.org. ; Chris laptop (work) WLAN
11 PTR bonnet.home.chrissearle.org. ; Chris iMac
12 PTR shah.home.chrissearle.org. ; Unused
13 PTR islander.home.chrissearle.org. ; Unused
14 PTR serica.home.chrissearle.org. ; Unused
15 PTR klondyke.home.chrissearle.org. ; Unused
16 PTR campernel.home.chrissearle.org. ; Unused
30 PTR bedroom-tp.home.chrissearle.org. ; Airport
31 PTR bedroom.home.chrissearle.org. ; Airport
32 PTR lounge-tp.home.chrissearle.org. ; Airport
33 PTR lounge.home.chrissearle.org. ; Airport
34 PTR store.home.chrissearle.org. ; ReadyNAS NV+
35 PTR wii.home.chrissearle.org. ; Wii
50 PTR dhcp50.home.chrissearle.org. ; DHCP
51 PTR dhcp51.home.chrissearle.org. ; DHCP
52 PTR dhcp52.home.chrissearle.org. ; DHCP
53 PTR dhcp53.home.chrissearle.org. ; DHCP
54 PTR dhcp54.home.chrissearle.org. ; DHCP
55 PTR dhcp55.home.chrissearle.org. ; DHCP
56 PTR dhcp56.home.chrissearle.org. ; DHCP
57 PTR dhcp57.home.chrissearle.org. ; DHCP
58 PTR dhcp58.home.chrissearle.org. ; DHCP
59 PTR dhcp59.home.chrissearle.org. ; DHCP
60 PTR dhcp60.home.chrissearle.org. ; DHCP
200 PTR wifi1.home.chrissearle.org. ; Linksys AP
201 PTR wifi2.home.chrissearle.org. ; Linksys AP
Then we need to activate these two:
/etc/bind/named.conf.local
zone "home.chrissearle.org" {
type master;
file "/etc/bind/home.chrissearle.org";
};
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/bind/1.168.192.in-addr.arpa";
};
Restarted bind - now this is authoritative for my local net 192.168.1.x and forwards to the ISP for everything else.
DHCPD
Install dhcpd (virtual package) with aptitude.
Firstly - we want only to serve DHCP internally - that is on interface eth1.
/etc/defaults/dhcp
INTERFACES="eth1"
Now configure it. Most internal machines get a fixed IP via MAC address, but there is also a range of .50 to .60 for visitors.
/etc/dhcpd.conf
group {
option subnet-mask 255.255.255.0;
option routers 192.168.1.2;
option domain-name-servers 192.168.1.2;
option domain-name "home.chrissearle.org";
host menavaur {
hardware ethernet 00:60:08:47:03:69;
fixed-address 192.168.1.1;
}
host dolphin-tp {
hardware ethernet 00:16:CB:94:15:D3;
fixed-address 192.168.1.3;
}
host dolphin {
hardware ethernet 00:16:CB:05:8C:03;
fixed-address 192.168.1.4;
}
host slippen-tp {
hardware ethernet 00:16:CB:C9:2E:A3;
fixed-address 192.168.1.5;
}
host slippen {
hardware ethernet 00:16:CB:B9:F5:B6;
fixed-address 192.168.1.6;
}
host czar {
hardware ethernet 00:0A:5E:1F:3D:6F;
fixed-address 192.168.1.7;
}
host goldeneagle {
hardware ethernet 00:0C:6E:4D:48:DA;
fixed-address 192.168.1.8;
}
host galatea-tp {
hardware ethernet 00:1B:63:A8:06:8B;
fixed-address 192.168.1.9;
}
host galatea {
hardware ethernet 00:1C:B3:C5:21:5B;
fixed-address 192.168.1.10;
}
host bedroom-tp {
hardware ethernet 00:14:51:74:F6:AA;
fixed-address 192.168.1.30;
}
host bedroom {
hardware ethernet 00:14:51:74:F6:AB;
fixed-address 192.168.1.31;
}
host lounge-tp {
hardware ethernet 00:14:51:73:86:96;
fixed-address 192.168.1.32;
}
host lounge {
hardware ethernet 00:14:51:73:86:97;
fixed-address 192.168.1.33;
}
host wii {
hardware ethernet 00:19:1D:FE:A0:56;
fixed-address 192.168.1.35;
}
host wifi1 {
hardware ethernet 00:1A:70:AB:A4:AC;
fixed-address 192.168.1.200;
}
host wifi2 {
hardware ethernet 00:1A:70:AB:A6:91;
fixed-address 192.168.1.201;
}
}
shared-network LOCAL-NET {
option domain-name "home.chrissearle.org ";
option domain-name-servers 192.168.1.2;
subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.2;
range 192.168.1.50 192.168.1.60;
}
}
DenyHosts
Denyhosts will add hosts to /etc/hosts.deny if they try things like brute force attacks on ssh.
Install denyhosts with aptitude.
Configure the /etc/denyhosts.conf file - I simply changed the mail addresses and mail server - everything else was left defaulted.
IPTables
From http://www.debian-administration.org/articles/23 and http://www.debian-administration.org/articles/73 - the following iptables script was generated.
/etc/network/if-ip.d/00-firewall
#!/bin/sh
PATH=/usr/sbin:/sbin:/bin:/usr/bin
# Set policy
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# delete all existing rules.
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
# Always accept loopback traffic
iptables -A INPUT -i lo -j ACCEPT
# Allow established connections, and those not coming from the outside
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -i ! eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow outgoing connections from the LAN side.
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
# NAT ssh (2222) and http (80) to an internal machine
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.7:80
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 2222 -j DNAT --to 192.168.1.7:22
# Open some ports externally (including the ports for NAT)
iptables -A FORWARD -p tcp -m state --state NEW --dport 22 -i eth0 -j ACCEPT
iptables -A FORWARD -p tcp -m state --state NEW --dport 80 -i eth0 -j ACCEPT
iptables -A FORWARD -p tcp -m state --state NEW --dport 2222 -i eth0 -j ACCEPT
# Masquerade.
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# Don't forward from the outside to the inside.
iptables -A FORWARD -i eth0 -o eth0 -j REJECT
# Enable routing.
echo 1 > /proc/sys/net/ipv4/ip_forward