artykuły
Powrót do listy artykułów

Temat artykułu: Linux jako serwer dostępowy do Internetu, Firewall + HTB
Tekst napisał Krycha dnia 18-01-2005

1. Wprowadzenie

Tak jak obiecałem w HOWTO dot. kompilacji kernela linux-2.4.24 ze napisze
nowe HOWTO w kotórym to będze dokładnie opisane jak podłaczyć linuxa i go skonfigurować do dzielenia łacza dla 'przykładowo' 20 użytkowników

2. Założenia

1. Serwer postawiony na dystrybucji slackware 9.1 skonfigurowany wg mojego howto

(jest tutaj)

2. 2 karty sieciowe 3com xxx ;>
eth0 -> NET
eth1 -> LAN

3. Łącze stałe o przepustowości 1/1Mbits i przydzielonym IP aaa.bbb.ccc.ddd
4. Podział łacza dla 20 uzytkowników w klasie IP 192.168.1.0/24

3. Konfiguracja interfejsów i routingu

Zakładam ze slack jest skompilowany z obłsugą iprouta2 i htb etc. tak więc zaczynamy od konfiguracji interfejsów sieciowych

wg. tego co przydziela nam dostawca z nowym łączem musimy sobie poradzic i skonfigurowac serwer

Ustawiamy nasze wrota na INET

# ifconfig eth0 'IP' netmask 'MASKA' broadcast 'BROADCAST'
# route add default gw 'BRAMA'

A teraz nasza lokalke

# ifconfig eth1 192.168.1.1 netmask 255.255.255.0 brodcast 192.168.1.255


Oczywiscie przyjmuje ze necik chodzi bez problemu i zajmiemy sie teraz naszym firewallem
Jest to bardzo ważny krok iż od tego bedzie zależało jak bedzie nasz linux filtrował pakiety ;P

4. Konfiguracja FIRWALLA

------ CUT ----------- /etc/rc.d/rc.firewall

#!/bin/bash
# sciezka do IPTABLES
IPT="/usr/local/sbin/iptables"
usage()
{
echo "Usage: $0 {start|stop}"
}
case "$1" in
start)

echo "1" > /proc/sys/net/ipv4/tcp_syncookies

# interfejsy
GW="eth0"
IPGW="aaa.bbb.ccc.ddd" # routowalny adres IP {od dostawcy}
IF="eth1"
IPIF="192.168.1.1"

# tu definiujejmy hosty ktorych adresy maskujemy
NATED_HOSTS="192.168.1.11 192.168.1.12 192.168.1.13 192.168.1.14 192.168.1.15 192.168.1.16 192.168.1.17
192.168.1.18 192.168.1.19 192.168.1.20 192.168.1.21 192.168.1.22 192.168.1.23 192.168.24 192.168.1.25
192.168.1.26 192.168.1.27 192.168.1.28 192.168.1.29 192.168.1.30"

# a to juz maskarada

for HOST in $NATED_HOSTS; do
$IPT -t nat -A POSTROUTING -o $GW -s $HOST -j MASQUERADE
done

echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
echo "1" > /proc/sys/net/ipv4/ip_forward

# Hosty ktore ma wpuszczas serwer z sieci lokalnej
# wg identyfijacji ADRES IP + MAC

$IPT -t nat -A PREROUTING -i $IF -s 192.168.1.11 -m mac --mac-source 00:00:00:00:00:00 -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF -s 192.168.1.12 -m mac --mac-source 00:00:00:00:00:01 -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF -s 192.168.1.13 -m mac --mac-source 00:00:00:00:00:02 -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF -s 192.168.1.14 -m mac --mac-source 00:00:00:00:00:03 -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF -s 192.168.1.15 -m mac --mac-source 00:00:00:00:00:04 -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF -s 192.168.1.16 -m mac --mac-source 00:00:00:00:00:05 -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF -s 192.168.1.17 -m mac --mac-source 00:00:00:00:00:06 -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF -s 192.168.1.18 -m mac --mac-source 00:00:00:00:00:07 -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF -s 192.168.1.19 -m mac --mac-source 00:00:00:00:00:08 -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF -s 192.168.1.20 -m mac --mac-source 00:00:00:00:00:09 -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF -s 192.168.1.21 -m mac --mac-source 00:00:00:00:00:0A -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF -s 192.168.1.22 -m mac --mac-source 00:00:00:00:00:0B -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF -s 192.168.1.23 -m mac --mac-source 00:00:00:00:00:0C -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF -s 192.168.1.24 -m mac --mac-source 00:00:00:00:00:0D -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF -s 192.168.1.25 -m mac --mac-source 00:00:00:00:00:0E -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF -s 192.168.1.26 -m mac --mac-source 00:00:00:00:00:0F -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF -s 192.168.1.27 -m mac --mac-source 00:00:00:00:00:1A -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF -s 192.168.1.28 -m mac --mac-source 00:00:00:00:00:2A -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF -s 192.168.1.29 -m mac --mac-source 00:00:00:00:00:3A -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF -s 192.168.1.30 -m mac --mac-source 00:00:00:00:00:4A -j ACCEPT

