HTPC Część 2 – Debian jako ruter oraz ruter wifi dla sieci lokalnej

debian-wireless-routerW poprzedniej części ( http://blog.ezrodlo.pl/htpc/htpc-czesc-1-instalacja-debiana ) zainstalowaliśmy system Debian z narzędziami do wirtualizacji. Co prawda na razie nie zostaną one wykorzystane. Nie mniej jednak warto je mieć, przydadzą się w kolejnych częściach. Teraz zajmiemy się konfiguracją łącza.

Cel: Debian jako ruter, ruter wifi, serwer dhcp dla sieci lokalnej

Spis treści
1. Konfiguracja interfejsów sieciowych
2. Konfiguracja zapory sieciowej
3. Konfiguracja DHCP
4. Konfiguracja demona Hostapd


Wymagania:
1. Łącze ze stałym lub zmiennym adresem IP. Modem ethernet lub gniazdko gdzie można się podłączyć. Dane do konfiguracji powinniśmy otrzymać od dostawcy Internetu: adres IP,  brama, maska, dns’y,
2. Klawiatura USB,
3. Monitor lub TV do instalacji.

1. Konfiguracja interfejsu eth0 – Internet
Edytujemy plik /etc/network/interfaces i dodajemy wpisy:

auto eth0
iface eth0 inet static
    address 212.180.XXX.XXX
    netmask 255.255.255.XXX
    gateway 212.180.XXX.XXX
    hwaddress ether 00:11:22:33:44:55

Opcję hwaddress ether dodajemy jeśli dostawca przydziela nam IP na podstawie adresu mac, a mamy już inną kartę sieciową..

W przypadku nadawania adresu IP dynamicznie dodajemy tylko:

auto eth0
iface eth0 inet dhcp

Jeśli ustawiliśmy adres na sztywno, skonfigurujmy serwery DNS.
Edytujemy plik /etc/resolv.conf
Na początek powinien wyglądać następująco:

nameserver 212.XX.X.XX
nameserver 212.XX.X.XX

Podnosimy interfejs poleceniem:

root@htpc1:~# ifup eth0

W tym momencie powinniśmy mieć już działający Internet na serwerze.

Jeśli zainstalowaliśmy dodatkową kartę sieciową eth1 konfigurujemy ją.
Ponownie edytujemy plik /etc/network/interfaces

auto eth1
    iface eth1 inet static
    address 172.16.250.1
    netmask 255.255.255.0
    network 172.16.250.0
    broadcast 172.16.250.255

Dodajemy od razu konfigurację karty bezprzewodowej:

auto wlan0
iface wlan0 inet static
    address 10.50.100.1
    netmask 255.255.255.0
    network 10.50.100.0
    broadcast 10.50.100.255
    pre-up /usr/local/bin/wlan0_preup.sh

Instalujemy narzędzia do zarządzania siecią bezprzewodową

root@htpc1:~# apt-get install wireless-tools


Następnie tworzymy plik: /usr/local/bin/wlan0_preup.sh i wklejamy zawartość:

#!/bin/bash
# /usr/local/bin/wlan0_preup.sh
#
ifconfig wlan0 up
iwconfig wlan0 rate auto
iwconfig wlan0 channel 6
iwconfig wlan0 txpower 18

Skrypt ten zostanie wykonany przed podniesieniem interfejsu wlan0. Nadajmy jeszcze uprawnienia:

root@htpc1:~# chmod 750 /usr/local/bin/wlan0_preup.sh

Podnosimy skonfigurowane interfejsy

root@htpc1:~# ifup eth1 && ifup wlan0

2. Konfiguracja firewalla/zapory
Interfejsy sieciowe mamy już skonfigurowane, czas zatem na zaporę i udostępnienie Internetu dla sieci lokalnej oraz WLAN. Użyjemy do tego celu narzędzia iptables ze skryptami startowymi iptables-persistent.

root@htpc1:~# apt-get install iptables-persistent

Niestety w Debianie skrypt ten jest z lekka okrojony. Wykorzystamy zatem inny skrypt ze strony http://www.ubuntucy.org/
Otwieramy plik /etc/init.d/iptables-persistent, kasujemy zawartość i wklejamy:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          iptables
# Required-Start:    mountkernfs $local_fs
# Required-Stop:     $local_fs
# Default-Start:     S
# Default-Stop:
# Short-Description: Set up iptables rules
### END INIT INFO

PATH="/sbin:/bin:/usr/sbin:/usr/bin"

# Include config file for iptables-persistent
. /etc/iptables/iptables.conf

case "$1" in
start)
    if [ -e /var/run/iptables ]; then
        echo "iptables is already started!"
        exit 1
    else
        touch /var/run/iptables
    fi

    if [ $ENABLE_ROUTING -ne 0 ]; then
        # Enable Routing
        echo 1 > /proc/sys/net/ipv4/ip_forward
    fi

    if [ $ENABLE_RP_FILTER -ne 0 ]; then
        # Enable RP_FILTER
        echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
    fi

    if [ $ENABLE_SYNCOOKIES -ne 0 ]; then
        # Enable TCP_SYNCOOKIES
        echo 1 > /proc/sys/net/ipv4/tcp_syncookies
    fi

    # Load Modules
    modprobe -a $MODULES

    # Load saved rules
    if [ -f /etc/iptables/rules ]; then
        iptables-restore /etc/iptables/rules
    fi

    # Restore Default Policies
    iptables -P INPUT ACCEPT
    iptables -P FORWARD ACCEPT
    iptables -P OUTPUT ACCEPT

    # Flush rules on default tables
    iptables -F
    iptables -t nat -F
    iptables -t mangle -F

    # Unload previously loaded modules
    modprobe -r $MODULES

    # Disable Routing if enabled
    if [ $ENABLE_ROUTING -ne 0 ]; then
        # Disable Routing
        echo 0 > /proc/sys/net/ipv4/ip_forward
    fi

    if [ $ENABLE_RP_FILTER -ne 0 ]; then
        # Enable RP_FILTER
        echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
    fi

    if [ $ENABLE_SYNCOOKIES -ne 0 ]; then
        # Enable TCP_SYNCOOKIES
        echo 0 > /proc/sys/net/ipv4/tcp_syncookies
    fi

    ;;
