Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2009-11-09 12:54:12

  c3d - Użytkownik

c3d
Użytkownik
Zarejestrowany: 2008-12-02

Firewall na iptables - Prosze o kilka słów konstruktywnej krytyki :P

Witam :)
Parę dni temu sklepałem w skrypcie ogniomurka opartego o iptables, prosiłbym żeby ludzie mający większe pojęcie o tym ode mnie się wypowiedzieli. Chodzi tu głównie o ewentualne błędy co poprawić, co dopisać etc..
Oto kod :

Kod:

#!/bin/sh

IPT="/sbin/iptables"
LPX="IPT#"

 # Wewnętrzna sieć : A-P-D-Lan
INT_LAN_IP="192.168.0.1"
INT_LAN_NETMASK="255.255.255.0"
INT_LAN_NETWORK="192.168.0.0"
INT_LAN_BCAST="192.168.0.255"
INT_LAN_IFACE="eth0"

 # Wewnętrzna sieć : A-P-D-Pub_Lan
INT_PUBLAN_IP="192.168.1.1"
INT_PUBLAN_NETMASK="255.255.255.0"
INT_PUBLAN_NETWORK="192.168.1.0"
INT_PUBLAN_BCAST="192.168.1.255"
INT_PUBLAN_IFACE="eth1"

 # Zewnętrzna sieć :
EXT_LAN_IP="10.0.0.67"
EXT_LAN_NETMASK="255.255.255.0"
EXT_LAN_NETWORK="10.0.0.0"
EXT_LAN_BCAST="10.0.1.255"
EXT_LAN_IFACE="eth2"


/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack

  echo "1" > /proc/sys/net/ipv4/ip_forward
  echo "1" > /proc/sys/net/ipv4/tcp_syncookies
  echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route
  echo "1" > /proc/sys/net/ipv4/conf/all/secure_redirects
  echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
  echo "1" > /proc/sys/net/ipv4/conf/all/log_martians

if [ "$1" = "stop" ]
 then
    echo "Wyłączanie firewall'a w toku..."
     echo "Czyszczenie reguł łańcuchów w tabelach standardowych..."  
       # Czyszczenie reguł łańcuchów tabeli FILTER :
      $IPT -F 
       # Czyszczenie reguł łańcuchów tabeli NAT :
          $IPT -t nat -F
       # Czyszczenie reguł łańcuchów tabeli MANGLE :
          $IPT -t mangle -F
     echo "                                [OK!]" 
     echo "Zmiana domyślnej polityki łancuchów na ACCEPT..."  
       # Zmiana polityki łańcuchów tabeli FILTER na ACCEPT :
      $IPT -P INPUT ACCEPT
      $IPT -P FORWARD ACCEPT
      $IPT -P OUTPUT ACCEPT
       # Zmiana polityki łańcuchów tablei NAT na ACCEPT :
      $IPT -t nat -P PREROUTING ACCEPT
      $IPT -t nat -P OUTPUT ACCEPT
      $IPT -t nat -P POSTROUTING ACCEPT
       # Zmiana polityki łańcuchów tabeli MANGLE na ACCEPT :
      $IPT -t mangle -P PREROUTING ACCEPT
      $IPT -t mangle -P INPUT ACCEPT
      $IPT -t mangle -P FORWARD ACCEPT
      $IPT -t mangle -P OUTPUT ACCEPT
      $IPT -t mangle -P POSTROUTING ACCEPT
     echo "                                [OK!]"
    echo "Firewall został wyłączony..."
        exit 0
fi

 # Ustawianie domyślnej polityki w tabeli FILTER na DROP :
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP


# Reguły dla łańcucha INPUT w tabeli FILTER :
  # Reguły dla błędnych pakietów TCP :
 # Logowanie a następnie odrzucanie pakietów innych niż SYN :
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "$LPX : Error_TCP "
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
 # Logowanie a następnie odrzucanie pakietów TCP z flagami NONE,ALL,FIN,URG,PSH,RST,SYN,ACK :
$IPT -A INPUT -p tcp --tcp-flags ALL NONE -j LOG --log-prefix "$LPX : Error_TCP "
$IPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
$IPT -A INPUT -p tcp --tcp-flags ALL ALL -j LOG --log-prefix "$LPX : Error_TCP "
$IPT -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
$IPT -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j LOG --log-prefix "$LPX : Error_TCP "
$IPT -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$IPT -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG --log-prefix "$LPX : Error_TCP "
$IPT -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
$IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j LOG --log-prefix "$LPX : Error_TCP "
$IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOG --log-prefix "$LPX : Error_TCP "
$IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

  # Reguły dla błędnych pakietów :
 # Logowanie innych błędnych pakietów :
