Router z kontekstowym filtrowaniem treści stron WWW na Ubuntu Server

Router z kontekstowym filtrowaniem treści stron WWW na Ubuntu Server

Router z kontekstowym filtrowaniem treści stron WWW na Ubuntu Server

Możliwość komentowania Router z kontekstowym filtrowaniem treści stron WWW na Ubuntu Server została wyłączona

Poniżej przedstawiam instrukcję instalacji i konfiguracji serwera Ubuntu do pracy jako router z automatycznym filtrem treści stron internetowych. Przykładem zastosowania jest usunięcie możliwości oglądania treści pornograficznych na stronach www lub zablokowanie dostępu do gier online.


INSTALACJA SYSTEMU

– ściągnięcie najnowszej dystrybucji Ubuntu Server (poniższe instrukcje sprawdzone dla wersji 16.04 – uwaga! tylko aktualne wersje mają działające repozytoria!)

– uruchomienie instalatora z CD lub USB

– wybranie języka, następnie wybranie opcji „Instalacja Ubuntu Server” i potwierdzenie chęci instalacji mimo nieukończonego tłumaczenia instalatora.
– wybór lokalizacji („Polska”) oraz układu klawiatury (pomijamy wykrywanie, wybieramy kraj i układ „Polski”).
– wskazanie podstawowego interfejsu sieciowego, czyli karty sieciowej podłączonej do internetu, oraz podanie nazwy serwera. Nazwy wykrytych kart należy zapisać!
– utworzenie konta użytkownika: podanie pełnej nazwy, loginu oraz dwukrotnie hasła.
– odmówienie szyfrowania katalogu domowego.
– ustawienie strefy czasowej: zatwierdzenie domyślnie wybranej strefy „Europe/Warsaw”.
– przygotowania partycji i zapisanie zmian na dysku (najszybciej automatycznie: „przewodnik – cały dysk”).
– zainstalowanie pakietów na twardym dysku.
– wprowadzenie danych ewentualnego serwera proxy, jeśli łączymy się przez niego w sieci.
– określenie sposobu aktualizacji systemu. Najlepiej „Brak aktualizacji automatycznych”.
– wybór zestawu (ról) oprogramowania serwerowego. Oprócz zaznaczonej opcji wybieramy dodatkowo „OpenSSH Server” (przyda się do konfiguracji zdalnej).
– zainstalowanie boot menedżera GRUB. Potwierdzamy propozycję zainstalowania w MBR (master boot record).
– nastąpi ponowne uruchomienie komputera.
– dokonujemy aktualizacji całego systemu poprzez

apt-get dist-upgrade

– ponowne uruchomienie komputera – instalacja zakończona.


UWAGA NAD UWAGAMI!

Jeżeli cokolwiek skopiujesz z tej strony w Windows i będziesz wklejał do plików w linuks pojawi się problem ze znakami końca linii. Każdy plik przygotowany w ten sposób trzeba sprawdzić w edytorze vi i pousuwać na końcu linii znaki ^M  !!! Bez tego skrypty bash będą wykonywane z błędami!

Dodatkowowo – wdytor w systemie CMS tej strony zamienia podwójne znaki — na pojedyncze. Starałem się to poprawić, ale mogłem coś jeszcze przeoczyć!


PO INSTALACJI – KONFIGURACJA INTERFEJSÓW SIECIOWYCH

#ip addr

Określ i zapisz nazwy interfejsów i sprawdź który został przypisany do WAN, a który do LAN
następnie edytuj plik  /etc/network/interfaces

dokonując zapisu:

auto lo
iface lo inet loopback

# WAN interface przez DHCP
auto eth0
iface eth0 inet dhcp

# LAN interface statycznie
auto eth1
iface eth1 inet static
address 192.168.100.1
network 192.168.100.0
netmask 255.255.255.0
broadcast 192.168.100.255
dns-nameservers 192.168.100.1
dns-search mojadomena.org
dns-domain mojadomena.org