# Blokujemy ruch

$IPT -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.0/24 -j ACCEPT
$IPT -t nat -A POSTROUTING -s 192.168.0.0/16 -d 192.168.0.0/16 -j DROP

# Blokujemy piratow!

$IPT -t nat -A PREROUTING -i $IF -j DROP

##
echo "Firewall wlaczony"
;;
stop)
$IPT -F
$IPT -Z
$IPT -X
$IPT -t nat -F
$IPT -t nat -Z
$IPT -t nat -X
echo "Firewall wylaczony"
;;
*)
usage
;;
esac

------ cut ---------

I tak własnie mamy bardzo prostego i skutecznego firewalla, tzn nikt z lokalki nie będzie miał dostępu do Internetu jeżeli nie przypisze się go do maskarady i do tablicy która sprawdza powiązania IP + MACi i dopuszcza do serwera w każdym innym przypadku taki delikfent jest blokowany i nie widzi naszego serwera z sieci lokalnej.
Nie bede tutaj zagłębiał się i opisywał każdą linijkę po kolei, gdyż wprowadzenie do firewalla macie dzięki uprzejmosci "pitt2k" który to napisał 2 artykuły na ten temat:
Artykuł 1
Artykuł 2
aczkolwiek jak by ktoś nie rozumiał czegos to czekam na maile.

5. Teraz pozostał nam ostatni kąsek czyli dzielenie łącza oparte o HTB

------ cut ------- /etc/firewall/htb

#!/bin/sh
tc=/sbin/tc
iface_in="eth0"
iface_out="eth1"
band_full="1024000kbit"
band_inet="960kbit"
band_inet_full="1024kbit"
band_inc="960kbit"
band_lan="102400kbit"
podsiec1="1"
ip_serw_lan="192.168."$podsiec1".1"
#wart min transferu
rate="100kbit"
#wart max przy zalozeniu ze inni nie wykorzystaja pasma
ceil="360kbit"

# czyszczenie regulek
echo "czyszcze"
$tc qdisc del root dev $iface_in
$tc qdisc del root dev $iface_out
$tc qdisc del dev $iface_in ingress
$tc qdisc del dev $iface_out ingress
echo "done"

echo "root"
$tc qdisc add dev $iface_out root handle 1: htb

echo "glowna"
#kolejka glowna - max przepustowosc
$tc class add dev $iface_out parent 1: classid 1:1 htb rate $band_full ceil $band_full

echo "net"
#kolejka dla netu
$tc class add dev $iface_out parent 1:1 classid 1:2 htb rate $band_inet ceil $band_inet_full

echo "lan"
#kolejka dla lanu
$tc class add dev $iface_out parent 1:1 classid 1:3 htb rate $band_lan ceil $band_lan

echo "dostep do kabla dla wielu polaczen"
#sprawiedliwy dostep do kabla dla wielu jednoczesnych polaczen
$tc qdisc add dev $iface_out parent 1:3 handle 3:0 sfq perturb 10

#echo "filtrowanie pakietow wracajacych"
#$tc qdisc add dev $iface_in handle ffff: ingress

#$tc filter add dev $iface_in parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate $band_inc burst 15k drop flowid :1

##tc filter add dev $iface_out protocol ip preference 1 parent ffff: u32 match ip src 192.168.0.0/16 police rate $band_lan burst $band_lan drop flowid :2

echo "HTB dla podsieci .$podsiec1."
#nr ip
x=10
#nr flowid
x1=30
while [ $x -le 30 ] ; do
x=$((x+1)) ;
x1=$((x1+2)) ;
$tc class add dev $iface_out parent 1:2 classid 1:$x1 htb rate $rate ceil $ceil ;
$tc filter add dev $iface_out protocol ip preference 2 parent 1: u32 match ip dst 192.168.$podsiec1.$x flowid 1:$x1 ;
$tc qdisc add dev $iface_out parent 1:$x1 handle $x1:0 sfq perturb 10 ;
done
echo " done $podsiec1 "

echo "HTB done."

---------cut--------------

I to jest już koniec ;))
Wystarczy tyle żeby to wszystko dobrze chodzilo teraz możecie odpalić sobie 'iptrafa' i patrzeć jakie macie obaciążenia na serwerze a najlepiej jakieś statystyki dla łacza ;>
Może innym razem jak znajde wiecęj czasu opisze jak robic statystyki łacza...