Most organizations are allotted a limited number of publicly
routable IP addresses from their ISP. Due to this limited allowance,
administrators must find creative ways to share access to Internet
services without giving limited public IP addresses to every node on the
LAN. Using private IP address is the common way to allow all nodes on a
LAN to properly access internal and external network services. Edge
routers (such as firewalls) can receive incoming transmissions from the
Internet and route the packets to the intended LAN node. At the same
time, firewall/gateways can also route outgoing requests from a LAN node
to the remote Internet service. This forwarding of network traffic can
become dangerous at times, especially with the availability of modern
cracking tools that can spoof internal IP addresses
and make the remote attacker's machine act as a node on your LAN. To
prevent this, iptables provides routing and
forwarding policies that can be implemented to prevent aberrant usage of
network resources.

The FORWARD policy allows an
administrator to control where packets can be routed within a LAN. For
example, to allow forwarding for the entire LAN (assuming the
firewall/gateway is assigned an internal IP address on eth1), the
following rules can be set:

This rule gives systems behind the firewall/gateway access to the
internal network. The gateway routes packets from one LAN node to its
intended destination node, passing all packets through its
eth1 device.

Note

By default, the IPv4 policy in Red Hat Enterprise Linux kernels disables support
for IP forwarding, which prevents boxes running Red Hat Enterprise Linux from
functioning as dedicated edge routers. To enable IP forwarding, run
the following command:

sysctl -w net.ipv4.ip_forward=1

If this command is run via shell prompt, then the setting is not
remembered after a reboot. You can permanently set forwarding by
editing the /etc/sysctl.conf file. Find and edit
the following line, replacing 0 with
1:

net.ipv4.ip_forward = 0

Execute the following command to enable the change to the
sysctl.conf file:

sysctl -p /etc/sysctl.conf

Accepting forwarded packets via the firewall's internal IP device
allows LAN nodes to communicate with each other; however they still are
not allowed to communicate externally to the Internet. To
allow LAN nodes with private IP addresses to communicate with external
public networks, configure the firewall for IP
masquerading, which masks requests from LAN nodes with the IP
address of the firewall's external device (in this case, eth0):

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

The rule uses the NAT packet matching table (-t
nat) and specifies the built-in POSTROUTING chain for NAT
(-A POSTROUTING) on the firewall's external
networking device (-o eth0). POSTROUTING allows
packets to be altered as they are leaving the firewall's external
device. The -j MASQUERADE target is specified to mask
the private IP address of a node with the external IP address of the
firewall/gateway.

If you have a server on your internal network that you want make
available externally, you can use the -j DNAT target of
the PREROUTING chain in NAT to specify a destination IP address and port
where incoming packets requesting a connection to your internal service
can be forwarded. For example, if you wanted to forward incoming HTTP
requests to your dedicated Apache HTTP Server server system at 172.31.0.23, run the
following command:

This rule specifies that the NAT table use the built-in PREROUTING
chain to forward incoming HTTP requests exclusively to the listed
destination IP address of 172.31.0.23.

Note

If you have a default policy of DROP in your FORWARD chain, you
must append a rule to allow forwarding of incoming HTTP requests so that
destination NAT routing can be possible. To do this, run the following
command:

iptables rules can be set to route traffic to
certain machines, such as a dedicated HTTP or FTP server, in a
demilitarized zone (DMZ)
— a special local subnetwork dedicated to providing services on
a public carrier such as the Internet. For example, to set a rule for
routing incoming HTTP requests to a dedicated HTTP server at 10.0.4.2
(outside of the 192.168.1.0/24 range of the LAN), NAT calls a
PREROUTING table to forward the
packets to their proper destination:

With this command, all HTTP connections to port 80 from the
outside of the LAN are routed to the HTTP server on a separate network
from the rest of the internal network. This form of network segmentation
can prove safer than allowing HTTP connections to a machine on the
network. If the HTTP server is configured to accept secure connections,
then port 443 must be forwarded as well.