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

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

 



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/
--
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


[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