| .TH IPNAT 5 | 
 | .SH NAME | 
 | ipnat, ipnat.conf \- IP NAT file format | 
 | .SH DESCRIPTION | 
 | The format for files accepted by ipnat is described by the following grammar: | 
 | .LP | 
 | .nf | 
 | ipmap :: = mapblock | redir | map . | 
 |  | 
 | map ::= mapit ifname lhs "->" dstipmask [ mapicmp | mapport | mapproxy ] | 
 |         mapoptions . | 
 | mapblock ::= "map-block" ifname lhs "->" ipmask [ ports ] mapoptions . | 
 | redir ::= "rdr" ifname rlhs "->" ip [ "," ip ] rdrport rdroptions . | 
 |  | 
 | lhs ::= ipmask | fromto . | 
 | rlhs ::= ipmask dport | fromto . | 
 | dport ::= "port" portnum [ "-" portnum ] . | 
 | ports ::= "ports" numports | "auto" . | 
 | rdrport ::= "port" portnum . | 
 | mapit ::= "map" | "bimap" . | 
 | fromto ::= "from" object "to" object . | 
 | ipmask ::= ip "/" bits | ip "/" mask | ip "netmask" mask . | 
 | dstipmask ::= ipmask | "range" ip "-" ip . | 
 | mapicmp ::= "icmpidmap" "icmp" number ":" number . | 
 | mapport ::= "portmap" tcpudp portspec . | 
 | mapoptions ::= [ tcpudp ] [ "frag" ] [ age ] [ clamp ] . | 
 | rdroptions ::= rdrproto [ rr ] [ "frag" ] [ age ] [ clamp ] [ rdrproxy ] . | 
 |  | 
 | object :: = addr [ port-comp | port-range ] . | 
 | addr :: = "any" | nummask | host-name [ "mask" ipaddr | "mask" hexnumber ] . | 
 | port-comp :: = "port" compare port-num . | 
 | port-range :: = "port" port-num range port-num . | 
 | rdrproto ::= tcpudp | protocol . | 
 |  | 
 | rr ::= "round-robin" . | 
 | age ::= "age" decnumber [ "/" decnumber ] . | 
 | clamp ::= "mssclamp" decnumber . | 
 | tcpudp ::= "tcp/udp" | protocol . | 
 | mapproxy ::= "proxy" "port" port proxy-name '/' protocol | 
 | rdrproxy ::= "proxy" proxy-name . | 
 |  | 
 | protocol ::= protocol-name | decnumber . | 
 | nummask ::= host-name [ "/" decnumber ] . | 
 | portspec ::= "auto" | portnumber ":" portnumber . | 
 | port ::= portnumber | port-name . | 
 | portnumber ::= number { numbers } . | 
 | ifname ::= 'A' - 'Z' { 'A' - 'Z' } numbers . | 
 |  | 
 | numbers ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' . | 
 | .fi | 
 | .PP | 
 | For standard NAT functionality, a rule should start with \fBmap\fP and then | 
 | proceeds to specify the interface for which outgoing packets will have their | 
 | source address rewritten. | 
 | .PP | 
 | Packets which will be rewritten can only be selected by matching the original | 
 | source address.  A netmask must be specified with the IP address. | 
 | .PP | 
 | The address selected for replacing the original is chosen from an IP#/netmask | 
 | pair.  A netmask of all 1's indicating a hostname is valid.  A netmask of | 
 | 31 1's (255.255.255.254) is considered invalid as there is no space for | 
 | allocating host IP#'s after consideration for broadcast and network | 
 | addresses. | 
 | .PP | 
 | When remapping TCP and UDP packets, it is also possible to change the source | 
 | port number.  Either TCP or UDP or both can be selected by each rule, with a | 
 | range of port numbers to remap into given as \fBport-number:port-number\fP. | 
 | .SH COMMANDS | 
 | There are four commands recognised by IP Filter's NAT code: | 
 | .TP | 
 | .B map | 
 | that is used for mapping one address or network to another in an unregulated | 
 | round robin fashion; | 
 | .TP | 
 | .B rdr | 
 | that is used for redirecting packets to one IP address and port pair to | 
 | another; | 
 | .TP | 
 | .B bimap | 
 | for setting up bidirectional NAT between an external IP address and an internal | 
 | IP address and | 
 | .TP | 
 | .B map-block | 
 | which sets up static IP address based translation, based on a algorithm to | 
 | squeeze the addresses to be translated into the destination range. | 
 | .SH MATCHING | 
 | .PP | 
 | For basic NAT and redirection of packets, the address subject to change is used | 
 | along with its protocol to check if a packet should be altered.  The packet | 
 | \fImatching\fP part of the rule is to the left of the "->" in each rule. | 
 | .PP | 
 | Matching of packets has now been extended to allow more complex compares. | 
 | In place of the address which is to be translated, an IP address and port | 
 | number comparison can be made using the same expressions available with | 
 | \fBipf\fP.  A simple NAT rule could be written as: | 
 | .LP | 
 | .nf | 
 | map de0 10.1.0.0/16 -> 201.2.3.4/32 | 
 | .fi | 
 | .LP | 
 | or as | 
 | .LP | 
 | .nf | 
 | map de0 from 10.1.0.0/16 to any -> 201.2.3.4/32 | 
 | .fi | 
 | .LP | 
 | Only IP address and port numbers can be compared against.  This is available | 
 | with all NAT rules. | 
 | .SH TRANSLATION | 
 | .PP | 
 | To the right of the "->" is the address and port specification which will be | 
 | written into the packet providing it has already successfully matched the | 
 | prior constraints.  The case of redirections (\fBrdr\fP) is the simplest: | 
 | the new destination address is that specified in the rule.  For \fBmap\fP | 
 | rules, the destination address will be one for which the tuple combining | 
 | the new source and destination is known to be unique.  If the packet is | 
 | either a TCP or UDP packet, the destination and source ports come into the | 
 | equation too.  If the tuple already exists, IP Filter will increment the | 
 | port number first, within the available range specified with \fBportmap\fP | 
 | and if there exists no unique tuple, the source address will be incremented | 
 | within the specified netmask.  If a unique tuple cannot be determined, then | 
 | the packet will not be translated.  The \fBmap-block\fP is more limited in | 
 | how it searches for a new, free and unique tuple, in that it will used an | 
 | algorithm to determine what the new source address should be, along with the | 
 | range of available ports - the IP address is never changed and nor does the | 
 | port number ever exceed its allotted range. | 
 | .SH ICMPIDMAP | 
 | .PP | 
 | ICMP messages can be divided into two groups: "errors" and "queries". ICMP | 
 | errors are generated as a response of another IP packet. IP Filter will take | 
 | care that ICMP errors that are the response of a NAT-ed IP packet are | 
 | handled properly. | 
 | .PP | 
 | For 4 types of ICMP queries (echo request, timestamp request, information | 
 | request and address mask request) IP Filter supports an additional mapping | 
 | called "ICMP id mapping". All these 4 types of ICMP queries use a unique | 
 | identifier called the ICMP id. This id is set by the process sending the | 
 | ICMP query and it is usually equal to the process id. The receiver of the | 
 | ICMP query will use the same id in its response, thus enabling the | 
 | sender to recognize that the incoming ICMP reply is intended for him and is | 
 | an answer to a query that he made. The "ICMP id mapping" feature modifies | 
 | these ICMP id in a way identical to \fBportmap\fP for TCP or UDP. | 
 | .PP | 
 | The reason that you might want this, is that using this feature you don't | 
 | need an IP address per host behind the NAT box, that wants to do ICMP queries. | 
 | The two numbers behind the \fBicmpidmap\fP keyword are the first and the | 
 | last icmp id number that can be used. There is one important caveat: if you | 
 | map to an IP address that belongs to the NAT box itself (notably if you have | 
 | only a single public IP address), then you must ensure that the NAT box does | 
 | not use the \fBicmpidmap\fP range that you specified in the \fBmap\fP rule. | 
 | Since the ICMP id is usually the process id, it is wise to restrict the | 
 | largest permittable process id (PID) on your operating system to e.g. 63999 and | 
 | use the range 64000:65535 for ICMP id mapping. Changing the maximal PID is | 
 | system dependent. For most BSD derived systems can be done by changing | 
 | PID_MAX in /usr/include/sys/proc.h and then rebuild the system. | 
 | .SH KERNEL PROXIES | 
 | .PP | 
 | IP Filter comes with a few, simple, proxies built into the code that is loaded | 
 | into the kernel to allow secondary channels to be opened without forcing the | 
 | packets through a user program.  The current state of the proxies is listed | 
 | below, as one of three states: | 
 | .HP | 
 | Aging - protocol is roughly understood from | 
 | the time at which the proxy was written but it is not well tested or | 
 | maintained; | 
 | .HP | 
 | Developmental - basic functionality exists, works most of the time but | 
 | may be problematic in extended real use; | 
 | .HP | 
 | Experimental - rough support for the protocol at best, may or may not | 
 | work as testing has been at best sporadic, possible large scale changes | 
 | to the code in order to properly support the protocol. | 
 | .HP | 
 | Mature - well tested, protocol is properly | 
 | understood by the proxy; | 
 | .PP | 
 | The currently compiled in proxy list is as follows: | 
 | .HP | 
 | FTP - Mature | 
 | .HP | 
 | IRC - Experimental | 
 | .HP | 
 | rpcbind - Experimental | 
 | .HP | 
 | H.323 - Experimental | 
 | .HP | 
 | Real Audio (PNA) - Aging | 
 | .HP | 
 | IPsec - Developmental | 
 | .HP | 
 | netbios - Experimental | 
 | .HP | 
 | R-command - Mature | 
 |  | 
 | .SH TRANSPARENT PROXIES | 
 | .PP | 
 | True transparent proxying should be performed using the redirect (\fBrdr\fP) | 
 | rules directing ports to localhost (127.0.0.1) with the proxy program doing | 
 | a lookup through \fB/dev/ipnat\fP to determine the real source and address | 
 | of the connection. | 
 | .SH LOAD-BALANCING | 
 | .PP | 
 | Two options for use with \fBrdr\fP are available to support primitive, | 
 | \fIround-robin\fP based load balancing.  The first option allows for a | 
 | \fBrdr\fP to specify a second destination, as follows: | 
 | .LP | 
 | .nf | 
 | rdr le0 203.1.2.3/32 port 80 -> 203.1.2.3,203.1.2.4 port 80 tcp | 
 | .fi | 
 | .LP | 
 | This would send alternate connections to either 203.1.2.3 or 203.1.2.4. | 
 | In scenarios where the load is being spread amongst a larger set of | 
 | servers, you can use: | 
 | .LP | 
 | .nf | 
 | rdr le0 203.1.2.3/32 port 80 -> 203.1.2.3,203.1.2.4 port 80 tcp round-robin | 
 | rdr le0 203.1.2.3/32 port 80 -> 203.1.2.5 port 80 tcp round-robin | 
 | .fi | 
 | .LP | 
 | In this case, a connection will be redirected to 203.1.2.3, then 203.1.2.4 | 
 | and then 203.1.2.5 before going back to 203.1.2.3.  In accomplishing this, | 
 | the rule is removed from the top of the list and added to the end, | 
 | automatically, as required.  This will not effect the display of rules | 
 | using "ipnat -l", only the internal application order. | 
 | .SH EXAMPLES | 
 | .PP | 
 | This section deals with the \fBmap\fP command and its variations. | 
 | .PP | 
 | To change IP#'s used internally from network 10 into an ISP provided 8 bit | 
 | subnet at 209.1.2.0 through the ppp0 interface, the following would be used: | 
 | .LP | 
 | .nf | 
 | map ppp0 10.0.0.0/8 -> 209.1.2.0/24 | 
 | .fi | 
 | .PP | 
 | The obvious problem here is we're trying to squeeze over 16,000,000 IP | 
 | addresses into a 254 address space.  To increase the scope, remapping for TCP | 
 | and/or UDP, port remapping can be used; | 
 | .LP | 
 | .nf | 
 | map ppp0 10.0.0.0/8 -> 209.1.2.0/24 portmap tcp/udp 1025:65000 | 
 | .fi | 
 | .PP | 
 | which falls only 527,566 `addresses' short of the space available in network | 
 | 10.  If we were to combine these rules, they would need to be specified as | 
 | follows: | 
 | .LP | 
 | .nf | 
 | map ppp0 10.0.0.0/8 -> 209.1.2.0/24 portmap tcp/udp 1025:65000 | 
 | map ppp0 10.0.0.0/8 -> 209.1.2.0/24 | 
 | .fi | 
 | .PP | 
 | so that all TCP/UDP packets were port mapped and only other protocols, such as | 
 | ICMP, only have their IP# changed.  In some instances, it is more appropriate | 
 | to use the keyword \fBauto\fP in place of an actual range of port numbers if | 
 | you want to guarantee simultaneous access to all within the given range. | 
 | However, in the above case, it would default to 1 port per IP address, since | 
 | we need to squeeze 24 bits of address space into 8.  A good example of how | 
 | this is used might be: | 
 | .LP | 
 | .nf | 
 | map ppp0 172.192.0.0/16 -> 209.1.2.0/24 portmap tcp/udp auto | 
 | .fi | 
 | .PP | 
 | which would result in each IP address being given a small range of ports to | 
 | use (252).  In all cases, the new port number that is used is deterministic. | 
 | That is, port X will always map to port Y. | 
 | WARNING: It is not advisable to use the \fBauto\fP feature if you are map'ing | 
 | to a /32 (i.e. 0/32) because the NAT code will try to map multiple hosts to | 
 | the same port number, outgoing and ultimately this will only succeed for one | 
 | of them. | 
 | The problem here is that the \fBmap\fP directive tells the NAT | 
 | code to use the next address/port pair available for an outgoing connection, | 
 | resulting in no easily discernible relation between external addresses/ports | 
 | and internal ones.  This is overcome by using \fBmap-block\fP as follows: | 
 | .LP | 
 | .nf | 
 | map-block ppp0 172.192.0.0/16 -> 209.1.2.0/24 ports auto | 
 | .fi | 
 | .PP | 
 | For example, this would result in 172.192.0.0/24 being mapped to 209.1.2.0/32 | 
 | with each address, from 172.192.0.0 to 172.192.0.255 having 252 ports of its | 
 | own.  As opposed to the above use of \fBmap\fP, if for some reason the user | 
 | of (say) 172.192.0.2 wanted 260 simultaneous connections going out, they would | 
 | be limited to 252 with \fBmap-block\fP but would just \fImove on\fP to the next | 
 | IP address with the \fBmap\fP command. | 
 | /dev/ipnat | 
 | .br | 
 | /etc/services | 
 | .br | 
 | /etc/hosts | 
 | .SH SEE ALSO | 
 | ipnat(4), hosts(5), ipf(5), services(5), ipf(8), ipnat(8) |