restart|force-reload)
    $0 stop
    $0 start
    ;;
status)
    echo "Filter Rules:"
    echo "--------------"
    iptables -L -v
    echo ""
    echo "NAT Rules:"
    echo "-------------"
    iptables -t nat -L -v
    echo ""
    echo "Mangle Rules:"
    echo "----------------"
    iptables -t mangle -L -v
    ;;
*)
    echo "Usage: $0 {start|stop|force-stop|restart|force-reload|status}" >&2
    exit 1
    ;;
esac

exit 0

Następnie tworzymy plik /etc/iptables/iptables.conf

# A basic config file for the /etc/init.d/iptable-persistent script
SAVE_NEW_RULES=0
# Modules to load:
#MODULES="nf_nat_ftp nf_conntrack_ftp nf_nat_irc nf_conntrack_irc ip_gre"
# Enable Routing?
ENABLE_ROUTING=1
# Enable rp_filter ?
ENABLE_RP_FILTER=0
# Enable tcp_syncookies
ENABLE_SYNCOOKIES=1

Na koniec dodajemy reguły do pliku /etc/iptables/rules

# Generated by iptables-save v1.4.8 on Tue Oct 25 16:52:23 2011
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Tue Oct 25 16:52:23 2011
# Generated by iptables-save v1.4.8 on Tue Oct 25 16:52:23 2011
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 10.50.100.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -s 172.16.250.0/24 -o eth0 -j MASQUERADE
COMMIT
# Completed on Tue Oct 25 16:52:23 2011
# Generated by iptables-save v1.4.8 on Tue Oct 25 16:52:23 2011
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -s 172.16.250.0/24 -i eth1 -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s 10.50.100.0/24 -j ACCEPT
-A INPUT -s 172.16.250.0/24 -j ACCEPT
-A FORWARD -o lo -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.50.100.0/24 -j ACCEPT
-A FORWARD -s 172.16.250.50/32 -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Tue Oct 25 16:52:23 2011

