Iptables - brak internetu na komputerach w sieci

Konfiguracja serwerów, usług, itp.
nox
Posty: 25
Rejestracja: 01 marca 2008, 11:46
Lokalizacja: Lublin

Iptables - brak internetu na komputerach w sieci

Post autor: nox »

Próbuję pisać samemu firewall, na zasadzie - blokuje wszystko, wpuszczam tylko konkretne usługi. Problem jest taki, że przy tej konfiguracji (Domyślna polityka łańcuchów na DROP):

Kod: Zaznacz cały

#######         NET FORWARD     #######
echo "1" > /proc/sys/net/ipv4/ip_forward                        # KERNEL NET FORWARD

#######         SECURITY        #######
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts       # ICMP ECHO REQUEST @ BROADCAST ignore
echo "1" > /proc/sys/net/ipv4/tcp_syncookies                    # SYN FLOOD refuse
echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route      # SOURCE ROUTED PACKETS refuse
echo "1" > /proc/sys/net/ipv4/conf/all/secure_redirects
echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter                # SOURCE VALIDATION by REVERSED PATH

#######  RULES CHAINS FLUSHING  #######
iptables -F                                                     # STANDARD CHAINS
iptables -t nat -F
iptables -t mangle -F

#######  RULES CHAINS GENERATE  #######
iptables -P INPUT DROP                                                # STANDARD CHAINS POLICY
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

######## ESTABLISHED CONNECTIONS KEEP #######
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

#######  ALLOWING PROTCOLS      #######
#---------- WWW ----------#
iptables -A INPUT -p tcp --sport 80 -j ACCEPT                   # HTTP:80
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp --sport 80 -j ACCEPT
iptables -A INPUT -p tcp --sport 443 -j ACCEPT                  # HTTPS:443
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
#---------- SSH ----------#
iptables -A INPUT -p tcp -i eth0 --dport 22 -j DROP             # WAN SSH
iptables -A INPUT -p tcp -i eth1 --dport 22 -j ACCEPT           # LAN SSH
#---------- DNS ----------#
iptables -A INPUT -p udp --sport 53 -j ACCEPT                   # DNS ALLOW
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -p udp --sport 53 -j ACCEPT
iptables -A FORWARD -p udp --dport 53 -j ACCEPT
#------ LO Interface -----#
iptables -A INPUT -i lo -j ACCEPT                               # LO ALLOW
iptables -A OUTPUT -o lo -j ACCEPT

#######     NETWORK ROUTING     #######
iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -j MASQUERADE                  # LAN MASQUARADE
iptables -A FORWARD -s 192.168.3.0/24 -j ACCEPT
nie działają strony WWW na komputerach w sieci wewnętrznej.

Kod: Zaznacz cały

nox-debian:~# iptables -L -v
Chain INPUT (policy DROP 33 packets, 2931 bytes)
 pkts bytes target     prot opt in     out     source               destination
  119 25566 ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp spt:www
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp spt:https
    0     0 DROP       tcp  --  eth0   any     anywhere             anywhere            tcp dpt:ssh
    0     0 ACCEPT     tcp  --  eth1   any     anywhere             anywhere            tcp dpt:ssh
    1    61 ACCEPT     udp  --  any    any     anywhere             anywhere            udp spt:domain
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
   15  3138 ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
    1    52 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:www
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp spt:www
    0     0 ACCEPT     udp  --  any    any     anywhere             anywhere            udp spt:domain
    0     0 ACCEPT     udp  --  any    any     anywhere             anywhere            udp dpt:domain
    0     0 ACCEPT     all  --  any    any     localnet/24          anywhere

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
  126 25733 ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
    2   120 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:www
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:https
    3   194 ACCEPT     udp  --  any    any     anywhere             anywhere            udp dpt:domain
    0     0 ACCEPT     all  --  any    lo      anywhere             anywhere
Nie bardzo mogę jakoś dojść przyczyny błędu. Prosiłbym o pomoc.

Kod: Zaznacz cały

#---------- WWW ----------#
iptables -A INPUT -p tcp --sport 80 -j ACCEPT                   # HTTP:80
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp --sport 80 -j ACCEPT
iptables -A INPUT -p tcp --sport 443 -j ACCEPT                  # HTTPS:443
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
Czy FORWARD jest tutaj potrzebne? Czy nie?
Awatar użytkownika
bbmti
Posty: 39
Rejestracja: 17 lipca 2007, 11:03
Lokalizacja: Kraków

