Correctly classifying iptables NAT beahaviour...

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

 



That old chesnut.

I notice that the default iptables MASQ and SNAT behaviour appears to be an odd hybrid of both port restricted and symmetric NATs. As long as the host behind the iptables NAT is the first sender then the external firewall port becomes open and packets sent from in reply from the right ip:port will pass through the firewall. This is classic port restricted behaviour. However, if a packet is sent first from an external host to the ip:port address that would have been used by an internal host then when the internal host attempts to send to the same external host it's port becomes changed on the way through NAT (usually to 1024 in my experience). This is classic symmetric behaviour.

More succinctly:

Two hosts, A and B where A=IPa:PORTa, B=IPb:PORTb. A is behind an iptables NAT. B is, for all intents, open.

If A sends to B first then B can reply to A.
If B sends to A first then B will get ICMP port unreachable. If A now sends to B within a short space of time the port on packets form A will be changed (A=IPa:PORTx). If B were to be behind a port restricted NAT then A would receive ICMP port unreachable since B was sending to IPa:PORTa.

Can anyone confirm that this in fact the intended, correct behaviour and that I haven't got some part of my setup wrong ?

I'm in the middle of writing a NAT traversal library and would have liked to use iptables to model the typical consumer router gateway. This is a multiplayer game application.

The problem that this behaviour presents to me is that anything behind a this NAT will report itself as behind a port restricted NAT when in practice it's actually behind a symmetric NAT. With the increasing popularity of iptables based gateway routers in domestic setups this is a real problem to anyone implementing NAT traversal. If I could detect that a host is behind such a NAT I can arrange for it to always send the first packet. If I can't then it's likely I'll never be able to reliably make a connection to it.

So.. my questions are:

Is it at all possible to at least get pure port restricted behaviour from iptables? i.e. Regardless of who sends the first packet if the host behind the NAT sends to ip:port then ip:port will be guaranteed to be able to reply.

Does anyone have any knowledge of an alternative traversal technique that does not involve a relay that might be able to form a connection under these conditions.

Thanks in advance,

--
t o b e

London, UK.
--
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