Upewniamy sie, ze kernel ma wkompilowane odpowiednie opcje (IP: advanced router i IP: equal cost multipath, nia zaszkodzi wkompilowac wszystko w tym ciagu z IP na poczatku
) i nalozana ta latke:
http://www.ssi.bg/~ja/routes-2.4.29-9.diff . W NND to sa kernele od 2.4.32-5nnd w gore. Pozniej dodajemy odpowiednie moduly do sieciowek w /etc/rc.conf (o ile ich juz tam nie ma) i usuwamy lan i internet z daemons w tym samym pliku. Podnoszenie sieciowek i zakladanie routingu odbywa sie za pomoca skryptu autorstwa zespolu z Politechniki Gdanskiej pod kierownictwem mgr inż. Wojciecha Gumińskiego (zgubilem adres skad sciagnalem projekt, ale zainteresowanym moge go podeslac):
#!/bin/sh -x
#
IFI=eth2 #interfejs lokalny
IPI=192.168.1.1 #adres IP interfejsu lokalnego
NWI=192.168.1.0 #adres sieci lokalnej
NMI=24 #maska sieci lokalnej
IFE1=eth0 #interfejs 1 zewnetrzny
IFE2=eth1 #interfejs 2 zewnetrzny
IPE1=80.80.80.82 #adres IP interfejsu 1 zewnetrznego
IPE2=90.90.90.90 #adres IP interfejsu 2 zewnetrznego
NWE1=80.80.80.80 #adres sieci 1 zewnetrznej
NWE2=90.90.90.88 #adres sieci 2 zewnetrznej
NME1=29 #maska sieci 1 zewnetrznej
NME2=29 #maska sieci 2 zewnetrznej
BRD1=80.80.80.87 #adres rozgloszeniowy sieci 1 zewnetrznej
BRD2=90.90.90.95 #adres rozgloszeniowy sieci 2 zewnetrznej
GWE1=80.80.80.81 #brama dla interfejsu 1 zewnetrznego
GWE2=90.90.90.89 #brama dla interfejsu 2 zewnetrznego
#ustawienia interfejsow lokalnego i LAN
ip link set lo up
ip addr flush dev lo
ip addr add 127.0.0.1/8 brd + dev lo
ip link set $IFI up
ip addr flush dev $IFI
ip addr add $IPI/$NMI brd + dev $IFI
#regula z priorytetem 50
ip rule add prio 50 table main
ip route del default table main
#ustawienia interfejsow zewnetrznych
ip link set $IFE1 up
ip addr flush dev $IFE1
ip addr add $IPE1/$NME1 brd $BRD1 dev $IFE1
ip link set $IFE2 up
ip addr flush dev $IFE2
ip addr add $IPE2/$NME2 brd $BRD2 dev $IFE2
#regula z priorytetem 222
ip route del default table 222
ip rule add prio 222 table 222
ip route add default table 222 proto static nexthop via $GWE1 dev $IFE1 nexthop via $GWE2 dev $IFE2
#regula z priorytetem 201
ip rule del from $NWE1/$NME1 table 201
ip rule add prio 201 from $NWE1/$NME1 table 201
ip route add default via $GWE1 dev $IFE1 src $IPE1 proto static table 201
ip route append prohibit default table 201 metric 1 proto static
#regula z priorytetem 202
ip rule del from $NWE2/$NME2 table 202
ip rule add prio 202 from $NWE2/$NME2 table 202
ip route add default via $GWE2 dev $IFE2 src $IPE2 proto static table 202
ip route append prohibit default table 202 metric 1 proto static
#wyczyszczenie pamieci cache rutingu
ip route flush cache
Najlepiej umiescic ten skrypt w /etc/rc.d/, nadac mu prawa do wykonania i dopisac do demonow w /etc/rc.conf w miejsce, gdzie byl lan i internet.
Zmodyfikowany firewall Zciecha (nie pytajcie o inne, bo ich nigdy nie uzywalem): UWAGA: kilka zmiennych jest skopiowanych z poprzedniego skryptu i trzeba je tutaj takze zmienic na wlasne!
#!/bin/sh
# firewall 0.1-2004.12.27 Zciech (poprawka w lini 113 i 49 - macieks)
#modyfikacja do obslugi 2 lacz
# W podstawowej wersji caly ruch z inerfejsow wewnetrznych jest dopuszczony i maskowany
# ruch z internetu zabroniony poza pakietami "powracajacymi" juz nawiazanych polaczen
# i polaczen na strone www (port 80 tcp) oraz pingi 1/s
. /etc/rc.conf
. /etc/rc.d/functions
NWI=192.168.1.0
NMI=24
IFE1=eth0
IFE2=eth1
IPE1=80.80.80.82
IPE2=90.90.90.90
i=`which iptables`
case $1 in
start)
if [ -e /proc/sys/net/ipv4/tcp_ecn ];then
echo 0 > /proc/sys/net/ipv4/tcp_ecn
fi
echo 1 > /proc/sys/net/ipv4/ip_forward
if [ -e /proc/sys/net/ipv4/tcp_syncookies ] ; then
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
fi
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 1 > $f
done
$i -F
$i -F -t nat
$i -P INPUT DROP
$i -P FORWARD DROP
$i -P OUTPUT ACCEPT
# interfejs lo
$i -A INPUT -i lo -j ACCEPT
$i -A FORWARD -o lo -j ACCEPT
# Blaster i Saser
$i -A INPUT -p tcp --dst 0/0 -m multiport --dport 135,445 -j DROP
$i -A FORWARD -p tcp --dst 0/0 -m multiport --dport 135,445 -j DROP
# Odrzucamy z komunikatem ICMP Port Unreachable polaczenia
# na IDENT oraz SOCKS (czesto sprawdzane przez serwery IRC)
# Jesli udostepniasz te uslugi zaplotkuj (#) odpowiedne linie
# zaplotkuj jesli nie chcesz udostepniac serwisu ident do inetu
if [ "$IDENT" = "1" ]; then
$i -A INPUT -p tcp -i $IFE1 --dport 113 -j ACCEPT
$i -A INPUT -p tcp -i $IFE2 --dport 113 -j ACCEPT
else
$i -A INPUT -p tcp --dst 0/0 --dport 113 -j REJECT --reject-with icmp-port-unreachable
fi
$i -A INPUT -p tcp --dst 0/0 --dport 1080 -j REJECT --reject-with icmp-port-unreachable
# zaplotkuj jesli nie chcesz udostepniac serwisu http do inetu
if [ "$WWW" = "1" ]; then
$i -A INPUT -p tcp -i $IFE1 --dport 80 -j ACCEPT
$i -A INPUT -p tcp -i $IFE2 --dport 80 -j ACCEPT
fi
# zaplotkuj jesli nie chcesz udostepniac serwisu https do inetu
if [ "$HTTPS" = "1" ]; then
$i -A INPUT -p tcp -i $IFE1 --dport 443 -j ACCEPT
$i -A INPUT -p tcp -i $IFE2 --dport 443 -j ACCEPT
fi
# zaplotkuj jesli nie chcesz udostepniac serwisu ftp do inetu
if [ "$FTP" = "1" ]; then
$i -A INPUT -p tcp -i $IFE1 --dport 20 -j ACCEPT
$i -A INPUT -p tcp -i $IFE1 --dport 21 -j ACCEPT
$i -A INPUT -p tcp -i $IFE2 --dport 20 -j ACCEPT
$i -A INPUT -p tcp -i $IFE2 --dport 21 -j ACCEPT
fi
# zaplotkuj jesli nie chcesz udostepniac poczty do inetu
if [ "$MAIL" = "1" ]; then
$i -A INPUT -p tcp -i $IFE1 --dport 110 -j ACCEPT
$i -A INPUT -p tcp -i $IFE1 --dport 25 -j ACCEPT
$i -A INPUT -p tcp -i $IFE2 --dport 110 -j ACCEPT
$i -A INPUT -p tcp -i $IFE2 --dport 25 -j ACCEPT
fi
# zaplotkuj jesli nie chcesz udostepniac SSH do inetu
if [ "$SSH" = "1" ]; then
PORT_SSH=`grep ^Port /etc/ssh/sshd_config| cut -f 2 -d " "`
[ -z $PORT_SSH ] && PORT_SSH=22
$i -A INPUT -p tcp -i $IFE1 --dport $PORT_SSH -j ACCEPT
$i -A INPUT -p tcp -i $IFE2 --dport $PORT_SSH -j ACCEPT
fi
# zaplotkuj jesli nie chcesz udostepniac serwera IMAP do inetu
if [ "$IMAP" = "1" ]; then
$i -A INPUT -p tcp -i $IFE1 --dport 143 -j ACCEPT
$i -A INPUT -p udp -i $IFE1 --dport 143 -j ACCEPT
$i -A INPUT -p tcp -i $IFE2 --dport 143 -j ACCEPT
$i -A INPUT -p udp -i $IFE2 --dport 143 -j ACCEPT
fi
# zaplotkuj jesli nie chcesz udostepniac serwera IMAPS do inetu
if [ "$IMAPS" = "1" ]; then
$i -A INPUT -p tcp -i $IFE1 --dport 993 -j ACCEPT
$i -A INPUT -p udp -i $IFE1 --dport 993 -j ACCEPT
$i -A INPUT -p tcp -i $IFE2 --dport 993 -j ACCEPT
$i -A INPUT -p udp -i $IFE2 --dport 993 -j ACCEPT
fi
# pingi pozwalamy
$i -A INPUT -p icmp --icmp-type echo-request -j ACCEPT -m limit --limit 1/sec
#przyklad przekierowania portow na emule
#przekierowanie dla tasiora
#$i -I FORWARD -p tcp -d 192.168.1.45 --dport 4662 -j ACCEPT
#$i -t nat -A PREROUTING -p tcp -i $IFE1 --dport 4662 -j DNAT --to 192.168.1.45
#$i -t nat -A PREROUTING -p tcp -i $IFE2 --dport 4662 -j DNAT --to 192.168.1.45
#$i -I FORWARD -p udp -d 192.168.1.45 --dport 4672 -j ACCEPT
#$i -t nat -A PREROUTING -p udp -i $IFE1 --dport 4672 -j DNAT --to 192.168.1.45
#$i -t nat -A PREROUTING -p udp -i $IFE2 --dport 4672 -j DNAT --to 192.168.1.45
#malo zrozumiale dla mnie reguly ze skryptu lb
$i -X keep_state -t nat
$i -X keep_state -t filter
#regula i lancuch podtrzymania polaczen
#tabela filter
$i -t filter -N keep_state
$i -t filter -A keep_state -m state --state RELATED,ESTABLISHED -j ACCEPT
$i -t filter -A keep_state -j RETURN
#regula i lancuch podtrzymania polaczen
#tabela nat
$i -t nat -N keep_state
$i -t nat -A keep_state -m state --state RELATED,ESTABLISHED -j ACCEPT
$i -t nat -A keep_state -j RETURN
#przekierowania do lancucha podtrzymania pol.
#polaczen w pozostalych tabelach
$i -t nat -A PREROUTING -j keep_state
$i -t nat -A POSTROUTING -j keep_state
$i -t nat -A OUTPUT -j keep_state
$i -t filter -A INPUT -j keep_state
$i -t filter -A FORWARD -j keep_state
$i -t filter -A OUTPUT -j keep_state
# Wszystkie polaczenia z innych interfejsow niz interfejs do internetu pozwalamy
$i -A INPUT -i eth2 -j ACCEPT
$i -A FORWARD -i eth2 -j ACCEPT
# maskarada zostala zastapiona SNATem
$i -t nat -A POSTROUTING -o $IFE1 -s $NWI/$NMI -j SNAT --to $IPE1
$i -t nat -A POSTROUTING -o $IFE2 -s $NWI/$NMI -j SNAT --to $IPE2
# Zezwalamy na wszystko co odbywa sie w ramach juz dozwolonych polaczen
$i -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
$i -A FORWARD -j ACCEPT -m state --state ESTABLISHED,RELATED
wynik
;;
stop)
$i -F INPUT
$i -F FORWARD
$i -F OUTPUT
$i -P INPUT DROP
$i -P FORWARD DROP
$i -P OUTPUT DROP
echo 0 > /proc/sys/net/ipv4/ip_forward
wynik
;;
esac
Dobrym pomyslem jest dodanie /etc/iptables/firewall do sekcji NoUpgrade w /etc/pacman.conf , zeby nam wszystkiego nie wcielo przy aktualizacji iptables.
W w/w projeckie autorzy proponuja zatrudnic niceshapera do podzialu lacza. Wedlug nich wystarczy odwrocic mu upload z downloadem i wszystko bedzie ladnie dzialalo. Jako, ze nie pokazali wynikow swojej pracy, a mi sie to nie udalo, to stosuje htb Zciecha (
http://ww1.devel-nnd.brb.pl/nnd/repo.te ... pkg.tar.gz).
Konfigurujemy htb na interfejsach eth0 (wychodzacy) i eth2 (przychodzacy). W DSL download nie jest tak wazny, wiec mozna sobie pozwolic na jedna kolejke, wiec jako predkosci lacza podajemy 95% sumy obydwoch lacz dla downloadu (w przypadku DSLi 4 mbit bedzie to ok. 7800 kbit) i 100% downloadu z JEDNEGO lacza (w tym samym przypadku 512 kbit). Reszta konfiguracji pozostaje taka sama jak w przypadku jednego lacza. Teraz najmilsza czesc: edytujemy /usr/sbin/rchtb, kopiujemy czesc odpowiadajaca za upload (zaczyna sie od komentarza INTERFEJS ETH0, a konczy jedna linia z regula kolejki po ostatnim uzytkowniku) i zmieniamy w tej czesci kazde eth0 na eth1 i numer klasy 2:costam na 3:costam. Jest z tym troche zabawy, wiec jak ktos ma czas, checi i umiejetnosci, to moze przerobic konfigurator htb.
Kilka uwag i juz koncze:
Jak ktos ma w sieci nalogowych graczy w csa, to pewnie beda narzekali, ze trzeba ciagle wpisywac haslo do steama. Rozwiazanie:
/usr/sbin/iptables -t nat -I POSTROUTING -s
ip gracza -d 207.173.177.0/24 -j SNAT --to
ip przypisane eth0
/usr/sbin/iptables -t nat -I POSTROUTING -s
ip gracza -p udp --dport 20000:65000 -j SNAT --to
ip przypisane eth0
Wiem, ze ten zakres portow to lekka przesada, ale serwery csa dzialaja na roznych dziwnych portach i nie zauwazylem jeszcze, zeby powodowal jakies problemy (np. p2p dzialaja na nizszych).
Jak z jakiegos powodu chcesz, zeby uzytkownik korzystal z jednego lacza:
ip rule add form
ip przypisane do eth1 lub eth2 table 201 (lub 202, jak przekierowujesz na 2 lacze)
ip rule add from
ip uzytkownika table 201 (202 dla drugiego lacza)
Po jakichkolwiek zmianach w tablicy routingu trzeba ja odswiezyc, wiec:
ip route flush cache
Jak bedziesz mial problemy z dzialaniem dhcp, upewnij sie, ze w /etc/rc.conf zmienna DHCPIF=eth2
Uff, to juz koniec. Mi by sie nie chcialo tyle czytac
Wszelkie uwagi, wytkniecia bledow, najlepiej z poprawa mile widziane.
Na koniec dobra rada: Kup sobie jedno porzadne lacze, albo router cisco, ktory zrobi za Ciebie ten pieprz... load balancing.