1de97d73dSBrian SomersCopyright (c) 2001 Charles Mott <cm@linktel.net> 2057fee78SBrian SomersAll rights reserved. 3057fee78SBrian Somers 4057fee78SBrian SomersRedistribution and use in source and binary forms, with or without 5057fee78SBrian Somersmodification, are permitted provided that the following conditions 6057fee78SBrian Somersare met: 7057fee78SBrian Somers1. Redistributions of source code must retain the above copyright 8057fee78SBrian Somers notice, this list of conditions and the following disclaimer. 9057fee78SBrian Somers2. Redistributions in binary form must reproduce the above copyright 10057fee78SBrian Somers notice, this list of conditions and the following disclaimer in the 11057fee78SBrian Somers documentation and/or other materials provided with the distribution. 12057fee78SBrian Somers 13057fee78SBrian SomersTHIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14057fee78SBrian SomersANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15057fee78SBrian SomersIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16057fee78SBrian SomersARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17057fee78SBrian SomersFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18057fee78SBrian SomersDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19057fee78SBrian SomersOR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20057fee78SBrian SomersHOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21057fee78SBrian SomersLIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22057fee78SBrian SomersOUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23057fee78SBrian SomersSUCH DAMAGE. 24057fee78SBrian Somers 25057fee78SBrian SomersUser PPP NAT (Packet Aliasing) 26a9f484e5SJordan K. Hubbard 276db75539SBrian Somers 286db75539SBrian Somers 29a9f484e5SJordan K. Hubbard0. Contents 30a9f484e5SJordan K. Hubbard 1. Background 31a9f484e5SJordan K. Hubbard 2. Setup 326db75539SBrian Somers 3. New commands in ppp 336db75539SBrian Somers 4. Future Work 3405dbe14bSBrian Somers 5. Authors / Acknowledgements 356db75539SBrian Somers 6. Revision History for Aliasing Code 366db75539SBrian Somers 37a9f484e5SJordan K. Hubbard 38a9f484e5SJordan K. Hubbard 39a9f484e5SJordan K. Hubbard1. Background 40a9f484e5SJordan K. Hubbard 41057fee78SBrian SomersUser mode ppp has embedded NAT (Network Address Translation) code. 42057fee78SBrian SomersEnabling this, either by the "-nat" command line option or the 43057fee78SBrian Somers"nat enable yes" command in a ppp.conf file, makes the ppp host 44057fee78SBrian Somersautomatically NAT IP packets forwarded from a local network, making 456db75539SBrian Somersthem appear to come from the ppp host machine. Incoming packets 46057fee78SBrian Somersfrom the outside world are then appropriately de-NAT'd. 47a9f484e5SJordan K. Hubbard 48057fee78SBrian SomersThe process of NAT'ing involves both the IP address and the TCP or UDP 49057fee78SBrian Somersport numbers. ICMP echo and timestamp packets are natted by their id 506db75539SBrian Somersnumbers. ICMP error messages can be properly directed by examining the 516db75539SBrian Somersfragment of the offending packet which is contained in the body of the 526db75539SBrian Somersmessage. 53a9f484e5SJordan K. Hubbard 54a9f484e5SJordan K. HubbardThis software was specifically meant to support users who have 556db75539SBrian Somersunregistered, private address IP networks (e.g. 192.168.0.x or 10.0.0.x 566db75539SBrian Somersaddresses). The ppp host can act as a gateway for these networks, and 576db75539SBrian Somerscomputers on the local area net will have some degree of Internet access 586db75539SBrian Somerswithout the need for a registered IP address. Additionally, there will 596db75539SBrian Somersbe no need for an Internet service provider to maintain routing tables 606db75539SBrian Somersfor the local area network. 61a9f484e5SJordan K. Hubbard 62057fee78SBrian SomersA disadvantage of NAT is that machines on the local network, 636db75539SBrian Somersbehind the ppp host, are not visible from the outside world. They can 646db75539SBrian Somersestablish TCP connections and make UDP inquiries (such as domain name 656db75539SBrian Somersservice requests) but the connections seem to come from the ppp host 666db75539SBrian Somersitself. There is, in effect, a partial firewall. Of course, if this is 676db75539SBrian Somerswhat you want, the disadvantage becomes an advantage. 68a9f484e5SJordan K. Hubbard 696db75539SBrian SomersA second disadvantage is that "IP encoding" protocols, which send IP 706db75539SBrian Somersaddress or port information within the data stream, are not supported 716db75539SBrian Somersfor the cases where exception code exists. This implementation has 726db75539SBrian Somersworkarounds for FTP and IRC DCC, the most well known of the IP encoding 736db75539SBrian Somersprotocols. This frees users from depending on using the ftp passive 746db75539SBrian Somersmode and avoiding IRC DCC sends, as is sometimes the case with other 756db75539SBrian Somersmasquerading solutions. 76a9f484e5SJordan K. Hubbard 776db75539SBrian SomersThe implementation supports all standard, non-encoding TCP and UDP protocols. 786db75539SBrian SomersExamples of these protocols are http, gopher and telnet. The standard UDP 7905dbe14bSBrian Somersmode of Real-Audio is not presently supported, but the TCP mode does work 806db75539SBrian Somerscorrectly. 81a9f484e5SJordan K. Hubbard 82057fee78SBrian SomersThe NAT code also handles many ICMP messages. In particular, 836db75539SBrian Somersping and traceroute are supported. 84a9f484e5SJordan K. Hubbard 85a9f484e5SJordan K. Hubbard 86a9f484e5SJordan K. Hubbard 87a9f484e5SJordan K. Hubbard2. Packet Aliasing Setup 88a9f484e5SJordan K. Hubbard 896db75539SBrian SomersIt is recommended that users first verify correct ppp operation without 90057fee78SBrian SomersNAT enabled. This will confirm that the ppp.conf file is 916db75539SBrian Somersproperly set up and that there are no ppp problems. Then start ppp with 92057fee78SBrian Somersthe "-nat" option on the command line. The user should verify that 93057fee78SBrian Somersthe ppp host can correctly connect to the Internet in NAT 946db75539SBrian Somersmode. Finally, check that machines on the private network can access 956db75539SBrian Somersthe Internet. 96a9f484e5SJordan K. Hubbard 97057fee78SBrian SomersThe NAT software handles all packets, whether they come from 986db75539SBrian Somersthe host or another computer on the local area network. Thus, a correctly 996db75539SBrian Somersoperating ppp host indicates that the software should work properly for 1006db75539SBrian Somersother computers on the private network. 101a9f484e5SJordan K. Hubbard 1026db75539SBrian SomersIf the ppp host can access the Internet, but other computers on the local 1036db75539SBrian Somersnetwork cannot, check that IP forwarding is enabled on the ppp host. Also, 1046db75539SBrian Somersverify that the other computers use this machine as a gateway. Of course, 1056db75539SBrian Somersyou should also verify that machines within the local area network 1066db75539SBrian Somerscommunicate properly. A common error is inconsistent subnet addresses 1076db75539SBrian Somersand masks. 108a9f484e5SJordan K. Hubbard 109a9f484e5SJordan K. Hubbard 110a9f484e5SJordan K. Hubbard 1116db75539SBrian Somers3. New commands in ppp 112a9f484e5SJordan K. Hubbard 113057fee78SBrian SomersIn order to control NAT behaviour in a simple manner (no need for 114057fee78SBrian Somersrecompilation), a new command has been added to ppp: nat. This 115057fee78SBrian Somersis in addition to the -nat command line option. System managers and 11605dbe14bSBrian Somersmore experienced users may prefer to use the ppp command syntax 117057fee78SBrian Somerswithin the ppp.conf file. The nat command also allows NAT 11805dbe14bSBrian Somersbehaviour to be more precisely specified. 119a9f484e5SJordan K. Hubbard 1206db75539SBrian SomersThe decision to add a command instead of extending 'set' or 'option' was 121057fee78SBrian Somersto make obvious that these options only work when NAT is enabled. 122a9f484e5SJordan K. Hubbard 123057fee78SBrian SomersThe syntax for 'nat' is 124a9f484e5SJordan K. Hubbard 125057fee78SBrian Somers ppp> nat option [yes|no] 126a9f484e5SJordan K. Hubbard 1276db75539SBrian Somerswhere option is given by one of the following templates. 1286db75539SBrian Somers 1296db75539SBrian Somers 130057fee78SBrian Somers - nat enable [yes|no] (default no) 1316db75539SBrian Somers 132057fee78SBrian SomersEnable NAT functionality. If disabled, no other NAT 133057fee78SBrian Somersoptions will have any effect. You should usually enable NAT 1346db75539SBrian Somersbefore routing any packets over the link; good points are in the 1356db75539SBrian Somersinitial script or right before adding a route. If you do not always 136057fee78SBrian Somerswant NAT, consider using the -nat option to ppp instead of this 1376db75539SBrian Somerscommand. 1386db75539SBrian Somers 1396db75539SBrian Somers 140057fee78SBrian Somers - nat deny_incoming [yes|no] (default yes) 1416db75539SBrian Somers 1426db75539SBrian SomersSet to "yes" to disable all incoming connections. This just drops 143057fee78SBrian Somersconnections to, for example, ftp, telnet or web servers. The NAT 1446db75539SBrian Somersmechanism prevents these connections. Technically, this option denies 145057fee78SBrian Somersall incoming TCP and UDP requests, making the NAT software a 14605dbe14bSBrian Somersfairly efficient one-way firewall. The default is no, which will allow 1476db75539SBrian Somersall incoming connections to telnetd, ftpd, etc. 1486db75539SBrian Somers 1496db75539SBrian Somers 150057fee78SBrian Somers - nat log [yes|no] 1516db75539SBrian Somers 152057fee78SBrian SomersControls logging of NAT link creation to "/var/log/alias.log" - this 1536db75539SBrian Somersis usually only useful if debugging a setup, to see if the bug is in 154057fee78SBrian Somersthe PPP NATing. The debugging information is fairly limited, listing 155057fee78SBrian Somersthe number of NAT links open for different protocols. 1566db75539SBrian Somers 1576db75539SBrian Somers 158057fee78SBrian Somers - nat same_ports [yes|no] (default yes) 1596db75539SBrian Somers 160057fee78SBrian SomersWhen a connection is being established going through the NAT 1616db75539SBrian Somersroutines, it will normally have its port number changed to allow the 162057fee78SBrian SomersNAT code to track it. If same_ports is enabled, the NAT 1636db75539SBrian Somerssoftware attempts to keep the connection's source port unchanged. 16405dbe14bSBrian SomersThis will allow rsh, RPC and other specialised protocols to work 1656db75539SBrian Somers_most of the time_, at least on the host machine. Please, do not 1666db75539SBrian Somersreport this being unstable as a bug - it is a result of the way 167057fee78SBrian SomersNAT has to work. TCP/IP was intended to have one IP address 1686db75539SBrian Somersper machine. 1696db75539SBrian Somers 1706db75539SBrian Somers 171057fee78SBrian Somers - nat use_sockets [yes|no] (default yes) 1726db75539SBrian Somers 173057fee78SBrian SomersThis is a fairly obscure option. For the most part, the NAT 174057fee78SBrian Somerssoftware does not have to allocate system sockets when it chooses a 175057fee78SBrian SomersNAT port number. Under very specific circumstances, FTP data 17605dbe14bSBrian Somersconnections (which don't know the remote port number, though it is 1776db75539SBrian Somersusually 20) and IRC DCC send (which doesn't know either the address or 1786db75539SBrian Somersthe port from which the connection will come), there can potentially be 1796db75539SBrian Somerssome interference with an open server socket having the same port number 18005dbe14bSBrian Somerson the ppp host machine. This possibility for interference only exists 1816db75539SBrian Somersuntil the TCP connection has been acknowledged on both sides. The safe 1826db75539SBrian Somersoption is yes, though fewer system resources are consumed by specifying 1836db75539SBrian Somersno. 1846db75539SBrian Somers 1856db75539SBrian Somers 186057fee78SBrian Somers - nat unregistered_only [yes|no] (default no) 1876db75539SBrian Somers 188057fee78SBrian SomersNAT normally remaps all packets coming from the local area 1896db75539SBrian Somersnetwork to the ppp host machine address. Set this option to only map 1906db75539SBrian Somersaddresses from the following standard ranges for private, unregistered 1916db75539SBrian Somersaddresses: 1926db75539SBrian Somers 1936db75539SBrian Somers 10.0.0.0 -> 10.255.255.255 1946db75539SBrian Somers 172.16.0.0 -> 172.31.255.255 1956db75539SBrian Somers 192.168.0.0 -> 192.168.255.255 */ 1966db75539SBrian Somers 1976db75539SBrian SomersIn the instance that there is a subnet of public addresses and another 1986db75539SBrian Somerssubnet of private addresses being routed by the ppp host, then only the 199057fee78SBrian Somerspackets on the private subnet will be NAT'd. 2006db75539SBrian Somers 2016db75539SBrian Somers 202057fee78SBrian Somers- nat port <proto> <local addr>:<port> <nat port> 2036db75539SBrian Somers 204057fee78SBrian SomersThis command allows incoming traffic to <nat port> on the host 2056db75539SBrian Somersmachine to be redirected to a specific machine and port on the 2066db75539SBrian Somerslocal area network. One example of this would be: 2076db75539SBrian Somers 208057fee78SBrian Somers nat port tcp 192.168.0.4:telnet 8066 2096db75539SBrian Somers 21005dbe14bSBrian SomersAll traffic to port 8066 of the ppp host would then be sent to 2116db75539SBrian Somersthe telnet port (23) of machine 192.168.0.4. Port numbers 2126db75539SBrian Somerscan either be designated numerically or by symbolic names 2136db75539SBrian Somerslisted in /etc/services. Similarly, addresses can be either 2146db75539SBrian Somersin dotted quad notation or in /etc/hosts. 2156db75539SBrian Somers 2166db75539SBrian Somers 217057fee78SBrian Somers- nat addr <local addr> <public addr> 2186db75539SBrian Somers 2196db75539SBrian SomersThis command allows traffic for a public IP address to be 2206db75539SBrian Somersredirected to a machine on the local network. This function 2216db75539SBrian Somersis known as "static NAT". An address assignment of 0 refers 2226db75539SBrian Somersto the default address of the ppp host. Normally static 2236db75539SBrian SomersNAT is useful if your ISP has allocated a small block of 2246db75539SBrian SomersIP addresses to the user, but it can even be used in the 2256db75539SBrian Somerscase of a single, dynamically allocated IP address: 2266db75539SBrian Somers 227057fee78SBrian Somers nat addr 10.0.0.8 0 2286db75539SBrian Somers 2296db75539SBrian SomersThe above command would redirect all incoming traffic to 2306db75539SBrian Somersmachine 10.0.0.8. 2316db75539SBrian Somers 232057fee78SBrian SomersIf several address NATs specify the same public address 2336db75539SBrian Somersas follows 2346db75539SBrian Somers 235057fee78SBrian Somers nat addr 192.168.0.2 public_addr 236057fee78SBrian Somers nat addr 192.168.0.3 public_addr 237057fee78SBrian Somers nat addr 192.168.0.4 public_addr 2386db75539SBrian Somers 23905dbe14bSBrian Somersthen incoming traffic will be directed to the last 2406db75539SBrian Somerstranslated local address (192.168.0.4), but outgoing 241057fee78SBrian Somerstraffic to the first two addresses will still be NAT'd 2426db75539SBrian Somersto the specified public address. 2436db75539SBrian Somers 2446db75539SBrian Somers 2456db75539SBrian Somers 2466db75539SBrian Somers4. Future Work 2476db75539SBrian Somers 248057fee78SBrian SomersWhat is called NAT here has been variously called masquerading, packet 249057fee78SBrian Somersaliasing and transparent proxying by others. It is an extremely useful 250057fee78SBrian Somersfunction to many users, but it is also necessarily imperfect. The 251057fee78SBrian Somersoccasional IP-encoding protocols always need workarounds (hacks). 252057fee78SBrian SomersUsers who are interested in supporting new IP-encoding protocols 2536db75539SBrian Somerscan follow the examples of alias_ftp.c and alias_irc.c. 2546db75539SBrian Somers 2556db75539SBrian SomersICMP error messages are currently handled only in the incoming direction. 256057fee78SBrian SomersA handler needs to be added to correctly NAT outgoing error messages. 2576db75539SBrian Somers 2586db75539SBrian SomersIRC and FTP exception handling make reasonable, though not strictly correct 2596db75539SBrian Somersassumptions, about how IP encoded messages will appear in the control 2606db75539SBrian Somersstream. Programmers may wish to consider how to make this process more 2616db75539SBrian Somersrobust. 2626db75539SBrian Somers 263057fee78SBrian SomersThe NAT engine (alias.c, alias_db.c, alias_ftp.c, alias_irc.c 2646db75539SBrian Somersand alias_util.c) runs in user space, and is intended to be both portable 2656db75539SBrian Somersand reusable for interfaces other than ppp. To access the basic engine 26605dbe14bSBrian Somersonly requires four simple function calls (initialisation, communication of 267057fee78SBrian Somershost address, outgoing NAT and incoming de-NATing). 2686db75539SBrian Somers 2696db75539SBrian Somers 2706db75539SBrian Somers 27105dbe14bSBrian Somers5. Authors / Acknowledgements 2726db75539SBrian Somers 273de97d73dSBrian SomersCharles Mott (cm@linktel.net) <versions 1.0 - 1.8, 2.0, 2.1> 2746db75539SBrian SomersEivind Eklund (perhaps@yes.no) <versions 1.8b - 1.9, new ppp commands> 2756db75539SBrian Somers 2766db75539SBrian SomersListed below, in chronological order, are individuals who have provided 2776db75539SBrian Somersvaluable comments and/or debugging assistance. 2786db75539SBrian Somers 2796db75539SBrian Somers Gary Roberts 2806db75539SBrian Somers Tom Torrance 2816db75539SBrian Somers Reto Burkhalter 2826db75539SBrian Somers Martin Renters 2836db75539SBrian Somers Brian Somers 2846db75539SBrian Somers Paul Traina 2856db75539SBrian Somers Ari Suutari 2866db75539SBrian Somers J. Fortes 2876db75539SBrian Somers Andrzej Bialeki 2886db75539SBrian Somers 2896db75539SBrian Somers 2906db75539SBrian Somers 2916db75539SBrian Somers6. Revision History for Aliasing Code 2926db75539SBrian Somers 2936db75539SBrian SomersVersion 1.0: August 11, 1996 (cjm) 2946db75539SBrian Somers 2956db75539SBrian SomersVersion 1.1: August 20, 1996 (cjm) 2966db75539SBrian Somers PPP host accepts incoming connections for ports 0 to 1023. 2976db75539SBrian Somers 2986db75539SBrian SomersVersion 1.2: September 7, 1996 (cjm) 2996db75539SBrian Somers Fragment handling error in alias_db.c corrected. 3006db75539SBrian Somers 3016db75539SBrian SomersVersion 1.3: September 15, 1996 (cjm) 30205dbe14bSBrian Somers - Generalised mechanism for handling incoming connections 3036db75539SBrian Somers (no more 0 to 1023 restriction). 3046db75539SBrian Somers - Increased ICMP support (will handle traceroute now). 3056db75539SBrian Somers - Improved TCP close connection logic. 3066db75539SBrian Somers 3076db75539SBrian SomersVersion 1.4: September 16, 1996 3086db75539SBrian Somers Can't remember (this version only lasted a day -- cjm). 3096db75539SBrian Somers 3106db75539SBrian SomersVersion 1.5: September 17, 1996 (cjm) 3116db75539SBrian Somers Corrected error in handling incoming UDP packets 3126db75539SBrian Somers with zero checksum. 3136db75539SBrian Somers 3146db75539SBrian SomersVersion 1.6: September 18, 1996 3156db75539SBrian Somers Simplified ICMP data storage. Will now handle 3166db75539SBrian Somers tracert from Win95 as well as FreeBSD traceroute. 3176db75539SBrian Somers 31805dbe14bSBrian SomersVersion 1.7: January 9, 1997 (cjm) 3196db75539SBrian Somers - Reduced malloc() activity for ICMP echo and 3206db75539SBrian Somers timestamp requests. 3216db75539SBrian Somers - Added handling for out-of-order IP fragments. 3226db75539SBrian Somers - Switched to differential checksum computation 3236db75539SBrian Somers for IP headers (TCP, UDP and ICMP checksums 3246db75539SBrian Somers were already differential). 3256db75539SBrian Somers - Accepts FTP data connections from other than 3266db75539SBrian Somers port 20. This allows one ftp connections 3276db75539SBrian Somers from two hosts which are both running packet 3286db75539SBrian Somers aliasing. 3296db75539SBrian Somers 33005dbe14bSBrian SomersVersion 1.8: January 14, 1997 (cjm) 3316db75539SBrian Somers - Fixed data type error in function StartPoint() 3326db75539SBrian Somers in alias_db.c (this bug did not exist before v1.7) 3336db75539SBrian Somers 3346db75539SBrian SomersVersion 1.8b: January 16, 1997 (Eivind Eklund <perhaps@yes.no>) 3356db75539SBrian Somers - Upgraded base PPP version to be the source code from 3366db75539SBrian Somers FreeBSD 2.1.6, with additional security patches. This 3376db75539SBrian Somers version should still be possible to run on 2.1.5, though - 3386db75539SBrian Somers I've run it with a 2.1.5 kernel without problems. 3396db75539SBrian Somers (Update done with the permission of cjm) 3406db75539SBrian Somers 3416db75539SBrian SomersVersion 1.9: February 1, 1997 (Eivind Eklund <perhaps@yes.no>) 3426db75539SBrian Somers - Added support for IRC DCC (ee) 3436db75539SBrian Somers - Changed the aliasing routines to use ANSI style throughout - 3446db75539SBrian Somers minor API changes for integration with other programs than PPP (ee) 3456db75539SBrian Somers - Changed the build process, making all options switchable 3466db75539SBrian Somers from the Makefile (ee) 3476db75539SBrian Somers - Fixed minor security hole in alias_ftp.c for other applications 3486db75539SBrian Somers of the aliasing software. Hole could _not_ manifest in 3496db75539SBrian Somers PPP+pktAlias, but could potentially manifest in other 3506db75539SBrian Somers applications of the aliasing. (ee) 3516db75539SBrian Somers - Connections initiated from packet aliasing host machine will 3526db75539SBrian Somers not have their port number aliased unless it conflicts with 3536db75539SBrian Somers an aliasing port already being used. (There is an option to 3546db75539SBrian Somers disable this for debugging) (cjm) 3556db75539SBrian Somers - Sockets will be allocated in cases where there might be 3566db75539SBrian Somers port interference with the host machine. This can be disabled 3576db75539SBrian Somers in cases where the ppp host will be acting purely as a 3586db75539SBrian Somers masquerading router and not generate any traffic of its own. 3596db75539SBrian Somers (cjm) 3606db75539SBrian Somers 3616db75539SBrian SomersVersion 2.0: March, 1997 (cjm) 36205dbe14bSBrian Somers - Incoming packets which are not recognised by the packet 3636db75539SBrian Somers aliasing engine are now completely dropped in ip.c. 3646db75539SBrian Somers - Aliasing links are cleared when a host interface address 36505dbe14bSBrian Somers changes (due to re-dial and dynamic address allocation). 3666db75539SBrian Somers - PacketAliasPermanentLink() API added. 3676db75539SBrian Somers - Option for only aliasing private, unregistered IP addresses 3686db75539SBrian Somers added. 3696db75539SBrian Somers - Substantial rework to the aliasing lookup engine. 3706db75539SBrian Somers 3716db75539SBrian SomersVersion 2.1: May, 1997 (cjm) 3726db75539SBrian Somers - Continuing rework to the aliasing lookup engine to support 3736db75539SBrian Somers multiple incoming addresses and static NAT. 37405dbe14bSBrian Somers - Now supports outgoing as well as incoming ICMP error messages/ 3756db75539SBrian Somers - PPP commands to support address and port redirection. 376a9f484e5SJordan K. Hubbard 377