Udostępnianie połączenia internetowego
Opracowane przez: 'BiExi'
2005-03-10 13:40

Chcemy stworzyć taką sieć:

----internet--------eth0-[server]--eth1------sieć lokalna-----

Najpierw musimy skonfigurować prawidłowo interfejsy sieciowe w naszym routerze. Zakładamy że:

eth0 - interfejs na świat
eth1 - interfejs na sieć lokalną

Szczegółowy opis konfiguracji interfejsów sieciowych znajdziesz tutaj.

Mamy 2 możliwości:
1.) Nasz usługodawca przydziela nam adres IP dynamicznie, czyli nasz serwer pobiera sam ustawienia adresów od dostawcy. Wtedy nasz plik /etc/network/interfaces będzie wyglądał tak:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

auto eth1
iface eth1 inet static
        address 192.168.1.1
        netmask 255.255.255.0

2.) Mamy na umowie z naszym dostawcą internetu informacje o IP, masce sieci, network, bramie; wtedy nasz plik /etc/network/interfaces będzie wyglądal tak:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
       address adres_ip_z_umowy
       netmask maska_sieci_z_imowy
       network adres_sieci_Z_umowy
       gateway brama_z_umowy

auto eth1
iface eth1 inet static
        address 192.168.1.1
        netmask 255.255.255.0

nasz plik /etc/resolv.conf powinien wyglądać tak:

nameserver 194.204.152.34
nameserver 194.204.159.1

Teraz restartujemy ustawienia interfejsów wydając polecenie

/etc/init.d/networking restart

Sprawdzamy czy wszystko działa poprawnie, czyli czy na sererze mamy internet. Piszemy np.

ping google.pl

Jeśli dostaniemy np. coś w tym stylu

PING google.pl (216.239.57.99): 56 data bytes
64 bytes from 216.239.57.99: icmp_seq=0 ttl=239 time=207.4 ms
64 bytes from 216.239.57.99: icmp_seq=1 ttl=239 time=204.8 ms

tzn. że internet nam dziala na serwerku. Teraz zajmiemy się udostępnianiem połączenia internetowego dla sieci lokalnej - tworzymy plik /etc/init.d/firewall
i nadajemy mu uprawnienia do uruchamiania

chmod +x /etc/init.d/firewall

oraz edytujemy ww. plik wpisując do niego przykładowa zawartość

# wlaczenie w kernelu forwardowania 
echo 1 > /proc/sys/net/ipv4/ip_forward
# czyszczenie starych regul
iptables -F
iptables -X
iptables -t nat -X
iptables -t nat -F
# ustawienie polityki dzialania
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# zezwolenie nna laczenie sie z naszym zewnetrznym ip po ssh

iptables -A INPUT -i lo -j ACCEPT
iptables -A FORWARD -o lo -j ACCEPT

iptables -A INPUT -s 0/0 -d ip.ip.ip.ip -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -s 0/0 -d ip.ip.ip.ip -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 0/0 -d ip.ip.ip.ip -p udp --dport 22 -j ACCEPT
iptables -A OUTPUT -s 0/0 -d ip.ip.ip.ip -p udp --dport 22 -j ACCEPT
# polaczenia nawiazane
iptables -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
iptables -A FORWARD -j ACCEPT -m state --state ESTABLISHED,RELATED
iptables -A OUTPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
# udostepniaie internetu w sieci lokalnej
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT

Zapisujemy plik. Zamiast ip.ip.ip.ip wpisujemy IP zewnętrzne naszego serwera.
Wydajemy jeszcze polecenie, ktore spowoduje ze ww. skrypt będzie się uruchamial przy starcie systemu

update-rc.d firewall defaults 20

Teraz konfiguracja stanowisk w sieci

np. komputer nr 1
IP 192.168.1.2
Maska Sieci 255.255.255.0
Brama 192.168.1.1
DNS'y 194.204.159.1 194.204.152.34

np. komputer nr 2
IP 192.168.1.3
Maska Sieci 255.255.255.0
Brama 192.168.1.1
DNS'y 194.204.159.1 194.204.152.34

Ok, sprawdzamy czy wszystko nam działa poprawnie - uruchamiamy skrypt poleceniem

/etc/init.d/firewall

i w sumie to jest najprostsza metoda udostępniania połączenia.

Bardziej rozbudowany przykład - chcemy przydzielać użytkownikom po DHCP ustawienia sieci oraz filtorwac ich po MAC-ach

Zakladamy ze:
komp 1 ip 912.168.1.2 ma MAC 00:80:48:14:A4:68
komp 3 ip 912.168.1.3 ma MAC 00:30:4F:26:EC:D8

Do tego celu musimy mieć skonfigurowany serwer DHCP. Instalujemy

apt-get install dhcp

Teraz konfiguracja tego serwera, ktory ma nam przydzielac adresy na interfejsie eth1 - w pliku

/etc/default/dhcp

wartość

INTERFACES=""

zmieniamy na

INTERFACES="eth1"

Oto przykladowy plik /etc/dhcpd.conf dla naszej sieci

subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.2 192.168.1.224;
default-lease-time 600;
option domain-name "naszadomena.pl";
option domain-name-servers 194.204.152.34, 194.204.159.1;
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;

 host komp1 { # komputer nr 1
      hardware ethernet 00:80:48:14:A4:68;
      fixed-address 192.168.1.2;
  }

 host komp2 { # komputer nr 2
      hardware ethernet 00:30:4F:26:EC:D8;
      fixed-address 192.168.1.3;
  }
}

Uruchamiamy DHCP od nowa

/etc/init.d/dhcp restart

Nasz plik /etc/init.d/firewall będzie wyglądal tak

# wlaczenie w kernelu forwardowania 
echo 1 > /proc/sys/net/ipv4/ip_forward
# czyszczenie starych regul
iptables -F
iptables -X
iptables -t nat -X
iptables -t nat -F
# ustawienie polityki dzialania
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# zezwolenie nna laczenie sie z naszym zewnetrznym ip po ssh
iptables -A INPUT -s 0/0 -d ip.ip.ip.ip -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -s 0/0 -d ip.ip.ip.ip -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 0/0 -d ip.ip.ip.ip -p udp --dport 22 -j ACCEPT
iptables -A OUTPUT -s 0/0 -d ip.ip.ip.ip -p udp --dport 22 -j ACCEPT
# polaczenia nawiazane
iptables -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
iptables -A FORWARD -j ACCEPT -m state --state ESTABLISHED,RELATED
iptables -A OUTPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
# udostepniaie internetu w sieci lokalnej
# dla kompa nr 1
iptables -t nat -A POSTROUTING -s 192.168.1.2 -j MASQUERADE
iptables -A FORWARD -m mac --mac-source 00:80:48:14:A4:68 -j ACCEPT
# dla kompa nr 2
iptables -t nat -A POSTROUTING -s 192.168.1.3 -j MASQUERADE
iptables -A FORWARD -m mac --mac-source 00:30:4F:26:EC:D8 -j ACCEPT

Może się nam zdarzyć, że np. któraś osoba nie płaci nam za internet, a wiec chemy ją odciąć od netu. Dodatkowo chemy aby pokazywał się jej po próbie wejścia na jakąś stronę gustowny komunikat. Do dzieła:

apt-get install boa

Edytujemy plik /etc/boa/boa.conf zmieniamy wartość (mniej więcej linijka 25)

Port 80

na

Port 999

zmieniamy wartość (mniej więcej linijka 158)

DocumentRoot /var/www

na

DocumentRoot /var/www/info

Zapisujemy zmiany w pliku i wydajemy polecenia:

mkdir /var/www/info
touch /var/www/info/index.html

w pliku /var/www/info/index.html umieszczamy treść komunikatu

i resetujemy boa

/etc/init.d/boa restart

Zakladamy, że użytkownik od kompa nr 2 nie zaplacił za neta, a wiec na końcu pliku /etc/init.d/firewall dopisujemy

iptables -D INPUT -m mac --mac-source 00:30:4F:26:EC:D8 -j ACCEPT
iptables -D FORWARD -m mac --mac-source 00:30:4F:26:EC:D8 -j ACCEPT
iptables -A FORWARD -m mac --mac-source 00:30:4F:26:EC:D8 -p udp \
     --dport 53 -j ACCEPT
iptables -A INPUT -m mac --mac-source 00:30:4F:26:EC:D8 -p tcp \
     --dport 999 -s 192.168.1.3 -d 192.168.1.1 -j ACCEPT
iptables -A FORWARD -m mac --mac-source 00:30:4F:26:EC:D8 -p tcp \
     --dport 999 -s 192.168.1.3 -d 192.168.1.1 -j ACCEPT
iptables -A PREROUTING -t nat -s 192.168.1.3 -p tcp --dport 1:52 \
     -j DNAT --to 192.168.1.1:999
iptables -A PREROUTING -t nat -s 192.168.1.3 -p tcp --dport 54:65535 \
     -j DNAT --to 192.168.1.1:999

i resetujemy firewalla

/etc/init.d/firewall

Jeśli mamy większą ilość użytkowników w sieci to ww. czynności mogą być dość pracochłonne, więc dołączam skrypt, który pozwoli na zautomatyzowanie procesu

firewall.tar.gz

Rozpakowywujemy to archiwum do katalogu /root powstanie nam katalog /root/firewall, w którym mamy
add_host - skrypt dodający użytkowników do plików
ipf - w tym pliku znajdują się pierwsze reguły, które muszą być w pliku firewall
porty.list - plik zawiera ip serwera oraz porty, które chemy otworzyć na naszym serwerze
shit.list - lista użytkownikow, którzy nie płacą za neta
users.list - lista wszystkich użytkowników

Edytujemy plik add_host i nadajemy wartości zmiennym (domyślnie wpisane sa wartości jak dla tego artykułu).
Edytyjemy plik users.list i shit.list też wpisane są tam wartości przykładowe z artykułu.

Uruchamiamy plik add_host co spowoduje przeładowanie ustawień DHCP i uruchamianie udostepniania. Jednorazowo wydajemy polecenie

update-rc.d firewall defaults 20

Po np. dodaniu użytkownika do users.list lub shit.list uruchamiamy add_host by przeładować ustawienia.