1.Dd October 5, 2016
2.Dt NATD 8
3.Os
4.Sh NAME
5.Nm natd
6.Nd Network Address Translation daemon
7.Sh SYNOPSIS
8.Nm
9.Bk -words
10.Op Fl unregistered_only | u
11.Op Fl log | l
12.Op Fl proxy_only
13.Op Fl reverse
14.Op Fl deny_incoming | d
15.Op Fl use_sockets | s
16.Op Fl same_ports | m
17.Op Fl verbose | v
18.Op Fl dynamic
19.Op Fl in_port | i Ar port
20.Op Fl out_port | o Ar port
21.Op Fl port | p Ar port
22.Op Fl alias_address | a Ar address
23.Op Fl target_address | t Ar address
24.Op Fl interface | n Ar interface
25.Op Fl proxy_rule Ar proxyspec
26.Op Fl redirect_port Ar linkspec
27.Op Fl redirect_proto Ar linkspec
28.Op Fl redirect_address Ar linkspec
29.Op Fl config | f Ar configfile
30.Op Fl instance Ar instancename
31.Op Fl globalport Ar port
32.Op Fl log_denied
33.Op Fl log_facility Ar facility_name
34.Op Fl punch_fw Ar firewall_range
35.Op Fl skinny_port Ar port
36.Op Fl log_ipfw_denied
37.Op Fl pid_file | P Ar pidfile
38.Op Fl exit_delay | P Ar ms
39.Ek
40.Sh DESCRIPTION
41The
42.Nm
43utility provides a Network Address Translation facility for use
44with
45.Xr divert 4
46sockets under
47.Fx .
48.Pp
49(If you need NAT on a PPP link,
50.Xr ppp 8
51provides the
52.Fl nat
53option that gives most of the
54.Nm
55functionality, and uses the same
56.Xr libalias 3
57library.)
58.Pp
59The
60.Nm
61utility normally runs in the background as a daemon.
62It is passed raw IP packets as they travel into and out of the machine,
63and will possibly change these before re-injecting them back into the
64IP packet stream.
65.Pp
66It changes all packets destined for another host so that their source
67IP address is that of the current machine.
68For each packet changed in this manner, an internal table entry is
69created to record this fact.
70The source port number is also changed to indicate the table entry
71applying to the packet.
72Packets that are received with a target IP of the current host are
73checked against this internal table.
74If an entry is found, it is used to determine the correct target IP
75address and port to place in the packet.
76.Pp
77The following command line options are available:
78.Bl -tag -width Fl
79.It Fl log | l
80Log various aliasing statistics and information to the file
81.Pa /var/log/alias.log .
82This file is truncated each time
83.Nm
84is started.
85.It Fl deny_incoming | d
86Do not pass incoming packets that have no
87entry in the internal translation table.
88.Pp
89If this option is not used, then such a packet will be altered
90using the rules in
91.Fl target_address
92below, and the entry will be made in the internal translation table.
93.It Fl log_denied
94Log denied incoming packets via
95.Xr syslog 3
96(see also
97.Fl log_facility ) .
98.It Fl log_facility Ar facility_name
99Use specified log facility when logging information via
100.Xr syslog 3 .
101Argument
102.Ar facility_name
103is one of the keywords specified in
104.Xr syslog.conf 5 .
105.It Fl use_sockets | s
106Allocate a
107.Xr socket 2
108in order to establish an FTP data or IRC DCC send connection.
109This option uses more system resources, but guarantees successful
110connections when port numbers conflict.
111.It Fl same_ports | m
112Try to keep the same port number when altering outgoing packets.
113With this option, protocols such as RPC will have a better chance
114of working.
115If it is not possible to maintain the port number, it will be silently
116changed as per normal.
117.It Fl verbose | v
118Do not call
119.Xr daemon 3
120on startup.
121Instead, stay attached to the controlling terminal and display all packet
122alterations to the standard output.
123This option should only be used for debugging purposes.
124.It Fl unregistered_only | u
125Only alter outgoing packets with an
126.Em unregistered
127source address.
128According to RFC 1918, unregistered source addresses are 10.0.0.0/8,
129172.16.0.0/12 and 192.168.0.0/16.
130.It Fl redirect_port Ar proto Xo
131.Ar targetIP Ns : Ns Xo
132.Ar targetPORT Ns Oo - Ns Ar targetPORT Oc Xc
133.Oo Ar aliasIP Ns : Oc Ns Xo
134.Ar aliasPORT Ns Oo - Ns Ar aliasPORT Oc Xc
135.Oo Ar remoteIP Ns Oo : Ns
136.Ar remotePORT Ns Op - Ns Ar remotePORT
137.Oc Oc
138.Xc
139Redirect incoming connections arriving to given port(s) to another host
140and port(s).
141Argument
142.Ar proto
143is either
144.Ar tcp
145or
146.Ar udp ,
147.Ar targetIP
148is the desired target IP address,
149.Ar targetPORT
150is the desired target port number or range,
151.Ar aliasPORT
152is the requested port number or range, and
153.Ar aliasIP
154is the aliasing address.
155Arguments
156.Ar remoteIP
157and
158.Ar remotePORT
159can be used to specify the connection more accurately if necessary.
160If
161.Ar remotePORT
162is not specified, it is assumed to be all ports.
163.Pp
164Arguments
165.Ar targetIP , aliasIP
166and
167.Ar remoteIP
168can be given as IP addresses or as hostnames.
169The
170.Ar targetPORT , aliasPORT
171and
172.Ar remotePORT
173ranges need not be the same numerically, but must have the same size.
174When
175.Ar targetPORT , aliasPORT
176or
177.Ar remotePORT
178specifies a singular value (not a range), it can be given as a service
179name that is searched for in the
180.Xr services 5
181database.
182.Pp
183For example, the argument
184.Pp
185.Dl Ar tcp inside1:telnet 6666
186.Pp
187means that incoming TCP packets destined for port 6666 on this machine
188will be sent to the telnet port on the inside1 machine.
189.Pp
190.Dl Ar tcp inside2:2300-2399 3300-3399
191.Pp
192will redirect incoming connections on ports 3300-3399 to host
193inside2, ports 2300-2399.
194The mapping is 1:1 meaning port 3300 maps to 2300, 3301 maps to 2301, etc.
195.It Fl redirect_proto Ar proto localIP Oo
196.Ar publicIP Op Ar remoteIP
197.Oc
198Redirect incoming IP packets of protocol
199.Ar proto
200(see
201.Xr protocols 5 )
202destined for
203.Ar publicIP
204address to a
205.Ar localIP
206address and vice versa.
207.Pp
208If
209.Ar publicIP
210is not specified, then the default aliasing address is used.
211If
212.Ar remoteIP
213is specified, then only packets coming from/to
214.Ar remoteIP
215will match the rule.
216.It Fl redirect_address Ar localIP publicIP
217Redirect traffic for public IP address to a machine on the local
218network.
219This function is known as
220.Em static NAT .
221Normally static NAT is useful if your ISP has allocated a small block
222of IP addresses to you, but it can even be used in the case of single
223address:
224.Pp
225.Dl Ar redirect_address 10.0.0.8 0.0.0.0
226.Pp
227The above command would redirect all incoming traffic
228to machine 10.0.0.8.
229.Pp
230If several address aliases specify the same public address
231as follows
232.Bd -literal -offset indent
233redirect_address 192.168.0.2 public_addr
234redirect_address 192.168.0.3 public_addr
235redirect_address 192.168.0.4 public_addr
236.Ed
237.Pp
238the incoming traffic will be directed to the last
239translated local address (192.168.0.4), but outgoing
240traffic from the first two addresses will still be aliased
241to appear from the specified
242.Ar public_addr .
243.It Fl redirect_port Ar proto Xo
244.Ar targetIP Ns : Ns Xo
245.Ar targetPORT Ns Oo , Ns
246.Ar targetIP Ns : Ns Xo
247.Ar targetPORT Ns Oo , Ns
248.Ar ...\&
249.Oc Xc Oc Xc
250.Oo Ar aliasIP Ns : Oc Ns Xo
251.Ar aliasPORT
252.Xc
253.Oo Ar remoteIP Ns
254.Op : Ns Ar remotePORT
255.Oc
256.Xc
257.It Fl redirect_address Xo
258.Ar localIP Ns Oo , Ns
259.Ar localIP Ns Oo , Ns
260.Ar ...\&
261.Oc Oc
262.Ar publicIP
263.Xc
264These forms of
265.Fl redirect_port
266and
267.Fl redirect_address
268are used to transparently offload network load on a single server and
269distribute the load across a pool of servers.
270This function is known as
271.Em LSNAT
272(RFC 2391).
273For example, the argument
274.Pp
275.Dl Ar tcp www1:http,www2:http,www3:http www:http
276.Pp
277means that incoming HTTP requests for host www will be transparently
278redirected to one of the www1, www2 or www3, where a host is selected
279simply on a round-robin basis, without regard to load on the net.
280.It Fl dynamic
281If the
282.Fl n
283or
284.Fl interface
285option is used,
286.Nm
287will monitor the routing socket for alterations to the
288.Ar interface
289passed.
290If the interface's IP address is changed,
291.Nm
292will dynamically alter its concept of the alias address.
293.It Fl in_port | i Ar port
294Read from and write to
295.Xr divert 4
296port
297.Ar port ,
298treating all packets as
299.Dq incoming .
300.It Fl out_port | o Ar port
301Read from and write to
302.Xr divert 4
303port
304.Ar port ,
305treating all packets as
306.Dq outgoing .
307.It Fl port | p Ar port
308Read from and write to
309.Xr divert 4
310port
311.Ar port ,
312distinguishing packets as
313.Dq incoming
314or
315.Dq outgoing
316using the rules specified in
317.Xr divert 4 .
318If
319.Ar port
320is not numeric, it is searched for in the
321.Xr services 5
322database.
323If this option is not specified, the divert port named
324.Ar natd
325will be used as a default.
326.It Fl alias_address | a Ar address
327Use
328.Ar address
329as the aliasing address.
330Either this or the
331.Fl interface
332option must be used (but not both),
333if the
334.Fl proxy_only
335option is not specified.
336The specified address is usually the address assigned to the
337.Dq public
338network interface.
339.Pp
340All data passing
341.Em out
342will be rewritten with a source address equal to
343.Ar address .
344All data coming
345.Em in
346will be checked to see if it matches any already-aliased outgoing
347connection.
348If it does, the packet is altered accordingly.
349If not, all
350.Fl redirect_port ,
351.Fl redirect_proto
352and
353.Fl redirect_address
354assignments are checked and actioned.
355If no other action can be made and if
356.Fl deny_incoming
357is not specified, the packet is delivered to the local machine
358using the rules specified in
359.Fl target_address
360option below.
361.It Fl t | target_address Ar address
362Set the target address.
363When an incoming packet not associated with any pre-existing link
364arrives at the host machine, it will be sent to the specified
365.Ar address .
366.Pp
367The target address may be set to
368.Ar 255.255.255.255 ,
369in which case all new incoming packets go to the alias address set by
370.Fl alias_address
371or
372.Fl interface .
373.Pp
374If this option is not used, or called with the argument
375.Ar 0.0.0.0 ,
376then all new incoming packets go to the address specified in
377the packet.
378This allows external machines to talk directly to internal machines if
379they can route packets to the machine in question.
380.It Fl interface | n Ar interface
381Use
382.Ar interface
383to determine the aliasing address.
384If there is a possibility that the IP address associated with
385.Ar interface
386may change, the
387.Fl dynamic
388option should also be used.
389If this option is not specified, the
390.Fl alias_address
391option must be used.
392.Pp
393The specified
394.Ar interface
395is usually the
396.Dq public
397(or
398.Dq external )
399network interface.
400.It Fl config | f Ar file
401Read configuration from
402.Ar file .
403A
404.Ar file
405should contain a list of options, one per line, in the same form
406as the long form of the above command line options.
407For example, the line
408.Pp
409.Dl alias_address 158.152.17.1
410.Pp
411would specify an alias address of 158.152.17.1.
412Options that do not take an argument are specified with an argument of
413.Ar yes
414or
415.Ar no
416in the configuration file.
417For example, the line
418.Pp
419.Dl log yes
420.Pp
421is synonymous with
422.Fl log .
423.Pp
424Options can be divided to several sections.
425Each section applies to own
426.Nm
427instance.
428This ability allows the configuration of one
429.Nm
430process for several NAT instances.
431The first instance that always exists is a "default" instance.
432Each another instance should begin with
433.Pp
434.Dl instance Ar instance_name
435.Pp
436At the next should be placed a configuration option.
437Example:
438.Pp
439.Dl \&# default instance
440.Dl port 8668
441.Dl alias_address 158.152.17.1
442.Pp
443.Dl \&# second instance
444.Dl instance dsl1
445.Dl port 8888
446.Dl alias_address 192.168.0.1
447.Pp
448Trailing spaces and empty lines are ignored.
449A
450.Ql \&#
451sign will mark the rest of the line as a comment.
452.It Fl instance Ar instancename
453This option switches command line options processing to configure instance
454.Ar instancename
455(creating it if necessary) till the next
456.Fl instance
457option or end of command line.
458It is easier to set up multiple instances in the configuration file
459specified with the
460.Fl config
461option rather than on a command line.
462.It Fl globalport Ar port
463Read from and write to
464.Xr divert 4
465port
466.Ar port ,
467treating all packets as
468.Dq outgoing .
469This option is intended to be used with multiple instances:
470packets received on this port are checked against
471internal translation tables of every configured instance.
472If an entry is found, packet is aliased according to that entry.
473If no entry was found in any of the instances, packet is passed
474unchanged, and no new entry will be created.
475See the section
476.Sx MULTIPLE INSTANCES
477for more details.
478.It Fl reverse
479This option makes
480.Nm
481reverse the way it handles
482.Dq incoming
483and
484.Dq outgoing
485packets, allowing it to operate on the
486.Dq internal
487network interface rather than the
488.Dq external
489one.
490.Pp
491This can be useful in some transparent proxying situations
492when outgoing traffic is redirected to the local machine
493and
494.Nm
495is running on the internal interface (it usually runs on the
496external interface).
497.It Fl proxy_only
498Force
499.Nm
500to perform transparent proxying only.
501Normal address translation is not performed.
502.It Fl proxy_rule Xo
503.Op Ar type encode_ip_hdr | encode_tcp_stream
504.Ar port xxxx
505.Ar server a.b.c.d:yyyy
506.Xc
507Enable transparent proxying.
508Outgoing TCP packets with the given port going through this
509host to any other host are redirected to the given server and port.
510Optionally, the original target address can be encoded into the packet.
511Use
512.Ar encode_ip_hdr
513to put this information into the IP option field or
514.Ar encode_tcp_stream
515to inject the data into the beginning of the TCP stream.
516.It Fl punch_fw Xo
517.Ar basenumber Ns : Ns Ar count
518.Xc
519This option directs
520.Nm
521to
522.Dq punch holes
523in an
524.Xr ipfirewall 4
525based firewall for FTP/IRC DCC connections.
526This is done dynamically by installing temporary firewall rules which
527allow a particular connection (and only that connection) to go through
528the firewall.
529The rules are removed once the corresponding connection terminates.
530.Pp
531A maximum of
532.Ar count
533rules starting from the rule number
534.Ar basenumber
535will be used for punching firewall holes.
536The range will be cleared for all rules on startup.
537This option has no effect when the kernel is in security
538level 3, see
539.Xr init 8
540for more information.
541.It Fl skinny_port Ar port
542This option allows you to specify the TCP port used for
543the Skinny Station protocol.
544Skinny is used by Cisco IP phones to communicate with
545Cisco Call Managers to set up voice over IP calls.
546By default, Skinny aliasing is not performed.
547The typical port value for Skinny is 2000.
548.It Fl log_ipfw_denied
549Log when a packet cannot be re-injected because an
550.Xr ipfw 8
551rule blocks it.
552This is the default with
553.Fl verbose .
554.It Fl pid_file | P Ar file
555Specify an alternate file in which to store the process ID.
556The default is
557.Pa /var/run/natd.pid .
558.It Fl exit_delay Ar ms
559Specify delay in ms before daemon exit after signal.
560The default is
561.Pa 10000 .
562.El
563.Sh RUNNING NATD
564The following steps are necessary before attempting to run
565.Nm :
566.Bl -enum
567.It
568Build a custom kernel with the following options:
569.Bd -literal -offset indent
570options IPFIREWALL
571options IPDIVERT
572.Ed
573.Pp
574Refer to the handbook for detailed instructions on building a custom
575kernel.
576.It
577Ensure that your machine is acting as a gateway.
578This can be done by specifying the line
579.Pp
580.Dl gateway_enable=YES
581.Pp
582in the
583.Pa /etc/rc.conf
584file or using the command
585.Pp
586.Dl "sysctl net.inet.ip.forwarding=1"
587.It
588If you use the
589.Fl interface
590option, make sure that your interface is already configured.
591If, for example, you wish to specify
592.Ql tun0
593as your
594.Ar interface ,
595and you are using
596.Xr ppp 8
597on that interface, you must make sure that you start
598.Nm ppp
599prior to starting
600.Nm .
601.El
602.Pp
603Running
604.Nm
605is fairly straight forward.
606The line
607.Pp
608.Dl natd -interface ed0
609.Pp
610should suffice in most cases (substituting the correct interface name).
611Please check
612.Xr rc.conf 5
613on how to configure it to be started automatically during boot.
614Once
615.Nm
616is running, you must ensure that traffic is diverted to
617.Nm :
618.Bl -enum
619.It
620You will need to adjust the
621.Pa /etc/rc.firewall
622script to taste.
623If you are not interested in having a firewall, the
624following lines will do:
625.Bd -literal -offset indent
626/sbin/ipfw -f flush
627/sbin/ipfw add divert natd all from any to any via ed0
628/sbin/ipfw add pass all from any to any
629.Ed
630.Pp
631The second line depends on your interface (change
632.Ql ed0
633as appropriate).
634.Pp
635You should be aware of the fact that, with these firewall settings,
636everyone on your local network can fake his source-address using your
637host as gateway.
638If there are other hosts on your local network, you are strongly
639encouraged to create firewall rules that only allow traffic to and
640from trusted hosts.
641.Pp
642If you specify real firewall rules, it is best to specify line 2 at
643the start of the script so that
644.Nm
645sees all packets before they are dropped by the firewall.
646.Pp
647After translation by
648.Nm ,
649packets re-enter the firewall at the rule number following the rule number
650that caused the diversion (not the next rule if there are several at the
651same number).
652.It
653Enable your firewall by setting
654.Pp
655.Dl firewall_enable=YES
656.Pp
657in
658.Pa /etc/rc.conf .
659This tells the system startup scripts to run the
660.Pa /etc/rc.firewall
661script.
662If you do not wish to reboot now, just run this by hand from the console.
663NEVER run this from a remote session unless you put it into the background.
664If you do, you will lock yourself out after the flush takes place, and
665execution of
666.Pa /etc/rc.firewall
667will stop at this point - blocking all accesses permanently.
668Running the script in the background should be enough to prevent this
669disaster.
670.El
671.Sh MULTIPLE INSTANCES
672It is not so uncommon to have a need of aliasing to several external IP
673addresses.
674While this traditionally was achieved by running several
675.Nm
676processes with independent configurations,
677.Nm
678can have multiple aliasing instances in a single process,
679also allowing them to be not so independent of each other.
680For example, let us see a common task of load balancing two
681channels to different providers on a machine with two external
682interfaces
683.Ql sis0
684(with IP 1.2.3.4) and
685.Ql sis2
686(with IP 2.3.4.5):
687.Bd -literal -offset indent
688          net 1.2.3.0/24
6891.2.3.1 ------------------ sis0
690(router)                (1.2.3.4)
691                                         net 10.0.0.0/24
692                                  sis1 ------------------- 10.0.0.2
693                               (10.0.0.1)
694          net 2.3.4.0/24
6952.3.4.1 ------------------ sis2
696(router)                (2.3.4.5)
697.Ed
698.Pp
699Default route is out via
700.Ql sis0 .
701.Pp
702Interior machine (10.0.0.2) is accessible on TCP port 122 through
703both exterior IPs, and outgoing connections choose a path randomly
704between
705.Ql sis0
706and
707.Ql sis2 .
708.Pp
709The way this works is that
710.Pa natd.conf
711builds two instances of the aliasing engine.
712.Pp
713In addition to these instances' private
714.Xr divert 4
715sockets, a third socket called the
716.Dq globalport
717is created; packets sent to
718.Nm
719via this one will be matched against all instances and translated
720if an existing entry is found, and unchanged if no entry is found.
721The following lines are placed into
722.Pa /etc/natd.conf :
723.Bd -literal -offset indent
724log
725deny_incoming
726verbose
727
728instance default
729interface sis0
730port 1000
731redirect_port tcp 10.0.0.2:122 122
732
733instance sis2
734interface sis2
735port 2000
736redirect_port tcp 10.0.0.2:122 122
737
738globalport 3000
739.Ed
740.Pp
741And the following
742.Xr ipfw 8
743rules are used:
744.Bd -literal -offset indent
745ipfw -f flush
746
747ipfw add      allow ip from any to any via sis1
748
749ipfw add      skipto 1000 ip from any to any in via sis0
750ipfw add      skipto 2000 ip from any to any out via sis0
751ipfw add      skipto 3000 ip from any to any in via sis2
752ipfw add      skipto 4000 ip from any to any out via sis2
753
754ipfw add 1000 count ip from any to any
755
756ipfw add      divert 1000 ip from any to any
757ipfw add      allow ip from any to any
758
759ipfw add 2000 count ip from any to any
760
761ipfw add      divert 3000 ip from any to any
762
763ipfw add      allow ip from 1.2.3.4 to any
764ipfw add      skipto 5000 ip from 2.3.4.5 to any
765
766ipfw add      prob .5 skipto 4000 ip from any to any
767
768ipfw add      divert 1000 ip from any to any
769ipfw add      allow ip from any to any
770
771ipfw add 3000 count ip from any to any
772
773ipfw add      divert 2000 ip from any to any
774ipfw add      allow ip from any to any
775
776ipfw add 4000 count ip from any to any
777
778ipfw add      divert 2000 ip from any to any
779
780ipfw add 5000 fwd 2.3.4.1 ip from 2.3.4.5 to not 2.3.4.0/24
781ipfw add      allow ip from any to any
782.Ed
783.Pp
784Here the packet from internal network to Internet goes out via
785.Ql sis0
786(rule number 2000) and gets caught by the
787.Ic globalport
788socket (3000).
789After that, either a match is found in a translation table
790of one of the two instances, or the packet is passed to one
791of the two other
792.Xr divert 4
793ports (1000 or 2000), with equal probability.
794This ensures that load balancing is done on a per-flow basis
795(i.e., packets from a single TCP connection always flow through the
796same interface).
797Translated packets with source IP of a non-default interface
798.Pq Ql sis2
799are forwarded to the appropriate router on that interface.
800.Sh SEE ALSO
801.Xr libalias 3 ,
802.Xr divert 4 ,
803.Xr protocols 5 ,
804.Xr rc.conf 5 ,
805.Xr services 5 ,
806.Xr syslog.conf 5 ,
807.Xr init 8 ,
808.Xr ipfw 8 ,
809.Xr ppp 8
810.Sh HISTORY
811The
812.Nm
813utility appeared in
814.Fx 3.0 .
815.Sh AUTHORS
816This program is the result of the efforts of many people at different
817times:
818.Pp
819.An Archie Cobbs Aq Mt archie@FreeBSD.org
820(divert sockets)
821.An Charles Mott Aq Mt cm@linktel.net
822(packet aliasing)
823.An Eivind Eklund Aq Mt perhaps@yes.no
824(IRC support & misc additions)
825.An Ari Suutari Aq Mt suutari@iki.fi
826(natd)
827.An Dru Nelson Aq Mt dnelson@redwoodsoft.com
828(early PPTP support)
829.An Brian Somers Aq Mt brian@awfulhak.org
830(glue)
831.An Ruslan Ermilov Aq Mt ru@FreeBSD.org
832(natd, packet aliasing, glue)
833.An Poul-Henning Kamp Aq Mt phk@FreeBSD.org
834(multiple instances)
835