Linux Netfilter discussions
 help / color / mirror / Atom feed
From: william fitzgerald <wfitzgerald@tssg.org>
To: Mail List - Netfilter <netfilter@vger.kernel.org>
Subject: Re: Query: iptables Conflict Policy Avoidance/Reduction
Date: Thu, 04 Jun 2009 17:11:27 +0100	[thread overview]
Message-ID: <4A27F22F.4060700@tssg.org> (raw)
In-Reply-To: <e500aebdd5e68dedc2ece940c037d24e@mail.intra.whb.hu>

Thanks G치sp치r (aka Swifty),

I was having one of those moments where you think, you think, you did'nt grasp 
something! Like, did I book those flights on the correct days syndrome, so you 
start doubting yourself ;-)


G치sp치r Lajos wrote:
> Hi Will.!
> 
> On Wed, 03 Jun 2009 19:48:06 +0100, william fitzgerald
> <wfitzgerald@tssg.org> wrote:
>> Dear all,
>  
>> Rule 1: iptables -A FORWARD -i eth+ -s 0/0 -d 192.168.1.2 --dport 80 -j
>> ACCEPT
>> Rule 2: iptables -A FORWARD -i eth+ -s 192.168.1.0/24 -d 192.168.1.2
>> --dport 80 -j 
>> ACCEPT
>>
>> In the above scenario, Rule 2 is REDUNDANT to Rule 1 in that, the source
> IP
>> of 
>> Rule 2 is covered by the source IP of Rule 1.
> 
> Without any NAT-ing the firewall would never see such packets... (Sending
> packets to the same subnet should not be routed.)
> 

Agreed. I always make the assumption that NAT-rules are independent of 
filter-rules and that that NAT up and running. Sorry, I should of made that 
clearer in my original post.

>> However, aren't these generic style rules not considered *best practice*
>> given 
>> that the above rules when applied to all interfaces could allow IP
> Spoofing
>> of 
>> reserved IP address range 192.168.1.0/24
> 
> IP Spoofing should be done by specifying ALLOWED LOCAL IP ranges (and drop
> everything else) and specifying DISALLOWED REMOTE (private) IP ranges (and
> accept everything else).
> 

In the below examples you gave, I was trying to think of a quick way to avoid 
these whereby you implicitly deny these kind of rules with the "default policy".

But I see how allowing all IP addresses (0/0) to a web server for example is also 
inclusive of RFC1918, RFC 3330 and NIST-800-41 best practice private-resevered IP 
address countermeasures. And so the need to be implemented on the external 
interface. It was one of those days where I was suffering from brain paralysis ;-)

