natd(8)
NAME
natd - Network Address Translation daemon
SYNOPSIS
natd [-unregistered_only | -u] [-log | -l] [-proxy_only] [-reverse] [-deny_incoming | -d] [-use_sockets | -s] [-same_ports | -m] [-verbose | -v] [-dynamic] [-in_port | -i port] [-out_port | -o port] [-port | -p port] [-alias_address | -a address] [-target_address | -t address] [-interface | -n interface] [-proxy_rule proxyspec] [-redirect_port linkspec] [-redirect_proto linkspec] [-redirect_address linkspec] [-config | -f configfile] [-log_denied] [-log_facility facility_name] [-punch_fw firewall_range] [-skinny_port port] [-log_ipfw_denied] [-pid_file | -P pidfile]
DESCRIPTION
- The natd utility provides a Network Address Translation fa
- cility for use
with divert(4) sockets under FreeBSD. - (If you need NAT on a PPP link, ppp(8) provides the -nat op
- tion that
gives most of the natd functionality, and uses the same - libalias(3)
library.) - The natd utility normally runs in the background as a dae
- mon. It is
passed raw IP packets as they travel into and out of the ma - chine, and
will possibly change these before re-injecting them back in - to the IP
packet stream. - It changes all packets destined for another host so that
- their source IP
address is that of the current machine. For each packet - changed in this
manner, an internal table entry is created to record this - fact. The
source port number is also changed to indicate the table en - try applying
to the packet. Packets that are received with a target IP - of the current
host are checked against this internal table. If an entry - is found, it
is used to determine the correct target IP address and port - to place in
the packet. - The following command line options are available:
- -log | -l Log various aliasing statistics and information
- to the file
- /var/log/alias.log. This file is truncated each
- time natd is
started. - -deny_incoming | -d
- Do not pass incoming packets that have no entry
- in the internal translation table.
- If this option is not used, then such a packet
- will be
altered using the rules in -target_address be - low, and the
entry will be made in the internal translation - table.
- -log_denied
- Log denied incoming packets via syslog(3) (see
- also
-log_facility). - -log_facility facility_name
- Use specified log facility when logging informa
- tion via
syslog(3). Argument facility_name is one of the - keywords
specified in syslog.conf(5). - -use_sockets | -s
- Allocate a socket(2) in order to establish an
- FTP data or IRC
DCC send connection. This option uses more sys - tem resources,
but guarantees successful connections when port - numbers conflict.
- -same_ports | -m
- Try to keep the same port number when altering
- outgoing packets. With this option, protocols such as RPC
- will have a
better chance of working. If it is not possible - to maintain
the port number, it will be silently changed as - per normal.
- -verbose | -v
- Do not call daemon(3) on startup. Instead, stay
- attached to
the controlling terminal and display all packet - alterations
to the standard output. This option should only - be used for
debugging purposes. - -unregistered_only | -u
- Only alter outgoing packets with an unregistered
- source
address. According to RFC 1918, unregistered - source
addresses are 10.0.0.0/8, 172.16.0.0/12 and - 192.168.0.0/16.
- -redirect_port proto targetIP:targetPORT[-targetPORT]
- [aliasIP:]aliasPORT[-aliasPORT] [remoteIP[:remotePORT[-remotePORT]]] Redirect incoming connections arriving to given
- port(s) to
another host and port(s). Argument proto is ei - ther tcp or
udp, targetIP is the desired target IP address, - targetPORT is
the desired target port number or range, - aliasPORT is the
requested port number or range, and aliasIP is - the aliasing
address. Arguments remoteIP and remotePORT can - be used to
specify the connection more accurately if neces - sary. If
remotePORT is not specified, it is assumed to be - all ports.
- Arguments targetIP, aliasIP and remoteIP can be
- given as IP
addresses or as hostnames. The targetPORT, - aliasPORT and
remotePORT ranges need not be the same numeri - cally, but must
have the same size. When targetPORT, aliasPORT - or remotePORT
specifies a singular value (not a range), it can - be given as
a service name that is searched for in the ser - vices(5)
database. - For example, the argument
tcp inside1:telnet 6666 - means that incoming TCP packets destined for
- port 6666 on
this machine will be sent to the telnet port on - the inside1
machine.
tcp inside2:2300-2399 3300-3399 - will redirect incoming connections on ports
- 3300-3399 to host
inside2, ports 2300-2399. The mapping is 1:1 - meaning port
3300 maps to 2300, 3301 maps to 2301, etc. - -redirect_proto proto localIP [publicIP [remoteIP]]
- Redirect incoming IP packets of protocol proto
- (see
protocols(5)) destined for publicIP address to a - localIP
address and vice versa. - If publicIP is not specified, then the default
- aliasing
address is used. If remoteIP is specified, then - only packets
coming from/to remoteIP will match the rule. - -redirect_address localIP publicIP
- Redirect traffic for public IP address to a ma
- chine on the
local network. This function is known as static - NAT. Normally static NAT is useful if your ISP has allo
- cated a small
block of IP addresses to you, but it can even be - used in the
case of single address:
redirect_address 10.0.0.8 0.0.0.0 - The above command would redirect all incoming
- traffic to
machine 10.0.0.8. - If several address aliases specify the same pub
- lic address as
follows
redirect_address 192.168.0.2 public_addr
redirect_address 192.168.0.3 public_addr
redirect_address 192.168.0.4 public_addr - the incoming traffic will be directed to the
- last translated
local address (192.168.0.4), but outgoing traf - fic from the
first two addresses will still be aliased to ap - pear from the
specified public_addr. - -redirect_port proto
- targetIP:targetPORT[,targetIP:targetPORT[,...]]
- [aliasIP:]aliasPORT [remoteIP[:remotePORT]]
- -redirect_address localIP[,localIP[,...]] publicIP
- These forms of -redirect_port and
- -redirect_address are used
to transparently offload network load on a sin - gle server and
distribute the load across a pool of servers. - This function
is known as LSNAT (RFC 2391). For example, the - argument
tcp www1:http,www2:http,www3:http www:http - means that incoming HTTP requests for host www
- will be transparently redirected to one of the www1, www2 or
- www3, where a
host is selected simply on a round-robin basis, - without
regard to load on the net. - -dynamic If the -n or -interface option is used, natd
- will monitor the
- routing socket for alterations to the interface
- passed. If
the interface's IP address is changed, natd will - dynamically
alter its concept of the alias address. - -in_port | -i port
- Read from and write to divert(4) port port,
- treating all
packets as ``incoming''. - -out_port | -o port
- Read from and write to divert(4) port port,
- treating all
packets as ``outgoing''. - -port | -p port
- Read from and write to divert(4) port port, dis
- tinguishing
packets as ``incoming'' or ``outgoing'' using - the rules specified in divert(4). If port is not numeric, it
- is searched
for in the services(5) database. If this option - is not specified, the divert port named natd will be used
- as a default.
- -alias_address | -a address
- Use address as the aliasing address. Either
- this or the
-interface option must be used (but not both), - if the
-proxy_only option is not specified. The speci - fied address
is usually the address assigned to the ``pub - lic'' network
interface. - All data passing out will be rewritten with a
- source address
equal to address. All data coming in will be - checked to see
if it matches any already-aliased outgoing con - nection. If it
does, the packet is altered accordingly. If - not, all
-redirect_port, -redirect_proto and - -redirect_address assignments are checked and actioned. If no other ac
- tion can be
made and if -deny_incoming is not specified, the - packet is
delivered to the local machine using the rules - specified in
-target_address option below. - -t | -target_address address
- Set the target address. When an incoming packet
- not associated with any pre-existing link arrives at the
- host machine,
it will be sent to the specified address. - The target address may be set to
- 255.255.255.255, in which
case all new incoming packets go to the alias - address set by
-alias_address or -interface. - If this option is not used, or called with the
- argument
0.0.0.0, then all new incoming packets go to the - address
specified in the packet. This allows external - machines to
talk directly to internal machines if they can - route packets
to the machine in question. - -interface | -n interface
- Use interface to determine the aliasing address.
- If there is
a possibility that the IP address associated - with interface
may change, the -dynamic option should also be - used. If this
option is not specified, the -alias_address op - tion must be
used. - The specified interface is usually the ``pub
- lic'' (or
``external'') network interface. - -config | -f file
- Read configuration from file. A file should
- contain a list
of options, one per line, in the same form as - the long form
of the above command line options. For example, - the line
alias_address 158.152.17.1 - would specify an alias address of 158.152.17.1.
- Options that
do not take an argument are specified with an - argument of yes
or no in the configuration file. For example, - the line
log yes - is synonymous with -log.
- Trailing spaces and empty lines are ignored. A
- `#' sign will
mark the rest of the line as a comment. - -reverse This option makes natd reverse the way it han
- dles
- ``incoming'' and ``outgoing'' packets, allowing
- it to operate
on the ``internal'' network interface rather - than the
``external'' one. - This can be useful in some transparent proxying
- situations
when outgoing traffic is redirected to the local - machine and
natd is running on the internal interface (it - usually runs on
the external interface). - -proxy_only
- Force natd to perform transparent proxying only.
- Normal
address translation is not performed. - -proxy_rule [type encode_ip_hdr | encode_tcp_stream] port
- xxxx server
- a.b.c.d:yyyy
Enable transparent proxying. Outgoing TCP pack - ets with the
given port going through this host to any other - host are
redirected to the given server and port. Op - tionally, the
original target address can be encoded into the - packet. Use
encode_ip_hdr to put this information into the - IP option
field or encode_tcp_stream to inject the data - into the beginning of the TCP stream.
- -punch_fw basenumber:count
- This option directs natd to ``punch holes'' in
- an
ipfirewall(4) based firewall for FTP/IRC DCC - connections.
This is done dynamically by installing temporary - firewall
rules which allow a particular connection (and - only that connection) to go through the firewall. The rules
- are removed
once the corresponding connection terminates. - A maximum of count rules starting from the rule
- number
basenumber will be used for punching firewall - holes. The
range will be cleared for all rules on startup. - -skinny_port port
- This option allows you to specify the TCP port
- used for the
Skinny Station protocol. Skinny is used by Cis - co IP phones
to communicate with Cisco Call Managers to set - up voice over
IP calls. By default, Skinny aliasing is not - performed. The
typical port value for Skinny is 2000. - -log_ipfw_denied
- Log when a packet cannot be re-injected because
- an ipfw(8)
rule blocks it. This is the default with - -verbose.
- -pid_file | -P file
- Specify an alternate file in which to store the
- process ID.
The default is /var/run/natd.pid.
RUNNING NATD
- The following steps are necessary before attempting to run
- natd:
- 1. Build a custom kernel with the following options:
options IPFIREWALL
options IPDIVERT- Refer to the handbook for detailed instructions on
- building a custom
kernel. - 2. Ensure that your machine is acting as a gateway. This
- can be done
by specifying the line
gateway_enable=YES- in the /etc/rc.conf file or using the command
sysctl net.inet.ip.forwarding=1- 3. If you use the -interface option, make sure that your
- interface isalready configured. If, for example, you wish to spec
- ify `tun0' as
your interface, and you are using ppp(8) on that inter - face, you must
make sure that you start ppp prior to starting natd. - Running natd is fairly straight forward. The line
natd -interface ed0- should suffice in most cases (substituting the correct in
- terface name).
Please check rc.conf(5) on how to configure it to be started - automatically during boot. Once natd is running, you must ensure
- that traffic is
diverted to natd: - 1. You will need to adjust the /etc/rc.firewall script to
- taste. Ifyou are not interested in having a firewall, the fol
- lowing lines
will do:
/sbin/ipfw -f flush
/sbin/ipfw add divert natd all from any to any- via ed0
/sbin/ipfw add pass all from any to any - The second line depends on your interface (change `ed0'
- as appropriate).
- You should be aware of the fact that, with these fire
- wall settings,
everyone on your local network can fake his source-ad - dress using
your host as gateway. If there are other hosts on your - local network, you are strongly encouraged to create firewall
- rules that only
allow traffic to and from trusted hosts. - If you specify real firewall rules, it is best to spec
- ify line 2 at
the start of the script so that natd sees all packets - before they
are dropped by the firewall. - After translation by natd, packets re-enter the fire
- wall at the rule
number following the rule number that caused the diver - sion (not the
next rule if there are several at the same number). - 2. Enable your firewall by setting
firewall_enable=YES- in /etc/rc.conf. This tells the system startup scripts
- to run the
/etc/rc.firewall script. If you do not wish to reboot - now, just run
this by hand from the console. NEVER run this from a - remote session
unless you put it into the background. If you do, you - will lock
yourself out after the flush takes place, and execution - of
/etc/rc.firewall will stop at this point - blocking all - accesses
permanently. Running the script in the background - should be enough
to prevent this disaster.
SEE ALSO
AUTHORS
- This program is the result of the efforts of many people at
- different
times: - Archie Cobbs <archie@FreeBSD.org> (divert sockets)
Charles Mott <cm@linktel.net> (packet aliasing)
Eivind Eklund <perhaps@yes.no> (IRC support & misc addi - tions)
Ari Suutari <suutari@iki.fi> (natd)
Dru Nelson <dnelson@redwoodsoft.com> (early PPTP support)
Brian Somers <brian@awfulhak.org> (glue)
Ruslan Ermilov <ru@FreeBSD.org> (natd, packet aliasing, - glue)
- BSD February 28, 2003