– zapisz plik i zrestartuj komputer


SERWER DHCP i DNS – DNSMASQ

#sudo apt-get install dnsmasq

Edytuj plik /etc/dnsmasq.conf do postaci:

domain-needed
bogus-priv
filterwin2k
# nie korzystaj z pliku /etc/resolv.conf
no-resolv
# serwery Open DNS (lub naszego ISP)
server=208.67.222.222
server=208.67.220.220
# nasza domena
local=/mojadomena.org/
# nasłuchuj na interfejsie – ustaw swój interfejs LAN
interface=eth1
expand-hosts
domain=mojadomena.org
# zakres adresów
dhcp-range=192.168.100.10,192.168.100.200,255.255.255.0,12h
# przykład rezerwacji adresów stałych
dhcp-host=00:1E:33:49:0E:C2,stacja1,192.168.19.14,12h
# dodatkowe opcje
dhcp-option=3,192.168.100.1 # adres routera
# Opcje dla Samby w roli PDC jeżeli korzystamy
#dhcp-option=19,0           # opcja ip-forwarding off
#dhcp-option=44,0.0.0.0     # WINS server(s)
#dhcp-option=45,0.0.0.0     # netbios datagram distribution server
#dhcp-option=46,8           # netbios node type (hybrid)
dhcp-option=vendor:MSFT,2,1i # zwalnianie przydzielonego adresu DHCP
# serwer autorytatywny
dhcp-authoritative
cache-size=200

Następnie edytuj plik /etc/dhcp/dhclient.conf

supersede domain-name „mojadomena.org”;
prepend domain-name-servers 127.0.0.1;

Edytuj plik /etc/hosts

#127.0.1.1 mojserwer.mojadomena.org mojserwer #to zakomentowujemy
192.168.100.1 mojserwer.mojadomena.org mojserwer

Serwer uruchamiamy

sudo service dnsmasq start

Teraz należy sprawdzić czy serwer przydziela prawidłowo adresy IP i inne potrzebne parametry (w windows ipconfig /all) Jeśli nie działa może być konieczny restart serwera.


FIREWALL i NAT

W pliku /etc/sysctl.conf trzeba odkomentować opcję:

net.ipv4.ip_forward=1

Utwórz plik tekstowy  /etc/dowolny_katalog/firewall.sh

W środku wklej treść:

#!/bin/bash
INTIF=”eth1″
INTNET=”192.168.100.0/24″
INTIP=”192.168.100.254″
EXTIF=”eth0″
EXTIP=”`/sbin/ifconfig $EXTIF | grep 'inet addr’ | awk '{print $2}’ | sed -e 's/.*://’`”
UNIVERSE=”0.0.0.0/0″

iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD ACCEPT
iptables -F FORWARD
iptables -F -t nat

if [ „`iptables -L | grep droplog`” ]; then
iptables -F droplog
fi
iptables -X
iptables -Z

# Włączenie routowania
iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
iptables -A FORWARD -i $EXTIF -o $INTIF -m conntrack —ctstate ESTABLISHED,RELATED -j ACCEPT

Nadajemy plikowi prawo do wykonania tego pliku:

sudo chmod a+x /etc/mojserwer/testf.sh

Teraz możemy już uruchomić przygotowany firewall:

sudo sh /etc/mojserwer/testf.sh

– i sprawdzić, czy hosty podpięte do interfejsu LAN mogą połączyć się z internetem.

Uwaga! Skrypt musi się wykonać bez żadnego błędu. Jeśli masz z tym problem sprawdź czy masz prawidłowe znaki końca linii (edytor vi -> znaki ^M trzeba pousuwać).

Powyższy firewall przepuszcza cały ruch. Bardziej przydatny skrypt poniżej (uwaga na podwójne minusy przy –ctstate, –log-level, –dport, –to-ports, –sport):

#!/bin/bash
echo -e "Reguły iptables...\n\n"
# Nazwa interfejsu LAN, adres sieci LAN i adres IP interfejsu LAN
INTIF="eth1"             
INTNET="192.168.100.0/24"
INTIP="192.168.100.1"
# Nazwa interfejsu WAN i jego adres IP
EXTIF="eth0"
EXTIP="`/sbin/ifconfig $EXTIF | grep 'inet addr' | awk '{print $2}' | sed -e 's/.*://'`"

UNIVERSE="0.0.0.0/0"

# Odkomentowana opcja w /etc/sysctl.conf, więc tu może być zakomentowane
#echo 1 > /proc/sys/net/ipv4/ip_forward

# Wyczyszczenie wszystkich łańcuchów i reguł, określenie domyślnej polityki odrzucania pakietów (DROP).
iptables -P INPUT DROP
iptables -F INPUT
iptables -P OUTPUT DROP
iptables -F OUTPUT
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -F -t nat
if [ "`iptables -L | grep drop-and-log-it`" ]; then
   iptables -F drop-and-log-it
fi
iptables -X
iptables -Z

# Utworzenie łańcucha drop-and-log-it.
iptables -N drop-and-log-it
iptables -A drop-and-log-it -j LOG --log-level info
iptables -A drop-and-log-it -j REJECT

# Reguły INPUT
# Wszystkie połączenia z localhost
 iptables -A INPUT -i lo -j ACCEPT
# Odrzucenie połączeń podszywających się pod lokalne
 iptables -A INPUT -i $EXTIF -s $INTNET -d $UNIVERSE -j drop-and-log-it
# Protokół ICMP
 iptables -A INPUT -i $INTIF -p icmp -s $INTNET -d $UNIVERSE -j ACCEPT
 iptables -A INPUT -i $EXTIF -p icmp -s $UNIVERSE -d $EXTIP -j ACCEPT
# Połączenia zwrotne do serwera maskarady na interfejsie LAN
 iptables -A INPUT -i $INTIF -s $INTNET -d $INTIP -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Komunikaty ICMP: ping i echo
 iptables -A INPUT -i $INTIF -p tcp -s $INTNET -d $UNIVERSE --dport 7 -j ACCEPT
 iptables -A INPUT -i $INTIF -p udp -s $INTNET -d $UNIVERSE --dport 7 -j ACCEPT
# Zapytania DNS
 iptables -A INPUT -i $INTIF -p tcp -s $INTNET -d $UNIVERSE --dport 53 -j ACCEPT
 iptables -A INPUT -i $INTIF -p udp -s $INTNET -d $UNIVERSE --dport 53 -j ACCEPT
# Zapytania DHCP
 iptables -A INPUT -i $INTIF -p udp --dport 67 -j ACCEPT
# Usługi Samby (jeżeli korzystamy, odkomentować)
# iptables -A INPUT -i $INTIF -p tcp -s $INTNET -d $UNIVERSE --dport 135 -j ACCEPT
# iptables -A INPUT -i $INTIF -p tcp -s $INTNET -d $UNIVERSE --dport 139 -j ACCEPT
# iptables -A INPUT -i $INTIF -p tcp -s $INTNET -d $UNIVERSE --dport 445 -j ACCEPT
# iptables -A INPUT -i $INTIF -p udp -s $INTNET -d $UNIVERSE --dport 137 -j ACCEPT
# iptables -A INPUT -i $INTIF -p udp -s $INTNET -d $UNIVERSE --dport 138 -j ACCEPT
# Protokół SSH
 iptables -A INPUT -i $INTIF -p tcp -s $INTNET -d $UNIVERSE --dport 22 -j ACCEPT

# Serwer proxy Squid na interfejsie LAN, port 3128
# iptables -A INPUT -i $INTIF -p tcp --dport 3128 -j ACCEPT

# Squid3 transparent bez Dansguardiana
# iptables -t nat -A PREROUTING -i $INTIF -p tcp --dport 80 -j REDIRECT --to-ports 3128