Uruchamiamy skrypt firewall’a

root@htpc1:~# /etc/init.d/iptables-persistent start

Sprawdzamy status

root@htpc1:~# /etc/init.d/iptables-persistent status

Powyższe to mocno okrojone reguły mojej rzeczywistej konfiguracji. Na początek powinny wystarczyć. Nie będą przy okazji blokować żadnego ruchu wychodzącego z sieci lokalnej lub wlan.

3. Instalacja i konfiguracja serwera DHCP

Przedostatnim krokiem  jest konfiguracja dhcp dla sieci lokalnej i bezprzewodowej. Dzięki temu nasz ruter będzie przyznawał adresy dynamicznie.

root@htpc1:~# apt-get install isc-dhcp-server 

Po instalacji próba uruchomienia pakietu dhcp zakończy się błędem co spowodowane jest brakiem konfiguracji.
Na początek edytujemy plik /etc/default/isc-dhcp-server i ustawiamy zmienną INTERFACES

# Defaults for dhcp initscript
# sourced by /etc/init.d/dhcp
# installed at /etc/default/isc-dhcp-server by the maintainer scripts

#
# This is a POSIX shell fragment
#

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#	Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES="wlan0 eth1"

Skoro mamy już przypisane interfejsy, wystarczy zdefiniować podsieci w pliku /etc/dhcp/dhcpd.conf

default-lease-time 600;
max-lease-time 7200;
authoritative;

subnet 10.50.100.0 netmask 255.255.255.0 {

	range 10.50.100.100 10.50.100.150;
        default-lease-time 43200;
        max-lease-time 86400;
        option domain-name-servers 212.XX.X.XX,212.XX.X.XX;
        option routers 10.50.100.1;
        option broadcast-address 10.50.100.255;
}

subnet 172.16.250.0 netmask 255.255.255.0 {
        range 172.16.250.100 172.16.250.150;
        default-lease-time 43200;
        max-lease-time 86400;
        option domain-name-servers 212.XX.X.XX,212.XX.X.XX;
        option routers 172.16.250.1;
        option broadcast-address 172.16.250.255;
}

Uruchamiamy demona DHCP

root@htpc1:~# /etc/init.d/isc-dhcp-server start

4. Konfiguracja rutera wifi – Hostapd

Standardowo, instalujemy niezbędny pakiet:

root@htpc1:~# apt-get install hostapd 

Następnie edytujemy plik /etc/default/hostapd

# Defaults for hostapd initscript
#
# See /usr/share/doc/hostapd/README.Debian for information about alternative
# methods of managing hostapd.
#
# Uncomment and set DAEMON_CONF to the absolute path of a hostapd configuration
# file and hostapd will be started during system boot. An example configuration
# file can be found at /usr/share/doc/hostapd/examples/hostapd.conf.gz
#
DAEMON_CONF="/etc/hostapd/hostapd.conf"

# Additional daemon options to be appended to hostapd command:-
# 	-d   show more debug messages (-dd for even more)
# 	-K   include key data in debug messages
# 	-t   include timestamps in some debug messages
#
# Note that -B (daemon mode) and -P (pidfile) options are automatically
# configured by the init.d script and must not be added to DAEMON_OPTS.
#
#DAEMON_OPTS=""

Edytujemy główny plik konfiguracyjny /etc/hostapd/hostapd.conf

# AP netdevice name
interface=wlan0

# Driver interface type
driver=nl80211

#Logs

logger_syslog=-1
logger_syslog_level=2
logger_stdout=0
logger_stdout_level=2