$IPT -A INPUT -p all -m state --state INVALID -j LOG --log-prefix "$LPX : error_packets " 
$IPT -A INPUT -p all -m state --state INVALID -j DROP

  # Reguły dla łańcucha pakietów ICMP :
 # Logowanie a następnie odrzucanie pofragmentowanych pakietów ICMP : 
$IPT -A INPUT --fragment -p icmp -j LOG --log-prefix "$LPX : Fragmenty_ICMP "
$IPT -A INPUT --fragment -p icmp -j DROP
 # Przepuszczanie pinga do serwera :
$IPT -A INPUT -p icmp -s 0/0 --icmp-type 8 -j LOG --log-prefix "$LPX : Pingi "
$IPT -A INPUT -p icmp -s 0/0 --icmp-type 8 -j ACCEPT
 # Przepuszczanie pakietów z przekroczonym terminem :
$IPT -A INPUT -p icmp -s 0/0 --icmp-type 11 -j ACCEPT
 # Przepuszczanie połączeń ICMP już nawiązanych :
$IPT -A INPUT -p icmp -j ACCEPT -m state --state ESTABLISHED,RELATED 

     # Reguły dla połączeń przychodzących na wskazanych portach TCP :
    # Akceptowane porty :
     # SSH :
      # Blokowanie danego IP po 2 Próbach logowania :
       $IPT -A INPUT -p tcp -s 0/0 --dport 22 -m state --state NEW -m recent --set
       $IPT -A INPUT -p tcp -s 0/0 --dport 22 -m state --state NEW -m recent --update --seconds 3600 --hitcount 6 -j REJECT  
   $IPT -A INPUT -p tcp -s 0/0 --dport 22 -m state --state NEW -j ACCEPT
     # Autoryzacja VMWARE :
   $IPT -A INPUT -p tcp -s 0/0 --dport 902 -m state --state NEW -j ACCEPT
     # Interfejs VMWARE :
   $IPT -A INPUT -p tcp -s 0/0 --dport 10001 -m state --state NEW -j ACCEPT
   $IPT -A INPUT -p udp -s 0/0 --dport 10001 -m state --state NEW -j ACCEPT

     # Reguły dla połączeń przychodzących na wskazanych portach UDP :
    # Odrzucenia wywołań net bios
   $IPT -A INPUT -p udp -s 0/0 --dport 137 -j DROP
   $IPT -A INPUT -p udp -s 0/0 --dport 138 -j DROP


     # Reguły dla usług dedykowanych danej sieci :
    # Akceptowanie połączenia z sieci A-P-D-Lan do serwera baz danych FIREBIRD :
     # TCP :
   $IPT -A INPUT -p tcp -s $INT_LAN_NETWORK/24 -i $INT_LAN_IFACE --dport 3050 -m state --state NEW -j ACCEPT
     # UDP :
   $IPT -A INPUT -p udp -s $INT_LAN_NETWORK/24 -i $INT_LAN_IFACE --dport 3050 -m state --state NEW -j ACCEPT

 # Akceptowanie ruchu przychodzącego na interfejsie lokalnym :
$IPT -A INPUT -p all -i lo -j ACCEPT
 # Wpuszczenie ruchu z sieci A-P-D-Lan do serwera i na broadcast :
$IPT -A INPUT -p all -i $INT_LAN_IFACE -s $INT_LAN_IP -j ACCEPT
$IPT -A INPUT -p all -i $INT_LAN_IFACE -d $INT_LAN_BCAST -j ACCEPT
 # Wpuszczenie ruchu z sieci A-P-D-Pub_Lan do serwera i na broadcast :
$IPT -A INPUT -p all -i $INT_PUBLAN_IFACE -s $INT_PUBLAN_IP -j ACCEPT
$IPT -A INPUT -p all -i $INT_PUBLAN_IFACE -s $INT_PUBLAN_BCAST -j ACCEPT
    # DHCP dla sieci A-P-D-Lan :
   $IPT -A INPUT -p udp -i $INT_LAN_IFACE --source-port 68 --destination-port 67 -j ACCEPT
    # DHCP dla sieci A-P-D-Pub_Lan :
   $IPT -A INPUT -p udp -i $INT_PUBLAN_IFACE --source-port 68 --destination-port 67 -j ACCEPT
 # Przepuszczanie ustanowionych połączeń :
  # Z sieci A-P-D-Lan :
$IPT -A INPUT -p all -s $INT_LAN_NETWORK/24 -i $INT_LAN_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
  # Z sieci A-P-D-Pub_Lan :
$IPT -A INPUT -p all -s $INT_PUBLAN_NETWORK/24 -i $INT_PUBLAN_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
  # Z sieci zewnętrznej :
$IPT -A INPUT -p all -i $EXT_LAN_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
 # Odrzucanie niepasujących pakietów adresowanych na broadcast :
$IPT -A INPUT -p all -d 255.255.255.255 -j DROP
 # Logowanie niepasujących pakietów :
$IPT -A INPUT -j LOG --log-prefix "$LPX : INPUT "

# Reguły dla łańcucha FORWARD w tabeli FILTER :
  # Reguły blokujące ruch przeznaczony dla sieci wewnętrznych :
   # Blokowanie portów TCP dla użytkowników sieci :
    # Przykład : $IPT -A FORWARD -p tcp --dport x -j REJECT --reject-witch tcp-reset
 
   # Blokowanie portów UDP dla użytkowników sieci :
    # Przykład : $IPT -A FORWARD -p udp --dport x -j REJECT --reject-with icmp-port-unreachable

   # Blokowanie stron WWW dla użytkowników sieci :
    # Przykład : $IPT -A FORWARD -p tcp -s SKĄD-SIEĆ -d BLOKOWANY_HOST --dport 80 -j REJECT --reject-witch tcp-reset

   # Blokowanie konkretnego hosta :
    # Przykład : $IPT -A FORWARD -s SKĄD-SIEĆ -d BLOKOWANY_HOST -j REJECT

   # Blokowanie konkretnej podsieci :
    # Przykład : $IPT -A FORWARD -s SKĄD-SIEĆ -d BLOKOWANY_HOST/32 -j REJECT

 # Wpuszczanie ruchu z sieci zewnętrznej do sieci A-P-D-Lan i A-P-D-Pub_Lan :
$IPT -A FORWARD -i $EXT_LAN_IFACE -d $INT_LAN_NETWORK/24 -o $INT_LAN_IFACE -j ACCEPT
$IPT -A FORWARD -i $EXT_LAN_IFACE -d $INT_PUBLAN_NETWORK/24 -o $INT_PUBLAN_IFACE -j ACCEPT
 # Wypuszczenie ruchu z sieci A-P-D-Lan i A-P-D-Pub_Lan do sieci zewnętrznej :
$IPT -A FORWARD -s $INT_LAN_NETWORK/24 -i $INT_LAN_IFACE -o $EXT_LAN_IFACE -j ACCEPT
$IPT -A FORWARD -s $INT_PUBLAN_NETWORK/24 -i $INT_PUBLAN_IFACE -o $EXT_LAN_IFACE -j ACCEPT
 # Wpuszczanie ruchu z sieci A-P-D-Lan do A-P-D-Pub_Lan :
$IPT -A FORWARD -s $INT_LAN_NETWORK/24 -i $INT_LAN_IFACE -d $INT_PUBLAN_NETWORK/24 -o $INT_PUBLAN_IFACE -j ACCEPT

 # Przekazywanie ruchu z sieci publicznej do wewnetrznej : tymczasowo dostępne
$IPT -A FORWARD -s 192.168.1.0/24 -i eth1 -d 192.168.0.0/24 -o eth0 -p all -j ACCEPT

 # Przekazywanie nawiązanych już połączeń :
  # Sieć A-P-D-Lan :
$IPT -A FORWARD -p all -s $INT_LAN_NETWORK/24 -i $INT_LAN_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
  # Sieć A-P-D-Pub_Lan :
$IPT -A FORWARD -p all -s $INT_PUBLAN_NETWORK/24 -i $INT_PUBLAN_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
  # Zewnętrzna sieć :
$IPT -A FORWARD -p all -s $EXT_LAN_NETWORK/24 -i $EXT_LAN_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
  # Logowanie niepasujących pakietów :
$IPT -A FORWARD -j LOG --log-prefix "$LPX : FORWARD "


# Reguły dla łańcucha OUTPUT w tabeli FILTER :
  # Reguły dla połączeń wychodzących z fizycznego servera :
 # Połączenia wychodzące TCP :
# Przykład : $IPT -A OUTPUT -p tcp -s 0/0 --destination-port x -j REJECT --reject-with tcp-reset
 
 # Połączenia wychodzące UDP :
# Przykład : $IPT -A OUTPUT -p udp -s 0/0 --destination-port x -j REJECT --reject-with icmp-port-unreachable


 # Odrzucanie nieprawidłowych pakietów icmp :
$IPT -A OUTPUT -m state -p icmp --state INVALID -j DROP
 # Akceptowanie ruchu wychodzącego na interfejsie lokalnym :
$IPT -A OUTPUT -p all -o lo -j ACCEPT
$IPT -A OUTPUT -p all -o eth0 -j ACCEPT

 # Akceptowanie niepasujących połączeń :
$IPT -A OUTPUT -p all -s 0/0 -j ACCEPT
 # Logowanie niepasujących pakietów : 
$IPT -A OUTPUT -j LOG --log-prefix "$LPX OUTPUT : "

  # Reguły dla łańcucha PREROUTING w tabeli NAT :
    # Przekierowanie ruchu na porcie 80 do servera LAMP z sieci zewnętrznej :
   $IPT -t nat -A PREROUTING -p tcp -i eth2 --dport 80 -j DNAT --to-destination 192.168.1.102:80

  # Reguły dla łańcucha POSTROUTING w tabeli NAT :
 # Maskowanie adresów z sieci A-P-D-Lan i A-P-D-Pub_Lan
$IPT -t nat -A POSTROUTING -o $EXT_LAN_IFACE -j SNAT --to $EXT_LAN_IP

Z góry dzięki :)
Pozdrawiam serdecznie.
c3d

Offline

 

#2  2009-11-09 18:12:10

  qlemik - Użytkownik

qlemik
Użytkownik
Zarejestrowany: 2007-11-27

Re: Firewall na iptables - Prosze o kilka słów konstruktywnej krytyki :P

Ja polece Ci tylko:

Kod:

Arno's IPTABLES Firewall

Dostępne w repozytoriach.

Ja wyciagnałem z tego reguły iptables i na tej podstawie napisalem własnego firewall.

Offline

 

#3  2009-11-10 00:00:01

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: Firewall na iptables - Prosze o kilka słów konstruktywnej krytyki :P

Ja radziłbym następujące zmiany:
Dla usług dostepnych z internetu - lub od userów - którym nie można całkowicie ufać (mam na myśli trojany w Win$ komputerach)  ustawić limit nowych/równoczesnych połączeń - odpowiednie dla faktycznej wytrzymałości demonów - obsługujących daną usługę.

Ponadto - limitowanie przepustowości dla poszczególnych usług serwera - tak - aby jeden user nie mógł 'zajechać' serwera ilością wysyłanych/pobieranych danych - która to ilość mogłaby uszkodzić lub zakłocić działanie demona odp. za usługę.

Coś takiego można osiągnąć czasami w samym demonie - np. moduły evasive i security w Apachu, ale jeśli można coś załatwić na etapie firewall - to lepiej niech tą robotę zostawić na firewallu - jest znacznie odporniejszy od np. Postfixa  czy Nginxa.
I znacznie żadziej zdarzają się luki w modułach kernela odpowiedzialnych za firewall - niż w aplikacjach.

Bardzo fajne efekty możesz osiągnąć stosując połączenie iptables + ifb/imq +htb/cbq/...itp.  - czyli dla każdego usera ustawić w dostępie do demona pasmo maksymalne - od i do usługi.

Trochę roboty - ale wielu kłopotów można uniknąć.

I jeszcze jedno - postaraj się o przejrzysty zestaw reguł w łańcuchach - żebyś na pierwszy rzut oka wiedział - co jest grane - bo to co dałeś u góry zbyt czytelne już nie jest, natomiast jak jeszcze urośnie - może sprawić trochę kłopotu.

Sugestia - w głównych łańcuchach tworzysz reguły wspólne dla całego systemu, natomiast te - które dotyczą poszczególnych usług - czy chociażby forwardu - wrzuć do osobnych łańcuchów - żeby firewall nie porównywał każdego pakietu z regułą - która i tak nie będzie go dotyczyć z racji innego przeznaczenia tej reguły/pakietu.

Pozdrawiam

I jeszcze jedna rada - na zewnątrz firewalla nessus-daemon, openvas-daemon i nmap, z drugiej strony snort, openvas-client, nessus-client i (psad+fwsnort) + godzina/dwie - na testy - i masz całkiem niezły obraz sytuacji.

Pozdr.

Ostatnio edytowany przez Jacekalex (2009-12-08 15:31:50)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)

[ Generated in 0.009 seconds, 12 queries executed ]

Informacje debugowania

Time (s) Query
0.00009 SET CHARSET latin2
0.00004 SET NAMES latin2
0.00123 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.14.249.104' WHERE u.id=1
0.00071 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.14.249.104', 1732796553)
0.00041 SELECT * FROM punbb_online WHERE logged<1732796253
0.00061 DELETE FROM punbb_online WHERE ident='3.142.133.210'
0.00046 SELECT topic_id FROM punbb_posts WHERE id=132777
0.00106 SELECT id FROM punbb_posts WHERE topic_id=15429 ORDER BY posted
0.00056 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=15429 AND t.moved_to IS NULL
0.00007 SELECT search_for, replace_with FROM punbb_censoring
0.00136 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=15429 ORDER BY p.id LIMIT 0,25
0.00079 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=15429
Total query time: 0.00739 s