Strona 1 z 1

Iptables - brak internetu na komputerach w sieci

: 15 września 2009, 17:53
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?

: 17 września 2009, 10:21
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

: 17 września 2009, 13:01
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.

: 18 września 2009, 20:27
autor: Cyphermen
Ja to najpierw zacząłbym od włączenia polityki ,,output'' na ,,accept''.

: 20 września 2009, 08:40
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.

: 20 września 2009, 16:49
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.

: 21 września 2009, 07:24
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ąć.

: 21 września 2009, 19:24
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.

: 25 września 2009, 16:45
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)