> For example in RAW chain PREROUTING table:
> 
>     $table -P $chain DROP
> 
>     create_subchain PRE_PPP0
>     $table -A $chain -j $subchain -i $PPP0_IF -d $PPP0_IP
> 
>      $table -A $subchain -j DROP -s 10.0.0.0/8 -m comment --comment
> 'PRIVATE USE'                       #RFC1918
>      $table -A $subchain -j DROP -s 14.0.0.0/8 -m comment --comment 'PUBLIC
> DATA NETWORKS'              #RFC1700, page 181
>      $table -A $subchain -j DROP -s 24.0.0.0/8 -m comment --comment 'CABLE
> TELEVISION NETWORKS'         #NOT SURE!!!
>      $table -A $subchain -j DROP -s 39.0.0.0/8 -m comment --comment
> 'RESERVED'                          #RFC1797
>      $table -A $subchain -j DROP -s 127.0.0.0/8 -m comment --comment
> 'LOOPBACK'                         #RFC1700, page 5
>      $table -A $subchain -j DROP -s 128.0.0.0/16 -m comment --comment
> 'RESERVED'
>      $table -A $subchain -j DROP -s 169.254.0.0/16 -m comment --comment
> 'LINK LOCAL'
>      $table -A $subchain -j DROP -s 172.16.0.0/12 -m comment --comment
> 'PRIVATE USE'                    #RFC1918
>      $table -A $subchain -j DROP -s 191.255.0.0/16 -m comment --comment
> 'RESERVED'
>      $table -A $subchain -j DROP -s 192.0.0.0/24 -m comment --comment
> 'RESERVED'
>      $table -A $subchain -j DROP -s 192.0.2.0/24 -m comment --comment
> 'RESERVED'
>      $table -A $subchain -j DROP -s 192.88.99.0/24 -m comment --comment
> '6to4 RELAY ANYCAST'            #RFC3068
>      $table -A $subchain -j DROP -s 192.168.0.0/16 -m comment --comment
> 'PRIVATE USE'                   #RFC1918
>      $table -A $subchain -j DROP -s 198.18.0.0/15 -m comment --comment
> 'NETWORK INTERCONNECT'           #RFC2544
>      $table -A $subchain -j DROP -s 223.255.255.0/24 -m comment --comment
> 'RESERVED'
>      $table -A $subchain -j DROP -s 224.0.0.0/4 -m comment --comment
> 'MULTICAST'                        #RFC3171
>      $table -A $subchain -j DROP -s 240.0.0.0/4 -m comment --comment
> 'RESERVED'                         #RFC1700, page 4
> 
> ...
> 
>      $table -A $subchain -j ACCEPT
> 
> 
>     $table -A $chain -j ACCEPT -i $LAN_IF -s $LAN_NW
> 
> 
> 
>> So in order to avoid spoofing, one has to create the following two rules
>> and apply 
>> them to specific interfaces.
>> iptables -A FORWARD -i eth1 -s 0/0 -d 192.168.1.2 --dport 80 -j ACCEPT
>> iptables -A FORWARD -i eth0 -s 192.168.1.0/24 -d 192.168.1.2 --dport 80
> -j
>> ACCEPT
>>
>>
>> Simple Shadowed example:
>>
>> Internet ---> (eth1)Firewall ---> Web Server
>> Partner ---> (eth1) Firewall ---> VPN Server
>>
>> Default Policy: iptables -P FORWARD DROP
>> Rule 1: iptables -A FORWARD -i eth1 -s 0/0 -d webIP --dport 80 -j ACCEPT
>> Rule 2: iptables -A FORWARD -i eth1 -s 0/0 -d vpnIP --dport 22 -j DROP
>> Rule 3: iptables -A FORWARD -i eth1 -s partnerIP -d vpnIP --dport 22 -j
>> ACCEPT
>>
>> Rule 2 blocks the intended partners access via Rule 3. A simple swap of
>> rule 2 and 
>> rule 3 prevents this. But why bother with Rule 2 in the first place,
> given
>> the 
>> default policy is DROP and so there is no way for anyone else other than
>> the 
>> partners to get access (Rule 3). Looking at various example policies on
> the
>> web, I 
>> find that there are explicitly defined DROP rules in conjunction with
>> ACCEPT rules 
>> like rules 2 and 3 above. Its as if, one does not trust the default
> policy.
> 
> Not just the "no trust" scenario. If you want to speed up the
> firewalling/lower the response ratio then maybe it is usefull to drop some
> packets as soon as possible. 
> 
> In my firewall policies I try to find asap the "usefull" rule for the
> packet/connection.
> For example:
> 
>> I am just wondering, if all rules are applied to specific Interfaces,
>> specific 
>> destination IP address, specific destination ports  and some trust in the
>> default 
>> policy would a lot of the possible policy conflicts be ruled out?
>>
>> If anyone could provide me with some scenarios/examples to the contrary
>> that would 
>> be great.
>>
>> It would even be better if I could get a hold of some real firewall
>> policies 
>> (anonymised internal IP ranges of course).
> 
> The same rules from above:
> 
Perfect.

