Re: DMZ issue - redirect works as expected but behaviour not desired

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



As I suspected I was doing myself in thinking that I could touch such a thing on just one interface.  I have two interfaces and will now do it the correct way.

Thank you very much for your making it very clear for me and for your assistance!

Nicholas
On 2011-02-20, at 12:24 AM, Pandu Poluan wrote:

> That won't work if the firewall, the webserver, and the client are all
> in the same subnet.
> 
> Let's assume:
> * Client is 192.168.40.22
> * Firewall is 192.168.40.10
> * Webserver is 192.168.40.15
> 
> Now client tries to access the faux-webserver:
> 
> From: 192.168.40.22
> To: 192.168.40.10
> 
> The packet gets DNATed
> 
> From: 192.168.40.22
> To: 192.168.40.15
> 
> See what happened? Because the source is the same subnet, the
> webserver replies directly to the client.
> 
> From: 192.168.40.15
> To: 192.168.40.22
> 
> The Linux firewall never sees the returning packet. And the client
> sees a 'strange' packet, as the client's opened connection is with .10
> not .15. This results in the client dropping the 'strange' packet.
> 
> Now, the usual scenario is like this:
> 
> Firewall Box has 2 interfaces:
> * WAN: 202.72.112.5 (default gateway to ISP's router)
> * DMZ: 192.168.40.1
> 
> Webserver: 192.168.40.8 (default gateway is 192.168.40.1)
> 
> Assume client is: 65.12.212.47
> 
> Client opens a connection to the firewall:
> 
> [1] From: 65.12.212.47
> To: 202.72.112.5
> 
> Firewall does a DNAT:
> 
> From: 65.12.212.47
> To: 192.168.40.8
> 
> Webserver handles the request, and replies:
> 
> From: 192.168.40.8
> To: 65.12.212.47
> 
> Since the destination is on a different subnet, the webserver hands
> the packet to the firewall, which performs an 'un-DNAT':
> 
> From: 202.72.112.5
> To: 65.12.212.47
> 
> The packet gets sent via the intertubes to the client, and the client
> sees that the packet *is* a reply to its connection (see [1]; the
> from: and to: addresses are properly swapped).
> 
> So, if you want to test, you'll need to configure your network so that:
> * 2 interfaces on the Linux box
> * the client and the webserver are *not* on the same subnet
> 
> Rgds,
> 
> 
> On 2011-02-20, Feasey, Nicholas <nfeasey@xxxxxxxxxxxxxxxxxxx> wrote:
>> On 2011-02-19, at 8:28 PM, Pandu Poluan wrote:
>> 
>>> (sorry for top posting; Gmail mobile client can only top-post)
>>> 
>>> I've been doing what (I think) you're planning to do, i.e., mapping an
>>> external IP:port into DMZ (which uses private addressing)
>>> 
>>> IMO, to do this, you really don't need more than 2 rules:
>>> -t nat -A PREROUTING -i $WAN_IFACE -d $WAN_IP -p tcp --dport 80 -j
>>> DNAT --to $WEBSERVER
>>> 
>>> -A FORWARD -d $WEBSERVER -j ACCEPT
>>> 
>>> With the above pair of rules, only the destination of incoming packets
>>> get changed; the webserver would still see the original source
>>> address. As long as the Linux firewall sees *both* incoming and
>>> outgoing traffic from the webserver, netfilter will automatically
>>> perform the inverse NAT.
>>> 
>>> Of course you would want some -t raw -A PREROUTING rules to prevent
>>> spoofing (esp. smurf attacks). But that's not strictly necessary for
>>> NAT-ing.
>>> 
>>> CMIIW.
>>> 
>>> Rgds,
>>> 
>>> 
>>> On 2011-02-20, Feasey, Nicholas <nfeasey@xxxxxxxxxxxxxxxxxxx> wrote:
>>>> Thank you for your response and explanation of the difference between
>>>> MASQUERADE and SNAT.
>>>> 
>>>> I really do not want to use MASQUERADE for exactly the reason that you
>>>> state.
>>>> 
>>>> My explanation is confusing because I was using the same ethernet port
>>>> just
>>>> for testing.
>>>> 
>>>> In the real world I'm trying to achieve a box that acts as a firewall and
>>>> depending on the service requested routes to an internal machine lying on
>>>> a
>>>> DMZ.
>>>> 
>>>> So,  I'd be using multiple ethernet ports as you would expect.
>>>> 
>>>> To be clear (I hope) users would enter http://somesite.somewhere.com and
>>>> it
>>>> would resolve to an IP address on the firewall box.
>>>> They hit the outside interface (port 80 or 443) and it would forward this
>>>> to
>>>> a machine on the DMZ.  That's all I'm trying to achieve here.
>>>> 
>>>> Is this just achieved via a series of FORWARD commands like any other?
>>>> 
>>>> 
>>>> On 2011-02-19, at 6:10 PM, Pascal Hambourg wrote:
>>>> 
>>>>> Hello,
>>>>> 
>>>>> Feasey, Nicholas a écrit :
>>>>>> I'm setting up a box that will be the only device on the Internet and
>>>>>> will forward requested services to other servers sitting on a DMZ.
>>>>>> 
>>>>>> As a test I started with redirecting a web server.
>>>>>> 
>>>>>> To test my arrangement I first merely set up a simple masquerade (just
>>>>>> on my internal network) in my iptables like so:
>>>>>> 
>>>>>> *nat
>>>>>> :PREROUTING ACCEPT [0:0]
>>>>>> :POSTROUTING ACCEPT [0:0]
>>>>>> -A PREROUTING -p tcp -i eth0 --dport 80 -j DNAT --to 192.168.40.15
>>>>>> -A POSTROUTING -j MASQUERADE
>>>>> 
>>>>> Be aware that using MASQUERADE on all interfaces may not do what you
>>>>> want. Usually, it is used only on the public internet side.
>>>>> 
>>>>>> *filter
>>>>>> ...normal filtering lines follow.
>>>>>> 
>>>>>> This POSTROUTING entry works as well:
>>>>>> 
>>>>>> -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.40.15
>>>>>> 
>>>>>> I think this is because the above line is doing the same as the
>>>>>> shortcut
>>>>>> MASQUERADE.
>>>>> 
>>>>> Not exactly. This rule replaces the source address of any connection
>>>>> going out eth0 with 192.168.40.15 whereas the above MASQUERADE rule
>>>>> replaces the source address of any connection going out any interface
>>>>> with the address of the interface.
>>>>> 
>>>>> By the way, it is weird that you use the address of a remote host (the
>>>>> server in the DMZ).
>>>>> 
>>>>>> When I check the httpd access_log it shows that the connection came
>>>>>> from
>>>>>> 192.168.40.15 as expected.  It works.
>>>>> 
>>>>> I'm puzzled. A connection cannot match both the DNAT and SNAT rules as
>>>>> they have the same input and output interface eth0. Even if it did (the
>>>>> connection goes out the interface it came in), this connection would end
>>>>> up having the same address as source and destination 192.168.40.15.
>>>>> --
>>>>> To unsubscribe from this list: send the line "unsubscribe netfilter" in
>>>>> the body of a message to majordomo@xxxxxxxxxxxxxxx
>>>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>>>> 
>> 
>> Thank you for your reply.
>> 
>> I just know that it's my inexperience that's getting me all messed up here.
>> I've tried your advise but it's just not happening for me.
>> Thought I'd post my test iptables configuration in the hopes that my issue
>> can be identified.  I've made the configuration basic so that nothing else
>> get's in my way.
>> 
>> Here goes...
>> 
>> So, assuming
>> $WAN_IFACE = eth0
>> $WAN_IP = 192.168.40.10
>> $WEBSERVER = 192.168.40.15
>> 
>> Based on your recommendation of...
>> 
>>> -t nat -A PREROUTING -i $WAN_IFACE -d $WAN_IP -p tcp --dport 80 -j
>>> DNAT --to $WEBSERVER
>>> 
>>> -A FORWARD -d $WEBSERVER -j ACCEPT
>> 
>> *nat
>> :PREROUTING ACCEPT [0:0]
>> -A PREROUTING -i eth0 -d 192.168.40.10 -p tcp --dport 80 -j DNAT --to
>> 192.168.40.15
>> COMMIT
>> *filter
>> :INPUT ACCEPT [0:0]
>> :FORWARD ACCEPT [0:0]
>> :OUTPUT ACCEPT [0:0]
>> -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
>> -A INPUT -p icmp -j ACCEPT
>> -A INPUT -i lo -j ACCEPT
>> -A INPUT -i eth0 -j ACCEPT
>> -A FORWARD -d 192.168.40.15 -j ACCEPT
>> COMMIT
>> 
>> I know they are on the same interface but again I assume this should work
>> for testing purposes even though this would never be done in a real
>> environment.
>> I've assumed that the -A FORWARD goes in the *filter table and not the *nat
>> table?  Second assumption is that I don't need any rules per say in the
>> $WEBSERVER
>> iptables file as you explained.
>> 
>> I beg your indulgence with my inexperience while I try to wrap my head
>> around this and I might have taken out too many lines (or two few) to get
>> this to go.
>> 
>> Bottom line is that with this in place I never get to the $WEBSERVER like
>> I"ve done with just my simple MASQUERADE test.
>> 
>> I'm obviously missing something here and I can't begin to tell you my
>> frustration in my ability to get what I believe should be relatively simple
>> to work.  :)
>> 
>> Nicholas
>> 
>> 
>> 
>> 
> 
> 
> -- 
> --
> Pandu E Poluan - IT Optimizer
> My website: http://pandu.poluan.info/
> 
> 

Attachment: smime.p7s
Description: S/MIME cryptographic signature


[Index of Archives]     [Linux Netfilter Development]     [Linux Kernel Networking Development]     [Netem]     [Berkeley Packet Filter]     [Linux Kernel Development]     [Advanced Routing & Traffice Control]     [Bugtraq]

  Powered by Linux