Post autor: bbmti »

No jak chcesz udostępniać internet innym komputerom w sieci to musisz mieć łańcuch FORWARD. Dodaj jeszcze coś takiego dla protokołu UDP

Kod: Zaznacz cały

iptables -A FORWARD -p udp --dport 80 -j ACCEPT
Możesz jeszcze bardziej sprecyzować podając

Kod: Zaznacz cały

-i ethX
gdzie X to interfejs LAN

Dodałbym jeszcze moduły jeżeli nie są załadowane:

Kod: Zaznacz cały

modprobe ip_conntrack
modprobe ip_nat
Awatar użytkownika
michnik
Beginner
Posty: 162
Rejestracja: 20 lipca 2009, 12:54
Lokalizacja: Kraków

Post autor: michnik »

Aby skrypt miał funkcje start | stop opakuj swoje definicje w coś takiego:

Kod: Zaznacz cały

#! /bin/sh

IPTABLES=/usr/local/sbin/iptables
test -x $IPTABLES || exit 1

case $1 in
start | restart | force-reload)

       $IPTABLES -F -t nat
       $IPTABLES -X -t nat
       $IPTABLES -P INPUT DROP
       $IPTABLES -F INPUT 
       $IPTABLES -P FORWARD DROP
       $IPTABLES -F FORWARD

####
#### tu dajesz wpisy iptables
####

        echo " koniec."
        echo 1 >/proc/sys/net/ipv4/ip_forward
        ;;
stop)
        echo 1 >/proc/sys/net/ipv4/ip_forward
        echo -en "Usuwam zasady firewall'a ..."
        $IPTABLES -F -t nat
        $IPTABLES -X -t nat
        $IPTABLES -P INPUT ACCEPT

        echo " koniec."
        ;;
esac

Nasŧepnie mozesz to uruchamiać z poziomu /etc/init.d jako szeregowy deamon.
Cyphermen
Beginner
Posty: 426
Rejestracja: 24 maja 2009, 10:56
Lokalizacja: cze-wa

Post autor: Cyphermen »

Ja to najpierw zacząłbym od włączenia polityki ,,output'' na ,,accept''.
nox
Posty: 25
Rejestracja: 01 marca 2008, 11:46
Lokalizacja: Lublin

Post autor: nox »

wedle sugestii nie zmieniło to nic:

Kod: Zaznacz cały

nox-debian:~# iptables -L -v
Chain INPUT (policy DROP 60 packets, 4206 bytes)
 pkts bytes target     prot opt in     out     source               destination
  308 22356 ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:www
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:https
    0     0 DROP       tcp  --  eth0   any     anywhere             anywhere            tcp dpt:ssh
    0     0 ACCEPT     tcp  --  eth1   any     anywhere             anywhere            tcp dpt:ssh
    0     0 ACCEPT     udp  --  any    any     anywhere             anywhere            udp spt:domain
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
   14   732 ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
    0     0 ACCEPT     udp  --  any    any     anywhere             anywhere            udp dpt:www
    0     0 ACCEPT     udp  --  any    any     anywhere             anywhere            udp spt:domain
    0     0 ACCEPT     udp  --  any    any     anywhere             anywhere            udp dpt:domain
    0     0 ACCEPT     all  --  any    any     localnet/24          anywhere

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
  466  198K ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
    0     0 ACCEPT     udp  --  any    any     anywhere             anywhere            udp dpt:www
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:www
    0     0 ACCEPT     udp  --  any    any     anywhere             anywhere            udp dpt:domain
    0     0 ACCEPT     all  --  any    lo      anywhere             anywhere
a włączenie OUTPUT na ACCEPT nie jest tym, co chce, bo wedle poradników, wszystko trzeba DROP i wpuszczać po kolei.
Awatar użytkownika
bbmti
Posty: 39
Rejestracja: 17 lipca 2007, 11:03
Lokalizacja: Kraków

Post autor: bbmti »

£ańcuch OUTPUT służy do przepuszczania/dropowania ruch wychodzącego z serwera. Patrząc na Twoją konfigurację firewalla nie masz logowania więc nawet nie wiesz czy jakaś usługa działająca lokalnie może działać prawidłowo a jeżeli tylko Ty korzystasz z tego serwera to polityka OUTPUT na ACCEPT jest dobrym pomysłem.

Jeżeli chodzi i łańcuch FORWARD to do przepuszczenia ruchu w obie strony dla danego hosta dodałbym

Kod: Zaznacz cały

iptables -A FORWARD -s 192.168.3.0/24 -d 0/0 -j ACCEPT
iptables -A FORWARD -s 0/0 -d 192.168.3.0/24 -j ACCEPT
W ten sposób przepuszczasz cała podsieć, jak to nie skótkuje to można określić doładnie dla każedego adresu:

Kod: Zaznacz cały

iptables -A FORWARD -s 192.168.3.X -d 0/0 -j ACCEPT
iptables -A FORWARD -s 0/0 -d 192.168.3.X -j ACCEPT
Wprowadź wszystkie sugerowane zmiany, przeładuj skrypt, przeprowadź testy i wklej wyniki.
nox
Posty: 25
Rejestracja: 01 marca 2008, 11:46
Lokalizacja: Lublin

Post autor: nox »

Zrobiłem to o czym mówiłeś, jednak żadna wersja nie pomogła. Próbowałem z ustawieniem:

Kod: Zaznacz cały

iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT -m state --state NEW
wtedy działa, ale działa każdy protokół a nie tylko WWW, co chcę osiągnąć.
Awatar użytkownika
grzesiek
Junior Member
Posty: 932
Rejestracja: 06 stycznia 2008, 10:41
Lokalizacja: Białystok

Post autor: grzesiek »

nox - Panie, może najpierw przydałoby się dowiedzieć jak działa protokół http? Przepuszczasz połączenia na port docelowy 80 i 8080 do WAN. Z LAN (źródłowy) na portach 1024-65535.
nox
Posty: 25
Rejestracja: 01 marca 2008, 11:46
Lokalizacja: Lublin

Post autor: nox »

Witam. Przebudowałem firewall i teraz może będzie łatwiej dojść do tego,, jak blokować konkretne usługi w sieci.

Kod: Zaznacz cały

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

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

#-------------------------------#
#       CZYSZCZENIE RELUL       #
#-------------------------------#
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -F -t nat

#-------------------------------#
#       LO ACCEPT               #
#-------------------------------#
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A FORWARD -o lo -j ACCEPT

#-------------------------------#
#       POLACZENIA NAWIAZANE    #
#-------------------------------#
iptables -A INPUT -p all -j ACCEPT -m state --state ESTABLISHED,RELATED

#-------------------------------#
#       ICPM                    #
#-------------------------------#
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with icmp-port-unreachable
iptables -A INPUT -p tcp --dport 1080 -j REJECT --reject-with icmp-port-unreachable

#-------------------------------#
#       LAN TRUST               #
#-------------------------------#
iptables -A INPUT -i eth1 -p all -j ACCEPT -m state --state NEW

#-------------------------------#
#       LOGOWANIE               #
#-------------------------------#
iptables -A INPUT -i eth0 -j LOG
iptables -A FORWARD -j LOG      # RUCH PRZEKAZYWANY

#-------------------------------#
#       ETH 0 - WAN             #
#-------------------------------#
iptables -A OUTPUT -p udp -o eth0 --dport 53 --sport 1024:65535 -j ACCEPT       # DNS
iptables -A INPUT -p udp -i eth0 --sport 53 --dport 1024:65535  -j ACCEPT
iptables -A INPUT -p tcp -i eth0 --dport 22 --sport 1024:65535 -j REJECT --reject-with icmp-port-unreachable    # WAN SSH

#-------------------------------#
#       ETH 1 - LAN             #
#-------------------------------#
iptables -A FORWARD -i eth0 -o eth1 -p all -m state --state ESTABLISHED,RELATED -j ACCEPT       # TYLKO POLACZENIA NAWIAZANE
iptables -A FORWARD -i eth1 -o eth0 -p all -j ACCEPT

iptables -A FORWARD -j DROP     # RUCH PRZEKAZYWANY

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.3.0/24 -j SNAT --to 87.204.232.82             # SNAT
Wystarczy mi prosty jedne przykład na zasadzie blokowania jednej usługi - na przykład zablokowanie w sieci LAN dostępu do HTTPS(443)
ODPOWIEDZ