# Dansguardian + Squid3 transparent proxy
 iptables -A INPUT -i $INTIF -p tcp --dport 8080 -j ACCEPT
 iptables -t nat -A PREROUTING -i $INTIF -p tcp --dport 80 -j REDIRECT --to-ports 8080

# Połączenia przychodzące na interfejs WAN
# Połączenia zwrotne do serwera maskarady na interfejsie WAN
 iptables -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Komunikaty ICMP: ping i echo.
 iptables -A INPUT -i $EXTIF -p tcp -s $UNIVERSE -d $EXTIP --dport 7 -j ACCEPT
 iptables -A INPUT -i $EXTIF -p udp -s $UNIVERSE -d $EXTIP --dport 7 -j ACCEPT

# Odrzucanie i logowanie wszystkich innych połączeń przychodzących
 iptables -A INPUT -s $UNIVERSE -d $UNIVERSE -j drop-and-log-it

# Reguły OUTPUT
# Odrzucanie połączeń do sieci LAN z WAN
 iptables -A OUTPUT -o $EXTIF -s $UNIVERSE -d $INTNET -j drop-and-log-it
# Wszystkie połączenia localhost
 iptables -A OUTPUT -o lo -j ACCEPT
# Zezwolenie dla LAN
 iptables -A OUTPUT -o $INTIF -d $INTNET -j ACCEPT
# Zezwolenie na DHCP reply typu broadcast - dla MS Visty
  iptables -A OUTPUT -o $INTIF -p udp -s $INTIP --sport 67 -d $UNIVERSE --dport 68 -j ACCEPT
# Zezwolenie dla WAN
 iptables -A OUTPUT -o $EXTIF -j ACCEPT

# Odrzucanie i logowanie wszystkie innych połączeń wychodzących
 iptables -A OUTPUT -s $UNIVERSE -d $UNIVERSE -j drop-and-log-it

# FORWARD: Włączenie routowania, tj. usługi NAT, zwanej maskaradą, czyli IMPASQ.
# Routing na interfejsie WAN
 iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
# Routowanie ustanowionych połączeń
 iptables -A FORWARD -i $EXTIF -o $INTIF -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Odblokowanie poszczególnych usług
# Protokół ICMP
 iptables -A FORWARD -i $INTIF -p icmp -j ACCEPT
# Porty wysokie
 iptables -A FORWARD -i $INTIF -p tcp --dport 1024:65535 -j ACCEPT
 iptables -A FORWARD -i $INTIF -p udp --dport 1024:65535 -j ACCEPT
# Komunikaty ICMP: ping, echo
 iptables -A FORWARD -i $INTIF -p tcp --dport 7 -j ACCEPT
 iptables -A FORWARD -i $INTIF -p udp --dport 7 -j ACCEPT
# Usługa DNS
 iptables -A FORWARD -i $INTIF -p tcp --dport 53 -j ACCEPT
 iptables -A FORWARD -i $INTIF -p udp --dport 53 -j ACCEPT
# Protokół SSH
 iptables -A FORWARD -i $INTIF -p tcp --dport 22 -j ACCEPT
 iptables -A FORWARD -i $INTIF -p udp --dport 22 -j ACCEPT

# HTTP-FORWARD-OK
# HTTP -- jeżeli nie korzystamy ze squida i dansguardiana, trzeba odkomentować:
# iptables -A FORWARD -i $INTIF -p tcp --dport 80 -j ACCEPT
# iptables -A FORWARD -i $INTIF -p udp --dport 80 -j ACCEPT

# HTTPS
 iptables -A FORWARD -i $INTIF -p tcp --dport 443 -j ACCEPT
 iptables -A FORWARD -i $INTIF -p udp --dport 443 -j ACCEPT
# FTP
 iptables -A FORWARD -i $INTIF -p tcp --dport 20:21 -j ACCEPT
 iptables -A FORWARD -i $INTIF -p udp --dport 21 -j ACCEPT
# Poczta: smtp, pop3, imap, legacy secure SMTP, smtp Submission, imap ssl, pop3s
 iptables -A FORWARD -i $INTIF -p tcp --dport 25 -j ACCEPT
 iptables -A FORWARD -i $INTIF -p tcp --dport 110 -j ACCEPT
 iptables -A FORWARD -i $INTIF -p tcp --dport 143 -j ACCEPT
 iptables -A FORWARD -i $INTIF -p tcp --dport 465 -j ACCEPT
 iptables -A FORWARD -i $INTIF -p tcp --dport 587 -j ACCEPT
 iptables -A FORWARD -i $INTIF -p tcp --dport 993 -j ACCEPT
 iptables -A FORWARD -i $INTIF -p tcp --dport 995 -j ACCEPT

# Odrzucanie i logowanie wszystkich pozostałych połączeń.
 iptables -A FORWARD -j drop-and-log-it

echo -e "Zakończono!\n\n"

Uruchamianie firewall przy starcie systemu:  w pliku /etc/rc.local dopisujemy:

/etc/nazwa_folderu_z_plikiem_firewall/firewall.sh

(przed exit 0)


SQUID – SERWER PROXY

Komendy po kolei:

sudo apt-get install squid3

sudo mv /etc/squid/squid.conf /etc/squid/squid.conf.org
sudo touch /etc/squid/squid.conf

Edytujemy plik /etc/squid/squid.conf – wklejamy poniższe:

acl all src
acl manager proto cache_object
#acl localhost src 127.0.0.1/32 ::1
#acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl localnet src 192.168.100.0/24 #Opis sieci LAN
acl LAN src 192.168.100.0/24 #Opis sieci LAN
acl safeports port 21 70 80 210 280 443 488 563 591 631 777 873 901 81 3128 1025-65535
acl sslports port 443 563 81 873 2087 10000
acl purge method PURGE
acl connect method CONNECT

follow_x_forwarded_for allow localhost

http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !safeports
http_access deny CONNECT !sslports
http_access allow localhost
http_access allow localnet
http_access allow LAN
http_access deny all

icp_access allow localnet
icp_access deny all

# Normalny proxy
http_port 3128

# Rozmiar cache’u
cache_mem 256 MB # rozmiar dodatkowej(!) pamięci dla squida
maximum_object_size_in_memory 512 KB
memory_replacement_policy heap GDSF
cache_replacement_policy heap LFUDA
cache_dir aufs /srv/cache 8000 14 256
maximum_object_size 16 MB
cache_swap_low 93
cache_swap_high 97

# Logi
access_log /var/log/squid3/access.log
cache_log  /var/log/squid3/cache.log
cache_store_log none
logfile_rotate 5
log_icp_queries off

# TIMEOUTS
forward_timeout 240 second
connect_timeout 30 second
peer_connect_timeout 5 second
read_timeout 600 second
request_timeout 60 second
shutdown_lifetime 10 second

Następnie wykonujemy komendy (przygotowanie katalogu cache):

sudo mkdir /srv/cache
sudo chmod 777 /srv/cache         # uprawnienia do zapisu
sudo chown proxy:proxy /srv/cache # ustawienia właściciela i grupy

Inicjujemy squida (wyświetli ewentualne błędy w konfiguracji – jeśli czysto to jest OK)

sudo squid3 -z

Poprawiamy ewentualne błędy

Zarządzanie squidem:

sudo service squid start [restart/stop]

Dodajemy do firewall wpis otwierający port 3128 (na końcu pliku)

iptables -A INPUT -i $INTIF -p tcp –dport 3128 -j ACCEPT

Po restarcie powinniśmy połączyć się z internetem przez port 3128 (sprawdź koniecznie czy działa zmieniając ustawienia proxy w przeglądarce – IP LAN serwera i port 3128)


DANSGUARDIAN – FILTROWANIE ZABRONIONEJ TREŚCI

sudo apt-get install dansguardian

W pliku /etc/dansguardian/dansguardian.conf   zmieniamy:

language = 'polish’
filterip =192.168.100.1 #ip, na którym ma nasłuchiwać dansguardian czyli nasz LAN
# zakomentowujemy linię zaczynającą się:
#accessdeniedaddress = 'http://YOURSERVER.YOURDOMAIN…’
forwardedfor = on

W pliku /etc/dansguardian/dansguardianf1.conf

naughtynesslimit = 150 #ustawienie wrażliwości filtra – czym mniej tym większe restrykcje

W tym momencie filtr powinien działać przy ustawieniu przeglądarki na proxy 8080 – przetestuj koniecznie przed dalszymi krokami!

Żeby ruch przechodził automatycznie przez filtr bez konieczności ręcznej konfiguracji przeglądarki należy do firewalla dodać zapis:

iptables -A INPUT -i $INTIF -p tcp –dport 8080 -j ACCEPT
iptables -t nat -A PREROUTING -i $INTIF -p tcp –dport 80 -j REDIRECT –to-ports 8080

(na końcu pliku)

Pozostaje jedynie zablokować możliwość obejścia filtrowania blokując port 3128 poprzez zmianę ACCEPT na DROP w
pliku firewall

iptables -A INPUT -i $INTIF -p tcp –dport 3128 -j DROP #wcześniej było ACCEPT

Dostrojenia blokowanych treści dokonujemy w listach zawartych w katalogu /etc/dansguardian/lists. Już na początku warto zmienić ustawienia:

bannedextensionlist – odblokować (zakomentować) rozszerzenia występujące w plikach często pobieranych z sieci, np.: .exe, .js, .jse, .msi, .doc, .xls, .ppt, .gz, .tgz, .bz2, .zip, .rar, .mp3, .iso, .ogg, .wmf
bannedmimetypelist – odblokować (zakomentować) zawartość archiwów: application/gzip, #application/x-gzip, application/zip
bannedsitelist – tu dopisujemy strony, które chcemy w całości zablokować, np.: facebook.com
bannedurllist – strony, które chcemy zablokować częściowo, np.: members.home.net/uporn
exceptionfilesitelist – strony, z których można pobierać pliki, np. serwery obsługujące aktualizacje Windows: windowsupdate.microsoft.com, download.windowsupdate.com itp.
exceptioniplist – tu można dopisać adresy IP komputerów z sieci LAN, których nie należy filtrować, np. komputery z księgowości itp.
exceptionsitelist – strony, na które w całości zezwalamy, np.: update.microsoft.com, watson.microsoft.com, archive.ubuntu.com, ftp.pl.debian.org, archlinux.org
greysitelist – w listach „grey” wpisujemy strony, dla których wyłączamy filtrowanie URL, ale zachowujemy filtrowanie treści, czyli można je przeglądać pod warunkiem, że dany zasób nie zawiera czegoś niedozwolonych, np.: wp.pl, onet.pl, interia.pl, gazeta.pl

Uruchomienie usługi:

sudo service dansguardian start

Restart po zmianac:

sudo service dansguardian restart

Dostosowanie wyświetlanej strony blokady można wykonać w pliku:

/etc/dansguardian/languages/polish/template.html

(standardowy HTML + kilka dodatkowych funkcji opisanych w komentarzu do tego pliku, można wyświetlać obrazki z internetu)

Warto wyświetlić gdzieś na stronie blokady opcję -REASONLOGGED- która wyświetla szczegółowe informacje o powodach blokady, wraz z odnalezionymi wyrazami zabronionymi oraz ich wagami. Obserwacja tej zmiennej pomaga w lepszym dopasowaniu konfiguracji filtrowania do naszych potrzeb. Dansguardian jest doskonałym programem,ale należy pamiętać, że nie da się całkowicie zablokować niechcianej treści. Filtr obsługuje wyłącznie połączenia nieszyfrowane na porcie 80. W przypadku stron HTTPS filtr nie zadziała. To samo dotyczy szyfrowanych web proxy.

Related Posts

Back to Top