> 
> Chain PREROUTING (policy DROP 1 packets, 76 bytes)
>  pkts bytes target     prot opt in     out     source              
> destination         
> 1240K  495M ACCEPT     all  --  lo     *       0.0.0.0/0           
> 0.0.0.0/0           
>   692 19424 PRE_ETH0   all  --  eth0   *       192.168.255.0/24    
> 0.0.0.0/0           
> 6996K 6377M PRE_PPP0   all  --  ppp0   *       0.0.0.0/0           
> EXTERNAL_IP       
> 1669K  514M PRE_MFL1   all  --  mfl1   *       172.31.255.248/29   
> 0.0.0.0/0           
> 6697K 2227M PRE_BR1    all  --  br1    *       0.0.0.0/0           
> 0.0.0.0/0           
>  412K  121M PRE_BR2    all  --  br2    *       0.0.0.0/0           
> 0.0.0.0/0           
> 1667K  385M ACCEPT     all  --  vpn1   *       192.168.10.0/24     
> 0.0.0.0/0           
>    25 15605 ACCEPT     all  --  vpn2   *       192.168.253.0/24    
> 0.0.0.0/0           
> 1219K   82M ACCEPT     all  --  vpn-ftp *       172.31.255.1        
> 0.0.0.0/0           
>    35  1960 PRE_BRS    all  --  brs    *       0.0.0.0/0           
> 0.0.0.0/0           
>     1    76 LOG        all  --  *      *       0.0.0.0/0           
> 0.0.0.0/0           LOG flags 0 level 7 prefix `IPT: RAW PRE ' 
> 
> Chain PRE_PPP0 (1 references)
>  pkts bytes target     prot opt in     out     source              
> destination         
>    56  3136 DROP       all  --  *      *       10.0.0.0/8          
> 0.0.0.0/0           /* PRIVATE USE */ 
>     0     0 DROP       all  --  *      *       14.0.0.0/8          
> 0.0.0.0/0           /* PUBLIC DATA NETWORKS */ 
>     0     0 DROP       all  --  *      *       24.0.0.0/8          
> 0.0.0.0/0           /* CABLE TELEVISION NETWORKS */ 
>     0     0 DROP       all  --  *      *       39.0.0.0/8          
> 0.0.0.0/0           /* RESERVED */ 
>     0     0 DROP       all  --  *      *       127.0.0.0/8         
> 0.0.0.0/0           /* LOOPBACK */ 
>     0     0 DROP       all  --  *      *       128.0.0.0/16        
> 0.0.0.0/0           /* RESERVED */ 
>     0     0 DROP       all  --  *      *       169.254.0.0/16      
> 0.0.0.0/0           /* LINK LOCAL */ 
>     0     0 DROP       all  --  *      *       172.16.0.0/12       
> 0.0.0.0/0           /* PRIVATE USE */ 
>     0     0 DROP       all  --  *      *       191.255.0.0/16      
> 0.0.0.0/0           /* RESERVED */ 
>     0     0 DROP       all  --  *      *       192.0.0.0/24        
> 0.0.0.0/0           /* RESERVED */ 
>     0     0 DROP       all  --  *      *       192.0.2.0/24        
> 0.0.0.0/0           /* RESERVED */ 
>     0     0 DROP       all  --  *      *       192.88.99.0/24      
> 0.0.0.0/0           /* 6to4 RELAY ANYCAST */ 
>     1   154 DROP       all  --  *      *       192.168.0.0/16      
> 0.0.0.0/0           /* PRIVATE USE */ 
>     0     0 DROP       all  --  *      *       198.18.0.0/15       
> 0.0.0.0/0           /* NETWORK INTERCONNECT */ 
>     0     0 DROP       all  --  *      *       223.255.255.0/24    
> 0.0.0.0/0           /* RESERVED */ 
>     0     0 DROP       all  --  *      *       224.0.0.0/4         
> 0.0.0.0/0           /* MULTICAST */ 
>     0     0 DROP       all  --  *      *       240.0.0.0/4         
> 0.0.0.0/0           /* RESERVED */ 
> 
> ...
> 
> 6996K 6377M ACCEPT     all  --  *      *       0.0.0.0/0           
> 0.0.0.0/0           
> 
> 
>> It appears to me at least, that creating rules to be more specific than
>> generic, 
>> while it increases the number rules, is probably a better solution more
>> likely to 
>> be free of conflicts.
> 
> YES! For example if you have to connect a new subnet/network. With generic
> rules you may have some unwanted side-effects... :D

Agreed ;-)

Two other previous posts I sent yesterday also suffer from the same short-term 
memory delusion ;-)

Thanks for everything,
Will.

> 
>> Again all feedback is welcome. Perhaps reality is not as black and white!
>>
>> regards,
>> Will.
> 
> Swifty
> --
> To unsubscribe from this list: send the line "unsubscribe netfilter" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

-- 
________________________________________
William M. Fitzgerald (MSc, BSc)
PhD Student,
Cork Constraint Computation Centre,
Computer Science Dept.,
University College Cork,
Cork,
Ireland.
----------------------------------------
www.williamfitzgerald.net
www.williamfitzgerald.info
www.linkedin.com/in/williamfitzgerald
http://4c.ucc.ie/web/people.jsp?id=143
www.tssg.org/people/wfitzgerald/
________________________________________

      reply	other threads:[~2009-06-04 16:11 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-03 18:48 Query: iptables Conflict Policy Avoidance/Reduction william fitzgerald
2009-06-04 12:13 ` Gáspár Lajos
2009-06-04 16:11   ` william fitzgerald [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4A27F22F.4060700@tssg.org \
    --to=wfitzgerald@tssg.org \
    --cc=netfilter@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox