<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
"http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
<refentry>
  <refmeta>
    <refentrytitle>shorewall-nat</refentrytitle>

    <manvolnum>5</manvolnum>

    <refmiscinfo>Configuration Files</refmiscinfo>
  </refmeta>

  <refnamediv>
    <refname>nat</refname>

    <refpurpose>Shorewall one-to-one NAT file</refpurpose>
  </refnamediv>

  <refsynopsisdiv>
    <cmdsynopsis>
      <command>/etc/shorewall/nat</command>
    </cmdsynopsis>
  </refsynopsisdiv>

  <refsect1>
    <title>Description</title>

    <para>This file is used to define one-to-one Network Address Translation
    (NAT).</para>

    <warning>
      <para>If all you want to do is simple port forwarding, do NOT use this
      file. See <ulink
      url="/FAQ.htm#faq1">http://www.shorewall.net/FAQ.htm#faq1</ulink>. Also,
      in many cases, Proxy ARP (<ulink
      url="/manpages/shorewall-proxyarp.html">shorewall-proxyarp</ulink>(5))
      or Proxy-NDP(<ulink
      url="/manpages6/shorewall6-proxyndp.html">shorewall6-proxyndp</ulink>(5))
      is a better solution that one-to-one NAT.</para>
    </warning>

    <para>The columns in the file are as follows (where the column name is
    followed by a different name in parentheses, the different name is used in
    the alternate specification syntax).</para>

    <variablelist>
      <varlistentry>
        <term><emphasis role="bold">EXTERNAL</emphasis> -
        {<emphasis>address</emphasis>|?COMMENT}</term>

        <listitem>
          <para>External IP Address - this should NOT be the primary IP
          address of the interface named in the next column and must not be a
          DNS Name.</para>

          <para>If you put ?COMMENT in this column, the rest of the line will
          be attached as a comment to the Netfilter rule(s) generated by the
          following entries in the file. The comment will appear delimited by
          "/* ... */" in the output of "shorewall show nat"</para>

          <para>To stop the comment from being attached to further rules,
          simply include ?COMMENT on a line by itself.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><emphasis role="bold">INTERFACE</emphasis> -
        <emphasis>interfacelist</emphasis>[<emphasis
        role="bold">:</emphasis>[<emphasis>digit</emphasis>]]</term>

        <listitem>
          <para>Interfaces that have the <emphasis
          role="bold">EXTERNAL</emphasis> address. If ADD_IP_ALIASES=Yes in
          <ulink
          url="/manpages/shorewall.conf.html">shorewall.conf</ulink>(5),
          Shorewall will automatically add the EXTERNAL address to this
          interface. Also if ADD_IP_ALIASES=Yes, you may follow the interface
          name with ":" and a <emphasis>digit</emphasis> to indicate that you
          want Shorewall to add the alias with this name (e.g., "eth0:0").
          That allows you to see the alias with ifconfig. <emphasis
          role="bold">That is the only thing that this name is good for -- you
          cannot use it anywhere else in your Shorewall configuration.
          </emphasis></para>

          <para>Each interface must match an entry in <ulink
          url="/manpages/shorewall-interfaces.html">shorewall-interfaces</ulink>(5).
          Shorewall allows loose matches to wildcard entries in <ulink
          url="/manpages/shorewall-interfaces.html">shorewall-interfaces</ulink>(5).
          For example, <filename class="devicefile">ppp0</filename> in this
          file will match a <ulink
          url="/manpages/shorewall-interfaces.html">shorewall-interfaces</ulink>(5)
          entry that defines <filename
          class="devicefile">ppp+</filename>.</para>

          <para>If you want to override ADD_IP_ALIASES=Yes for a particular
          entry, follow the interface name with ":" and no digit (e.g.,
          "eth0:").</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><emphasis role="bold">INTERNAL</emphasis> -
        <emphasis>address</emphasis></term>

        <listitem>
          <para>Internal Address (must not be a DNS Name).</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><emphasis role="bold">ALLINTS</emphasis> - [<emphasis
        role="bold">Yes</emphasis>|<emphasis role="bold">No</emphasis>]</term>

        <listitem>
          <para>If Yes or yes, NAT will be effective from all hosts. If No or
          no (or left empty) then NAT will be effective only through the
          interface named in the <emphasis role="bold">INTERFACE</emphasis>
          column.</para>

          <para>This column was formerly labelled ALL INTERFACES.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><emphasis role="bold">LOCAL</emphasis> - [<emphasis
        role="bold">Yes</emphasis>|<emphasis role="bold">No</emphasis>]</term>

        <listitem>
          <para>If <emphasis role="bold">Yes</emphasis> or <emphasis
          role="bold">yes</emphasis>, NAT will be effective from the firewall
          system</para>
        </listitem>
      </varlistentry>
    </variablelist>
  </refsect1>

  <refsect1>
    <title>RESTRICTIONS</title>

    <para>DNAT rules always preempt one-to-one NAT rules. This has subtile
    consequences when there are sub-zones on an
    <replaceable>interface</replaceable>. Consider the following:</para>

    <para><filename>/etc/shorewall/zones</filename>:</para>

    <programlisting>#ZONE   TYPE    OPTIONS                 IN                      OUT
#                                       OPTIONS                 OPTIONS
fw      firewall
net     ipv4
loc     ipv4
smc:net ipv4</programlisting>

    <para><filename>/etc/shorewall/interfaces</filename>:</para>

    <programlisting>#ZONE   INTERFACE       OPTIONS
net     eth0            dhcp,tcpflags,nosmurfs,routefilter,logmartians,sourceroute=0
loc     eth1            tcpflags,nosmurfs,routefilter,logmartians</programlisting>

    <para><filename>/etc/shorewall/hosts</filename>:</para>

    <programlisting>#ZONE   HOST(S)                                 OPTIONS
smc     eth0:10.1.10.0/24</programlisting>

    <para><filename>/etc/shorewall/nat</filename>:</para>

    <programlisting>#EXTERNAL       INTERFACE       INTERNAL        ALLINTS         LOCAL
10.1.10.100     eth0            172.20.1.100
</programlisting>

    <para>Note that the EXTERNAL address is in the <emphasis
    role="bold">smc</emphasis> zone.</para>

    <para><filename>/etc/shorewall/rules</filename>:</para>

    <programlisting>#ACTION         SOURCE          DEST            PROTO   DPORT   SPORT           ORIGDEST        RATE            USER    MARK    CONNLIMIT       TIME            HEADERS     SWITCH           HELPER
?SECTION ALL
?SECTION ESTABLISHED
?SECTION RELATED
?SECTION INVALID
?SECTION UNTRACKED
?SECTION NEW
...
DNAT            net             loc:172.20.1.4  tcp     80</programlisting>

    <para>For the one-to-one NAT to work correctly in this configuration, one
    of two approaches can be taken:</para>

    <orderedlist>
      <listitem>
        <para>Define a CONTINUE policy with <emphasis
        role="bold">smc</emphasis> as the SOURCE zone (preferred):</para>

        <programlisting>#SOURCE		DEST		POLICY		LOG LEVEL	LIMIT:BURST
<emphasis role="bold">smc		$FW		CONTINUE</emphasis>
loc		net		ACCEPT
net		all		DROP		info
# THE FOLLOWING POLICY MUST BE LAST
all		all		REJECT		info
</programlisting>
      </listitem>

      <listitem>
        <para>Set IMPLICIT_CONTINUE=Yes in <ulink
        url="/manpages/shorewall.conf.html">shorewall.conf(5)</ulink>.</para>
      </listitem>
    </orderedlist>
  </refsect1>

  <refsect1>
    <title>FILES</title>

    <para>/etc/shorewall/nat</para>

    <para>/etc/shorewall6/nat</para>
  </refsect1>

  <refsect1>
    <title>See ALSO</title>

    <para><ulink
    url="/NAT.htm">http://www.shorewall.net/NAT.htm</ulink></para>

    <para><ulink
    url="/configuration_file_basics.htm#Pairs">http://www.shorewall.net/configuration_file_basics.htm#Pairs</ulink></para>

    <para>shorewall(8)</para>
  </refsect1>
</refentry>