# Dump file for state information (on SIGUSR1)
dump_file=/tmp/hostapd.dump

ctrl_interface=/var/run/hostapd
ctrl_interface_group=0

##### IEEE 802.11 related configuration #########
# SSID
ssid=NazwaSieci
ignore_broadcast_ssid=0

# Country code
country_code=PL

# Operation mode
hw_mode=g
# Channel number
channel=6

# Beacon interval
beacon_int=100
# DTIM
dtim_period=2
# Maximum number of stations allowed in station table.
max_num_sta=255

# RTS/CTS threshold
rts_threshold=2347

# Fragmentation threshold
fragm_threshold=2346

# Station MAC address -based authentication
with driver=madwifi.
# 0 = accept unless in deny list
# 1 = deny unless in accept list
# 2 = use external RADIUS server (accept/deny lists are searched first)
macaddr_acl=0
auth_algs=1

# Send empty SSID in beacons and ignore probe request frames that do not
ignore_broadcast_ssid=0

# Default WMM parameters (IEEE 802.11 draft; 11-03-0504-03-000e):
wmm_enabled=1

# Low priority / AC_BK = background
wmm_ac_bk_cwmin=4
wmm_ac_bk_cwmax=10
wmm_ac_bk_aifs=7
wmm_ac_bk_txop_limit=0
wmm_ac_bk_acm=0
# Note: for IEEE 802.11b mode: cWmin=5 cWmax=10
#
# Normal priority / AC_BE = best effort
wmm_ac_be_aifs=3
wmm_ac_be_cwmin=4
wmm_ac_be_cwmax=10
wmm_ac_be_txop_limit=0
wmm_ac_be_acm=0

# High priority / AC_VI = video
wmm_ac_vi_aifs=2
wmm_ac_vi_cwmin=3
wmm_ac_vi_cwmax=4
wmm_ac_vi_txop_limit=94
wmm_ac_vi_acm=0
# Note: for IEEE 802.11b mode: cWmin=4 cWmax=5 txop_limit=188
#
# Highest priority / AC_VO = voice
wmm_ac_vo_aifs=2
wmm_ac_vo_cwmin=2
wmm_ac_vo_cwmax=3
wmm_ac_vo_txop_limit=47
wmm_ac_vo_acm=0

ieee80211n=0
eap_server=0

##### WPA/IEEE 802.11i configuration ########
wpa=3

#Jedno haslo dla wszystkch klientow
wpa_passphrase=GlowneHasloDostępowe

#Opcjonalny plik z mac adresami i kluczami
#format pliku:
# 00:00:00:00:00:00 HaslodlaDanegoKlienta
#wpa_psk_file=/etc/hostapd/wpa_psk

wpa_key_mgmt=WPA-PSK WPA-PSK-SHA256

wpa_pairwise=TKIP
rsn_pairwise=CCMP

Powyższa konfiguracja powinna wystarczyć aby zacząć korzystanie z sieci wlan(oczywiście po ustawieniu „ssid” oraz „wpa_passphrase”)
Jeśli ktoś potrzebuje bardziej zaawansowanych ustawień to powinien zajrzeć do bardzo dobrze opisanego pliku konfiguracyjnego. Plik ten dostępny jest w katalogu „examples” pakietu hostapd: /usr/share/doc/hostapd/examples/hostapd.conf.gz

Interfejs wlan0 mamy skonfigurowany, zatem powinno wystarczy wystartowanie usługi.

root@htpc1:~# /etc/init.d/hostapd start 

Co dalej ? Coś nie działa ? DHCP nie startuje ? Hostapd się nie podnosi ? Mam nadzieję, że nie. Aczkolwiek zawsze mogłem się gdzieś pomylić ;)

Powiązane wpisy:

HTPC - Odbudowa macierzy Raid 1 po awarii dysku
Debian 7 Wheezy - instalacja
Układ partycji pod Linuksem