Penguin
Diff: HowToVPNHOWTO
EditPageHistoryDiffInfoLikePages

Differences between version 3 and predecessor to the previous major change of HowToVPNHOWTO.

Other diffs: Previous Revision, Previous Author, or view the Annotated Edit History

Newer page: version 3 Last edited on Monday, October 25, 2004 4:55:07 am by AristotlePagaltzis Revert
Older page: version 2 Last edited on Friday, June 7, 2002 1:07:47 am by perry Revert
@@ -1,2416 +1 @@
-VPN HOWTO  
-!!!VPN HOWTO  
-!Matthew D. Wilson  
-  
-matthew@shinythings.com  
-  
-  
-  
-Dec 1999  
-  
-  
-__Revision History__Revision 2.02002-05-30Revised by: tabUpdated to Docbook 4.1 and applied GFDL per Matthew !WilsonRevision 1.01999-12-01Revised by: mdwInitial release  
-  
-  
-  
-  
-  
-This HOWTO describes how to set up a Virtual Private Network with Linux.  
-  
-  
-  
-  
-  
-----; __Table of Contents__; 1. Introduction: ; 1.1. Why I wrote this HOWTO; 1.2. Acknowledgements and Thanks; 1.3. Format of this document; 1.4. Legal Information; 1.5. Document History; 1.6. Related Documents; 2. Theory: ; 2.1. What is a VPN?; 2.2. But really, what IS a VPN?; 2.3. So how does it work?; 2.4. SSH and PPP; 2.5. Alternative VPN Systems; 3. Server: ; 3.1. Security - keeping people out; 3.2. User Access - letting people in; 3.3. Restricting Users; 3.4. Networking; 4. Client: ; 4.1. The Kernel; 4.2. Bring up the link; 4.3. Scripting; 4.4. LRP - Linux Router Project; 5. Implementation: ; 5.1. Planning; 5.2. Gather the tools; 5.3. Server: Build the kernel; 5.4. Server: Configure Networking; 5.5. Server: Configure __pppd__; 5.6. Server: Configure __sshd__; 5.7. Server: Set up user accounts; 5.8. Add __vpn-users__ group; 5.9. create the vpn-users home directory; 5.10. The .ssh directory; 5.11. Adding users; 5.12. Server: Administration; 5.13. Client: Build the kernel; 5.14. Client: Configure Networking; 5.15. Client: Configure __pppd__; 5.16. Client: Configure __ssh__; 5.17. Client: Bring up the connection; 5.18. Client: Set the routes; 5.19. Client: Scripting; 6. Addenda: ; 6.1. Pitfalls; 6.2. Hardware and Software Requirements----  
-!!!Chapter 1. Introduction  
-!!!1.1. Why I wrote this HOWTO  
-  
-I work at Real Networks, and we needed VPN service. This was my first real  
-project, and I truly learned more about Linux with this than with any  
-other task. I ended up using my experience with that project to write  
-this document, to share with others what I learned, so that they can do  
-ultra-nifty things with Linux too!  
-  
-  
-----  
-!!!1.2. Acknowledgements and Thanks  
-  
-I want to first and foremost thank my wife Julie, without her, I  
-wouldn't be where I am today. I also want to thank Arpad Magosanyi, the  
-author of the first VPN mini-howto and pty-redir, the utility that makes  
-all of this possible. Jerry, Rod, Glen, Mark V., Mark W., and David, You  
-guys rock! Thanks for all your help.  
-  
-  
-----  
-!!!1.3. Format of this document  
-  
-This document is broken down into 5 chapters.  
-  
-  
-  
-  
-  
-  
-  
-  
-; Section 1: Introduction:  
-  
-This section  
-  
-; Section 2: Theory:  
-  
-Basic VPN theory. What is a VPN, and how does it work. Read this if you are entirely new to VPN.  
-  
-; Section 3: Server:  
-  
-This section describes how a VPN server is set up.  
-  
-; Section 4: Client:  
-  
-This section describes how a VPN client is set up.  
-  
-; Section 5: Implementation:  
-  
-A step by step implementation of a sample VPN setup.  
-  
-; Section 6: Addenda:  
-  
-Other bits and pieces of info that you might find helpful.  
-  
-  
-  
-  
-----  
-!!!1.4. Legal Information  
-!!1.4.1. Copyright  
-  
-Copyright (c) 2002 Matthew D. Wilson.  
-  
-  
-  
-Permission is granted to copy, distribute and/or modify this document  
-under the terms of the GNU Free Documentation License, Version 1.1  
-or any later version published by the Free Software Foundation;  
-with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.  
-A copy of the license is included in the section entitled "GNU  
-Free Documentation License".  
-  
-  
-----  
-!!1.4.2. Disclaimer  
-  
-The author assumes no responsibility for anything done with this document,  
-nor does he make any warranty, implied or explicit. If you break it, it's  
-not my fault. Remember, what you do here could make very large holes in  
-the security model of your network. You've been warned.  
-  
-  
-----  
-!!1.4.3. GNU Free Documentation License  
-  
-Version 1.1, March 2000  
-  
-  
-  
-Copyright (C) 2000 Free Software Foundation, Inc.  
-59 Temple Place, Suite 330, Boston, MA 02111-1307 USA  
-Everyone is permitted to copy and distribute verbatim copies  
-of this license document, but changing it is not allowed.  
-  
-----  
-!!1.4.4. PREAMBLE  
-  
-The purpose of this License is to make a manual, textbook,  
-or other written document "free" in the sense of freedom: to  
-assure everyone the effective freedom to copy and redistribute it,  
-with or without modifying it, either commercially or  
-noncommercially. Secondarily, this License preserves for the  
-author and publisher a way to get credit for their work, while not  
-being considered responsible for modifications made by  
-others.  
-  
-  
-  
-This License is a kind of "copyleft", which means that  
-derivative works of the document must themselves be free in the  
-same sense. It complements the GNU General Public License, which  
-is a copyleft license designed for free software.  
-  
-  
-  
-We have designed this License in order to use it for manuals  
-for free software, because free software needs free documentation:  
-a free program should come with manuals providing the same  
-freedoms that the software does. But this License is not limited  
-to software manuals; it can be used for any textual work,  
-regardless of subject matter or whether it is published as a  
-printed book. We recommend this License principally for works  
-whose purpose is instruction or reference.  
-  
-----  
-!!1.4.5. APPLICABILITY AND DEFINITIONS  
-  
-This License applies to any manual or other work that  
-contains a notice placed by the copyright holder saying it can be  
-distributed under the terms of this License. The "Document",  
-below, refers to any such manual or work. Any member of the  
-public is a licensee, and is addressed as "you".  
-  
-  
-  
-A "Modified Version" of the Document means any work  
-containing the Document or a portion of it, either copied  
-verbatim, or with modifications and/or translated into another  
-language.  
-  
-  
-  
-A "Secondary Section" is a named appendix or a front-matter  
-section of the Document that deals exclusively with the  
-relationship of the publishers or authors of the Document to the  
-Document's overall subject (or to related matters) and contains  
-nothing that could fall directly within that overall subject.  
-(For example, if the Document is in part a textbook of  
-mathematics, a Secondary Section may not explain any mathematics.)  
-The relationship could be a matter of historical connection with  
-the subject or with related matters, or of legal, commercial,  
-philosophical, ethical or political position regarding  
-them.  
-  
-  
-  
-The "Invariant Sections" are certain Secondary Sections  
-whose titles are designated, as being those of Invariant Sections,  
-in the notice that says that the Document is released under this  
-License.  
-  
-  
-  
-The "Cover Texts" are certain short passages of text that  
-are listed, as Front-Cover Texts or Back-Cover Texts, in the  
-notice that says that the Document is released under this  
-License.  
-  
-  
-  
-A "Transparent" copy of the Document means a  
-machine-readable copy, represented in a format whose specification  
-is available to the general public, whose contents can be viewed  
-and edited directly and straightforwardly with generic text  
-editors or (for images composed of pixels) generic paint programs  
-or (for drawings) some widely available drawing editor, and that  
-is suitable for input to text formatters or for automatic  
-translation to a variety of formats suitable for input to text  
-formatters. A copy made in an otherwise Transparent file format  
-whose markup has been designed to thwart or discourage subsequent  
-modification by readers is not Transparent. A copy that is not  
-"Transparent" is called "Opaque".  
-  
-  
-  
-Examples of suitable formats for Transparent copies include  
-plain ASCII without markup, Texinfo input format, LaTeX input  
-format, SGML or XML using a publicly available DTD, and  
-standard-conforming simple HTML designed for human modification.  
-Opaque formats include !PostScript, PDF, proprietary formats that  
-can be read and edited only by proprietary word processors, SGML  
-or XML for which the DTD and/or processing tools are not generally  
-available, and the machine-generated HTML produced by some word  
-processors for output purposes only.  
-  
-  
-  
-The "Title Page" means, for a printed book, the title page  
-itself, plus such following pages as are needed to hold, legibly,  
-the material this License requires to appear in the title page.  
-For works in formats which do not have any title page as such,  
-"Title Page" means the text near the most prominent appearance of  
-the work's title, preceding the beginning of the body of the  
-text.  
-  
-----  
-!!1.4.6. VERBATIM COPYING  
-  
-You may copy and distribute the Document in any medium,  
-either commercially or noncommercially, provided that this  
-License, the copyright notices, and the license notice saying this  
-License applies to the Document are reproduced in all copies, and  
-that you add no other conditions whatsoever to those of this  
-License. You may not use technical measures to obstruct or  
-control the reading or further copying of the copies you make or  
-distribute. However, you may accept compensation in exchange for  
-copies. If you distribute a large enough number of copies you  
-must also follow the conditions in section 3.  
-  
-  
-  
-You may also lend copies, under the same conditions stated  
-above, and you may publicly display copies.  
-  
-----  
-!!1.4.7. COPYING IN QUANTITY  
-  
-If you publish printed copies of the Document numbering more  
-than 100, and the Document's license notice requires Cover Texts,  
-you must enclose the copies in covers that carry, clearly and  
-legibly, all these Cover Texts: Front-Cover Texts on the front  
-cover, and Back-Cover Texts on the back cover. Both covers must  
-also clearly and legibly identify you as the publisher of these  
-copies. The front cover must present the full title with all  
-words of the title equally prominent and visible. You may add  
-other material on the covers in addition. Copying with changes  
-limited to the covers, as long as they preserve the title of the  
-Document and satisfy these conditions, can be treated as verbatim  
-copying in other respects.  
-  
-  
-  
-If the required texts for either cover are too voluminous to  
-fit legibly, you should put the first ones listed (as many as fit  
-reasonably) on the actual cover, and continue the rest onto  
-adjacent pages.  
-  
-  
-  
-If you publish or distribute Opaque copies of the Document  
-numbering more than 100, you must either include a  
-machine-readable Transparent copy along with each Opaque copy, or  
-state in or with each Opaque copy a publicly-accessible  
-computer-network location containing a complete Transparent copy  
-of the Document, free of added material, which the general  
-network-using public has access to download anonymously at no  
-charge using public-standard network protocols. If you use the  
-latter option, you must take reasonably prudent steps, when you  
-begin distribution of Opaque copies in quantity, to ensure that  
-this Transparent copy will remain thus accessible at the stated  
-location until at least one year after the last time you  
-distribute an Opaque copy (directly or through your agents or  
-retailers) of that edition to the public.  
-  
-  
-  
-It is requested, but not required, that you contact the  
-authors of the Document well before redistributing any large  
-number of copies, to give them a chance to provide you with an  
-updated version of the Document.  
-  
-----  
-!!1.4.8. MODIFICATIONS  
-  
-You may copy and distribute a Modified Version of the  
-Document under the conditions of sections 2 and 3 above, provided  
-that you release the Modified Version under precisely this  
-License, with the Modified Version filling the role of the  
-Document, thus licensing distribution and modification of the  
-Modified Version to whoever possesses a copy of it. In addition,  
-you must do these things in the Modified Version:  
-  
-  
-  
-  
-  
-  
-***#  
-  
-Use in the Title Page  
-(and on the covers, if any) a title distinct from that of the  
-Document, and from those of previous versions (which should, if  
-there were any, be listed in the History section of the  
-Document). You may use the same title as a previous version if  
-the original publisher of that version gives permission.  
-  
-  
-***#  
-***#  
-  
-List on the Title Page,  
-as authors, one or more persons or entities responsible for  
-authorship of the modifications in the Modified Version,  
-together with at least five of the principal authors of the  
-Document (all of its principal authors, if it has less than  
-five).  
-  
-  
-***#  
-***#  
-  
-State on the Title page  
-the name of the publisher of the Modified Version, as the  
-publisher.  
-  
-  
-***#  
-***#  
-  
-Preserve all the  
-copyright notices of the Document.  
-  
-  
-***#  
-***#  
-  
-Add an appropriate  
-copyright notice for your modifications adjacent to the other  
-copyright notices.  
-  
-  
-***#  
-***#  
-  
-Include, immediately  
-after the copyright notices, a license notice giving the public  
-permission to use the Modified Version under the terms of this  
-License, in the form shown in the Addendum below.  
-  
-  
-***#  
-***#  
-  
-Preserve in that license  
-notice the full lists of Invariant Sections and required Cover  
-Texts given in the Document's license notice.  
-  
-  
-***#  
-***#  
-  
-Include an unaltered  
-copy of this License.  
-  
-  
-***#  
-***#  
-  
-Preserve the section  
-entitled "History", and its title, and add to it an item stating  
-at least the title, year, new authors, and publisher of the  
-Modified Version as given on the Title Page. If there is no  
-section entitled "History" in the Document, create one stating  
-the title, year, authors, and publisher of the Document as given  
-on its Title Page, then add an item describing the Modified  
-Version as stated in the previous sentence.  
-  
-  
-***#  
-***#  
-  
-Preserve the network  
-location, if any, given in the Document for public access to a  
-Transparent copy of the Document, and likewise the network  
-locations given in the Document for previous versions it was  
-based on. These may be placed in the "History" section. You  
-may omit a network location for a work that was published at  
-least four years before the Document itself, or if the original  
-publisher of the version it refers to gives permission.  
-  
-  
-***#  
-***#  
-  
-In any section entitled  
-"Acknowledgements" or "Dedications", preserve the section's  
-title, and preserve in the section all the substance and tone of  
-each of the contributor acknowledgements and/or dedications  
-given therein.  
-  
-  
-***#  
-***#  
-  
-Preserve all the  
-Invariant Sections of the Document, unaltered in their text and  
-in their titles. Section numbers or the equivalent are not  
-considered part of the section titles.  
-  
-  
-***#  
-***#  
-  
-Delete any section  
-entitled "Endorsements". Such a section may not be included in  
-the Modified Version.  
-  
-  
-***#  
-***#  
-  
-Do not retitle any  
-existing section as "Endorsements" or to conflict in title with  
-any Invariant Section.  
-  
-  
-***#  
-  
-If the Modified Version includes new front-matter sections  
-or appendices that qualify as Secondary Sections and contain no  
-material copied from the Document, you may at your option  
-designate some or all of these sections as invariant. To do this,  
-add their titles to the list of Invariant Sections in the Modified  
-Version's license notice. These titles must be distinct from any  
-other section titles.  
-  
-  
-  
-You may add a section entitled "Endorsements", provided it  
-contains nothing but endorsements of your Modified Version by  
-various parties--for example, statements of peer review or that  
-the text has been approved by an organization as the authoritative  
-definition of a standard.  
-  
-  
-  
-You may add a passage of up to five words as a Front-Cover  
-Text, and a passage of up to 25 words as a Back-Cover Text, to the  
-end of the list of Cover Texts in the Modified Version. Only one  
-passage of Front-Cover Text and one of Back-Cover Text may be  
-added by (or through arrangements made by) any one entity. If the  
-Document already includes a cover text for the same cover,  
-previously added by you or by arrangement made by the same entity  
-you are acting on behalf of, you may not add another; but you may  
-replace the old one, on explicit permission from the previous  
-publisher that added the old one.  
-  
-  
-  
-The author(s) and publisher(s) of the Document do not by  
-this License give permission to use their names for publicity for  
-or to assert or imply endorsement of any Modified Version.  
-  
-----  
-!!1.4.9. COMBINING DOCUMENTS  
-  
-You may combine the Document with other documents released  
-under this License, under the terms defined in section 4 above for  
-modified versions, provided that you include in the combination  
-all of the Invariant Sections of all of the original documents,  
-unmodified, and list them all as Invariant Sections of your  
-combined work in its license notice.  
-  
-  
-  
-The combined work need only contain one copy of this  
-License, and multiple identical Invariant Sections may be replaced  
-with a single copy. If there are multiple Invariant Sections with  
-the same name but different contents, make the title of each such  
-section unique by adding at the end of it, in parentheses, the  
-name of the original author or publisher of that section if known,  
-or else a unique number. Make the same adjustment to the section  
-titles in the list of Invariant Sections in the license notice of  
-the combined work.  
-  
-  
-  
-In the combination, you must combine any sections entitled  
-"History" in the various original documents, forming one section  
-entitled "History"; likewise combine any sections entitled  
-"Acknowledgements", and any sections entitled "Dedications". You  
-must delete all sections entitled "Endorsements."  
-  
-----  
-!!1.4.10. COLLECTIONS OF DOCUMENTS  
-  
-You may make a collection consisting of the Document and  
-other documents released under this License, and replace the  
-individual copies of this License in the various documents with a  
-single copy that is included in the collection, provided that you  
-follow the rules of this License for verbatim copying of each of  
-the documents in all other respects.  
-  
-  
-  
-You may extract a single document from such a collection,  
-and distribute it individually under this License, provided you  
-insert a copy of this License into the extracted document, and  
-follow this License in all other respects regarding verbatim  
-copying of that document.  
-  
-----  
-!!1.4.11. AGGREGATION WITH INDEPENDENT WORKS  
-  
-A compilation of the Document or its derivatives with other  
-separate and independent documents or works, in or on a volume of  
-a storage or distribution medium, does not as a whole count as a  
-Modified Version of the Document, provided no compilation  
-copyright is claimed for the compilation. Such a compilation is  
-called an "aggregate", and this License does not apply to the  
-other self-contained works thus compiled with the Document, on  
-account of their being thus compiled, if they are not themselves  
-derivative works of the Document.  
-  
-  
-  
-If the Cover Text requirement of section 3 is applicable to  
-these copies of the Document, then if the Document is less than  
-one quarter of the entire aggregate, the Document's Cover Texts  
-may be placed on covers that surround only the Document within the  
-aggregate. Otherwise they must appear on covers around the whole  
-aggregate.  
-  
-----  
-!!1.4.12. TRANSLATION  
-  
-Translation is considered a kind of modification, so you may  
-distribute translations of the Document under the terms of section  
-4. Replacing Invariant Sections with translations requires  
-special permission from their copyright holders, but you may  
-include translations of some or all Invariant Sections in addition  
-to the original versions of these Invariant Sections. You may  
-include a translation of this License provided that you also  
-include the original English version of this License. In case of  
-a disagreement between the translation and the original English  
-version of this License, the original English version will  
-prevail.  
-  
-----  
-!!1.4.13. TERMINATION  
-  
-You may not copy, modify, sublicense, or distribute the  
-Document except as expressly provided for under this License. Any  
-other attempt to copy, modify, sublicense or distribute the  
-Document is void, and will automatically terminate your rights  
-under this License. However, parties who have received copies, or  
-rights, from you under this License will not have their licenses  
-terminated so long as such parties remain in full  
-compliance.  
-  
-----  
-!!1.4.14. FUTURE REVISIONS OF THIS LICENSE  
-  
-The Free Software Foundation may publish new, revised  
-versions of the GNU Free Documentation License from time to time.  
-Such new versions will be similar in spirit to the present  
-version, but may differ in detail to address new problems or  
-concerns. See http://www.gnu.org/copyleft/.  
-  
-  
-  
-Each version of the License is given a distinguishing  
-version number. If the Document specifies that a particular  
-numbered version of this License "or any later version" applies to  
-it, you have the option of following the terms and conditions  
-either of that specified version or of any later version that has  
-been published (not as a draft) by the Free Software Foundation.  
-If the Document does not specify a version number of this License,  
-you may choose any version ever published (not as a draft) by the  
-Free Software Foundation.  
-  
-----  
-!!1.4.15. How to use this License for your documents  
-  
-To use this License in a document you have written, include  
-a copy of the License in the document and put the following  
-copyright and license notices just after the title page:  
-  
-  
-  
- Copyright (c) YEAR YOUR NAME.  
-Permission is granted to copy, distribute and/or modify this document  
-under the terms of the GNU Free Documentation License, Version 1.1  
-or any later version published by the Free Software Foundation;  
-with the Invariant Sections being LIST THEIR TITLES, with the  
-Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.  
-A copy of the license is included in the section entitled "GNU  
-Free Documentation License".  
-  
-  
-  
-  
-If you have no Invariant Sections, write "with no Invariant  
-Sections" instead of saying which ones are invariant. If you have  
-no Front-Cover Texts, write "no Front-Cover Texts" instead of  
-"Front-Cover Texts being LIST"; likewise for Back-Cover  
-Texts.  
-  
-  
-  
-If your document contains nontrivial examples of program  
-code, we recommend releasing these examples in parallel under your  
-choice of free software license, such as the GNU General Public  
-License, to permit their use in free software.  
-  
-----  
-!!!1.5. Document History  
-  
-The original "VPN mini-HOWTO" was written by  
-Arpad Magosanyi, `mag@bunuel.tii.matav.hub, in 1997. He has  
-since allowed me to take up the document and extend it into a full  
-HOWTO. All of this would not be possible without his original document.  
-Thanks again Arpad. :)  
-  
-  
-  
-  
-Version 1.0 of this HOWTO was completed on December 10, 1999.  
-  
-  
-----  
-!!!1.6. Related Documents  
-  
-  
-  
-  
-  
-  
-  
-****  
-  
-Networking Overview HOWTO  
-  
-  
-  
-****  
-****  
-  
-Networking HOWTO  
-  
-  
-  
-****  
-****  
-  
-VPN-Masquerade HOWTO  
-  
-  
-  
-****  
-  
-  
-----  
-!!!Chapter 2. Theory  
-!!!2.1. What is a VPN?  
-  
-VPN stands for Virtual Private Network. A VPN uses the Internet as it's  
-transport mechanism, while maintaining the security of the data on the VPN.  
-  
-  
-----  
-!!!2.2. But really, what IS a VPN?  
-  
-There are several answers to that question. It really depends on  
-your network layout. The most common configuration is to have a single  
-main internal network with remote nodes using VPN to gain full access  
-to the central net. The remote nodes are commonly remote offices or  
-employees working from home. You can also link two small (or  
-large) networks to form an even larger single network.  
-  
-  
-----  
-!!!2.3. So how does it work?  
-  
-Put simply, to make a VPN, you create a secure tunnel between the two  
-networks and route IP through it. If I've lost you already, you should  
-read The Linux Networking Overview HOWTO to learn more about networking  
-with Linux.  
-  
-  
-  
-Here are some diagrams to illustrate this concept:  
-  
-  
-  
- \ \  
--------- / / --------  
-Remote ______| Client |______\ Internet \_____| Server |______ Private  
-Network | Router | / / | Router | Network  
--------- \ \ --------  
-/ /  
-Client Router  
-----------------------------------------------------  
-| /-b 10.../255...0 \ |  
-Remote | |--b 172.16../255.240..0 |--b Tunnel b---\ |  
-Network b---|--|--b 192.168../255.255..0 / |--|----b Internet  
-192.168.12.0 | | | |  
-| \-----b .../...0 --b IP Masquerade b--/ |  
-----------------------------------------------------  
-Server Router  
-----------------------------------------------------  
-| /-b 10.../255...0 \ |  
-| /--b Tunnel b--|--b 172.16../255.240..0 |--|----b Private  
-Internet b--|--| \--b 192.168../255.255..0 / | Network  
-| | | 172.16../12  
-| \-----b .../...0 -----b /dev/null | 192.168../16  
-----------------------------------------------------  
-  
-  
-The above diagram shows how the network might be set up. If you don't  
-know what IP Masquerading is, you should probably read the  
-The Linux Networking  
-Overview HOWTO and come back once you understand how it works.  
-  
-  
-  
-  
-The Client Router is a Linux box acting as the gateway/firewall for the  
-remote network. The remote network uses the local IP address  
-192.168.12.. For the sake of a simple diagram, I left out the local  
-routing information on the routers. The basic idea is to route traffic  
-for all of the private networks (10..., 172.16.., and 192.168..)  
-through the tunnel. The setup shown here is one way. That is, while  
-the remote network can see the private network, the private network  
-cannot necessarily see the remote network. In order for that to happen,  
-you must specify that the routes are bidirectional.  
-  
-  
-  
-  
-From the diagram you should also note that all of the traffic coming out  
-of the client router appears to be from the client router, that is, all from  
-one IP address. You could route real numbers from inside your  
-network but that brings all sorts of security problems with it.  
-  
-  
-----  
-!!!2.4. SSH and PPP  
-  
-The system that I describe to implement VPN uses SSH and PPP. Basically  
-I use ssh to create a tunnel connection, and then use pppd to run TCP/IP  
-traffic though it. That's what makes up the tunnel.  
-  
-  
-  
-  
-The real trick to getting ssh and pppd to play well together is the  
-utility written by Arpad Magosanyi that allows the redirection of  
-standard in and standard out to a pseudo tty. This allows pppd to talk  
-through ssh as if it were a serial line. On the server side, pppd is  
-run as the users shell in the ssh session, completing the link. After  
-that, all you need to do is the routing.  
-  
-  
-----  
-!!!2.5. Alternative VPN Systems  
-  
-There are of course other ways of setting up a VPN. Here are a couple of  
-other systems:  
-  
-  
-----  
-!!2.5.1. PPTP  
-  
-PPTP is a Microsoft protocol for VPN. It is supported under Linux, but  
-is known to have serious security issues. I do not describe how to use  
-it here since it is covered by the Linux VPN Masquerade HOWTO.  
-  
-----  
-!!2.5.2. IP Sec  
-  
-IP Sec is a different set of protocols from SSH. I don't actually know  
-all that much about it, so if someone wants to help me out with a  
-description, I'd be most appreciative. Again, I do not describe how to  
-use it here since it is covered by the Linux VPN Masquerade HOWTO.  
-  
-----  
-!!2.5.3. CIPE  
-  
-CIPE is a kernel level network encryption system that may be better  
-suited to enterprise setups. You can find out more about it at the CIPE homepage.  
-  
-----  
-!!!Chapter 3. Server  
-  
-This section tells you how to set up the server side of things. I  
-figured that this should go first since without a server, your client is  
-kind of useless.  
-  
-  
-----  
-!!!3.1. Security - keeping people out  
-  
-Security is very important for a VPN. That's why you're building one in  
-the first place, isn't it? You need to keep a few things in mind while  
-setting up your server.  
-  
-  
-----  
-!!3.1.1. Trim your daemons  
-  
-Since this server is going to be on both sides of your firewall, and set  
-up to forward traffic into your network, it's a good idea to secure the  
-box as well as you possibly can. You can read up more on Linux security  
-in the Linux Security HOWTO.  
-In this case I killed everything but sshd and a Roxen Web  
-server. I use the web server to download a couple of files (my scripts,  
-etc) for setting up new machines to access the VPN. I don't use an FTP  
-server since it's harder to configure one to be secure than it is to  
-just make a few files available with a web server. Plus, I only need to  
-be able to download files. If you really want to run different servers  
-on your gateway, you might want to think about restricting access to them  
-to only those machines on your private network.  
-  
-  
-----  
-!!3.1.2. Don't allow passwords  
-  
-Yes, it sounds kind of silly, but it got your attention, didn't it? No,  
-you don't use passwords, you disable them completely. All  
-authentication on this machine should be done via ssh's public key  
-authentication system. This way, only those with keys can get in, and  
-it's pretty much impossible to remember a binary key that's 530  
-characters long.  
-  
-  
-  
-  
-So how do you do that? It requires editing the /etc/passwd file. The  
-second field contains either the password hash, or alternatively 'x'  
-telling the authentication system to look in the /etc/shadow file. What  
-you do is change that field to read "*" instead. This tells the  
-authentication system that there is no password, and that none should be  
-allowed.  
-  
-  
-  
-  
-Here's how a typical /etc/passwd file looks:  
-  
-  
-...  
-nobody:x:65534:100:nobody:/dev/null:  
-mwilson:x:1000:100:Matthew Wilson,,,:/home/mwilson:/bin/bash  
-joe:*:504:101:Joe Mode (home),,,:/home/vpn-users:/usr/sbin/pppd  
-bill:*:504:101:Bill Smith (home),,,:/home/vpn-users:/usr/sbin/pppd  
-frank:*:504:101:Frank Jones (home),,,:/home/vpn-users:/usr/sbin/pppd  
-...  
-  
-  
-Note that I've done more than just editing the second field. I'll  
-explain the other fields later on.  
-  
-  
-----  
-!!!3.2. User Access - letting people in  
-  
-User access is done via ssh's authentication scheme. As stated  
-above, this is how users get access to the system, while maintaining a  
-high level of security. If you're not familiar with ssh, check out  
-http://www.ssh.org/. Note that I am  
-using ssh version 1, not version 2. There is a big difference, notably  
-that version 1 is free, and 2 isn't.  
-  
-  
-----  
-!!3.2.1. Configuring __sshd__  
-  
-You'll need to configure __sshd__.  
-The idea is to disable password authentication and rhosts  
-authentication. The following options should be present in your  
-/etc/sshd_config file.  
-  
-  
-  
-!PermitRootLogin yes  
-!IgnoreRhosts yes  
-!StrictModes yes  
-!QuietMode no  
-!CheckMail no  
-!IdleTimeout 3d  
-X11Forwarding no  
-!PrintMotd no  
-!KeepAlive yes  
-!RhostsAuthentication no  
-RhostsRSAAuthentication no  
-RSAAuthentication yes  
-!PasswordAuthentication no  
-!PermitEmptyPasswords no  
-!UseLogin no  
-----  
-!!!3.3. Restricting Users  
-  
-Now that you're keeping the bad people out, and only letting the good people  
-in, you may need to make sure that the good people behave themselves. This is  
-most easily done by not letting them do anything except run pppd. This may  
-or may not be necessary. I restrict users because the system that I maintain  
-is dedicated to VPN, so users have no business doing anything else on it.  
-  
-  
-----  
-!!3.3.1. sudo or not sudo  
-  
-There is this neat little program called sudo that allows the admin on a  
-Unix system to grant certain users the ability to run certain programs  
-as root. This is necessary in this case since pppd must be run as root.  
-You'll need to use this method if you want to allow users shell access.  
-Read up on how to setup and use sudo in the sudo man page. Using sudo  
-is best on multi-use systems that typically host a small number of  
-trusted users.  
-  
-  
-  
-  
-If you decide to not allow users to have shell access, then the best way  
-to keep them from gaining it is to make their shell pppd. This is  
-done in the /etc/passwd file. You can see /etc/passwd file  
-that I did this for the last three users. The last field of the  
-/etc/passwd file is the user's shell. You needn't do anything special  
-to pppd in order to make it work. It gets executed as root when the  
-user connects. This is certainly the simplest setup to be had, as well  
-as the most secure, and ideal for large scale and corporate  
-systems. I describe exactly what all needs to be done later in this  
-document. You can Section 5.7 if you  
-like.  
-  
-  
-----  
-!!!3.4. Networking  
-  
-Now that your users have access to the system, we need to make sure that  
-they have access to the network. We do that by using the Linux kernel's  
-firewalling rules and routing tables. Using the __route__ and  
-__ipfwadm__ commands, we can set up the kernel to handle network  
-traffic in the appropriate ways. For more info on __ipfwadm__,  
-__ipchains__ and __route__ see the  
-Linux Networking HOWTO.  
-  
-----  
-!!3.4.1. The Kernel  
-  
-In order for any of this to work, you must have your kernel configured  
-correctly. If you don't know how to build your own kernel, then you  
-should read the Kernel HOWTO. You'll need to make sure that the following kernel options  
-are turned on in addition to basic networking. I use a 2..38 kernel  
-in my system.  
-  
-  
-  
-  
-For 2.0 kernels:  
-  
-  
-  
-  
-  
-****  
-  
-CONFIG_FIREWALL  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_FORWARD  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_FIREWALL  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_ROUTER  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_MASQUERADE (optional)  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_MASQUERADE_ICMP (optional)  
-  
-  
-  
-****  
-****  
-  
-CONFIG_PPP  
-  
-  
-  
-****  
-  
-  
-  
-  
-For 2.2 kernels:  
-  
-  
-  
-  
-  
-****  
-  
-CONFIG_FIREWALL  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_ADVANCED_ROUTER  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_FIREWALL  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_ROUTER  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_MASQUERADE (optional)  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_MASQUERADE_ICMP (optional)  
-  
-  
-  
-****  
-****  
-  
-CONFIG_PPP  
-  
-  
-  
-****  
-  
-  
-----  
-!!3.4.2. Filter Rules  
-  
-First, we write firewall filter rules that allow our users to access our  
-internal nets, while restricting them from accessing the outside  
-internet. This sounds strange, but since the users  
-already have access to the internet, why let them use the tunnel to  
-access the net? It wastes both bandwidth and processor resources.  
-  
-  
-  
-  
-The filter rules that we use depend upon which internal nets we use,  
-but translate to: "Allow traffic coming from our VPNs that is  
-destined for our internal nets to go there." So how do we do that?  
-As always, it depends. If you are running a 2.0 kernel, you use the  
-tool called __ipfwadm__, but if you are using a  
-2.2 kernel, you use the utility called __ipchains__.  
-  
-  
-  
-  
-To set the rules with __ipfwadm__, run it with options similar to  
-the following:  
-  
-  
-  
-# /sbin/ipfwadm -F -f  
-# /sbin/ipfwadm -F -p deny  
-# /sbin/ipfwadm -F -a accept -S 192.168.13./24 -D 172.16../12  
-  
-  
-To set the rules with __ipchains__, run it with options similar to  
-the following:  
-  
-  
-  
-# /sbin/ipchains -F forward  
-# /sbin/ipchains -P forward DENY  
-# /sbin/ipchains -A forward -j ACCEPT -s 192.168.13./24 -d 172.16../12  
-  
-  
-For those using 2.2 kernels, please read Section 6.1.3.  
-  
-  
-----  
-!!3.4.3. Routing  
-  
-Now that users are allowed to access our nets, we need to tell  
-the kernel where to send the packets. On my system, I have two ethernet  
-cards, one is on the external network, while the other is on the  
-internal network. This helps keep things secure, as outbound traffic is  
-masqueraded by the gateway, and any incoming traffic is filtered and  
-routed by the Cisco Router. For most setups, the routing should be simple.  
-  
-  
-  
-  
-Next, route all traffic destined for the private networks out the  
-internal interface, and all other traffic out the external interface. The  
-specific routing commands depend on which internal nets you are using.  
-Below is an example of what they might look like. These lines are of course  
-in addition to your basic routes for your local nets. I also doubt that you  
-are using all 3 groups of internal numbers:  
-  
-  
-  
-Assuming that 172.16.254.254 is the internal gateway:  
-# /sbin/route add -net 10...0 netmask 255...0 gw 172.16.254.254 dev eth1  
-# /sbin/route add -net 172.16..0 netmask 255.240..0 gw 172.16.254.254 dev eth1  
-# /sbin/route add -net 192.168..0 netmask 255.255..0 gw 172.16.254.254 dev eth1  
-  
-  
-One additional note on routing. If you are using two way routing for  
-say, a remote office, then you will need to do one more thing. You  
-need to set up routes on the server that point back to the client. The  
-easiest way to accomplish this is to run a cron job every minute that  
-quietly sets back routes. If the client is not  
-connected, __route__ will just spit out an error (that you've  
-conveniently sent to /dev/null.)  
-  
-  
-----  
-!!!Chapter 4. Client  
-  
-Now we examine the client end. In practice, when used to allow access  
-to a remote network, this box can easily serve as a Samba (Windows  
-Networking) server, DHCP server, and even an internal web server. The  
-important thing to remember is that this box should be as secure as  
-possible, as it runs your whole remote network.  
-  
-  
-----  
-!!!4.1. The Kernel  
-  
-First things first, you must have ppp available in your kernel. If you are  
-going to allow multiple machines to use the tunnel, then you need to have  
-firewalling and forwarding available too. If the client is going to be a single  
-machine, ppp is enough.  
-  
-  
-----  
-!!!4.2. Bring up the link  
-  
-The link is created by running __pppd__ through a pseudo terminal that is  
-created by __pty-redir__ and connected to __ssh__. This is done with  
-something similar to the following sequence of commands:  
-  
-  
-  
-# /usr/sbin/pty-redir /usr/bin/ssh -t -e none -o 'Batchmode yes' -c blowfish -i /root/.ssh/identity.vpn -l joe b /tmp/vpn-device  
-# sleep 10  
-# /usr/sbin/pppd `cat /tmp/vpn-device`  
-# sleep 15  
-# /sbin/route add -net 172.16..0 gw vpn-internal.mycompany.com netmask 255.240..  
-# /sbin/route add -net 192.168..0 gw vpn-internal.mycompany.com netmask 255.255..  
-  
-  
-What this does is run ssh, redirecting the input and output to  
-pppd. The options passed to ssh configure it to run without escape  
-characters (-e), using the blowfish crypto algorithm (-c), using the  
-identity file specified (-i), in terminal mode (-t), with the options  
-'Batchmode yes' (-o). The sleep commands are used to space out the  
-executions of the commands so that each can complete their  
-startup before the next is run.  
-  
-  
-----  
-!!!4.3. Scripting  
-  
-If you don't want to have to type those commands in every time  
-that you want to get the tunnel running, I've written a set of bash  
-scripts that keep the tunnel up and running. You can download the  
-package from here. Just download and uncompress it into /usr/local/vpn.  
-Inside you'll find three files:  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-****  
-  
-vpnd: The script that controls the tunnel connection.  
-  
-  
-  
-****  
-****  
-  
-check-vpnd: a script to be run by cron to check that vpnd is still up.  
-  
-  
-  
-****  
-****  
-  
-pty-redir: a small executable needed to initialize the tunnel.  
-  
-  
-  
-****  
-  
-  
-  
-  
-You'll need to edit the  
-__vpnd__  
-script to set things like the client's username and the server's  
-names. You may also need to modify the starttunnel section of the  
-script to specify which networks you are using. Below is a copy of  
-the script for your reading enjoyment. You'll note that you could  
-put the script in a different directory, you just need to change the  
-VPN_DIR variable.  
-  
-  
-  
-#! /bin/bash  
-#  
-# vpnd: Monitor the tunnel, bring it up and down as necessary  
-#  
-USERNAME=vpn-username  
-IDENTITY=/root/.ssh/identity.vpn  
-VPN_DIR=/usr/local/vpn  
-LOCK_DIR=/var/run  
-VPN_EXTERNAL=vpn.mycompany.com  
-VPN_INTERNAL=vpn-internal.mycompany.com  
-PTY_REDIR=${VPN_DIR}/pty-redir  
-SSH=${VPN_DIR}/${VPN_EXTERNAL}  
-PPPD=/usr/sbin/pppd  
-ROUTE=/sbin/route  
-CRYPTO=blowfish  
-PPP_OPTIONS="noipdefault ipcp-accept-local ipcp-accept-remote local noauth nocrtscts lock nodefaultroute"  
-ORIG_SSH=/usr/bin/ssh  
-starttunnel () {  
-$PTY_REDIR $SSH -t -e none -o 'Batchmode yes' -c $CRYPTO -i $IDENTITY -l $USERNAME b /tmp/vpn-device  
-sleep 15  
-$PPPD `cat /tmp/vpn-device` $PPP_OPTIONS  
-sleep 15  
-# Add routes (modify these lines as necessary)  
-/sbin/route add -net 10...0 gw $VPN_INTERNAL netmask 255...  
-/sbin/route add -net 172.16..0 gw $VPN_INTERNAL netmask 255.240..  
-/sbin/route add -net 192.168..0 gw $VPN_INTERNAL netmask 255.255..  
-}  
-stoptunnel () {  
-kill `ps ax | grep $SSH | grep -v grep | awk '{print $1}'`  
-}  
-resettunnel () {  
-echo "reseting tunnel."  
-date bb ${VPN_DIR}/restart.log  
-eval stoptunnel  
-sleep 5  
-eval starttunnel  
-}  
-checktunnel () {  
-ping -c 4 $VPN_EXTERNAL 2b/dev/null 1b/dev/null  
-if [[ $? -eq 0 ]; then  
-ping -c 4 $VPN_INTERNAL 2b/dev/null 1b/dev/null  
-if [[ $? -ne 0 ]; then  
-eval resettunnel  
-fi  
-fi  
-}  
-settraps () {  
-trap "eval stoptunnel; exit " INT TERM  
-trap "eval resettunnel" HUP  
-trap "eval checktunnel" USR1  
-}  
-runchecks () {  
-if [[ -f ${LOCK_DIR}/tunnel.pid ]; then  
-OLD_PID=`cat ${LOCK_DIR}/vpnd.pid`  
-if [[ -d /proc/${OLD_PID} ]; then  
-echo "vpnd is already running on process ${OLD_PID}."  
-exit 1  
-else  
-echo "removing stale pid file."  
-rm -rf ${LOCK_DIR}/vpnd.pid  
-echo $$ b ${LOCK_DIR}/vpnd.pid  
-echo "checking tunnel state."  
-eval checktunnel  
-fi  
-else  
-echo $$ b ${LOCK_DIR}/vpnd.pid  
-eval starttunnel  
-fi  
-}  
-case $1 in  
-check) if [[ -d /proc/`cat ${LOCK_DIR}/vpnd.pid` ]; then  
-kill -USR1 `cat ${LOCK_DIR}/vpnd.pid`  
-exit  
-else  
-echo "vpnd is not running."  
-exit 1  
-fi ;;  
-reset) if [[ -d /proc/`cat ${LOCK_DIR}/vpnd.pid` ]; then  
-kill -HUP `cat ${LOCK_DIR}/vpnd.pid`  
-exit  
-else  
-echo "vpnd is not running."  
-exit 1  
-fi ;;  
---help | -h)  
-echo "Usage: vpnd [[ check | reset ]"  
-echo "Options:"  
-echo " check Sends running vpnd a USR1 signal, telling it to check"  
-echo " the tunnel state, and restart if neccesary."  
-echo " reset Sends running vpnd a HUP signal, telling it to reset"  
-echo " it's tunnel connection." ;;  
-esac  
-ln -sf $ORIG_SSH $SSH  
-settraps  
-runchecks  
-while true; do  
-i=  
-while [[ $i -lt 600 ]; do  
-i=((i+1))  
-sleep 1  
-done  
-eval checktunnel  
-done  
-----  
-!!!4.4. LRP - Linux Router Project  
-  
-I actually run this setup on Pentium 90's running the LRP distribution  
-of Linux. LRP is a distribution of Linux that fits in, and boots off of  
-a single floppy disk. You can learn more about it at http://www.linuxrouter.org/  
-You can download my LRP package for the VPN client from here. You will  
-also need both the ppp and ssh packages from the LRP site.  
-  
-  
-----  
-!!!Chapter 5. Implementation  
-  
-In this section, I explain step by step how to set up your VPN system. I'll start  
-with the server, and then move on to the client. For the purposes of an example, I  
-will invent a situation that would require a couple of different kinds of VPN set up.  
-  
-  
-----  
-!!!5.1. Planning  
-  
-Let's imagine that we have a company, called mycompany.com. At our head  
-office, we are using the 192.168..0 reserved network, breaking the  
-class B into 256 class C networks to allow routing. We have just set up  
-two small remote offices, and want to add them to our network. We also  
-want to allow employees who work from home to be able to use their DSL  
-and cable modem connections instead of making them use dialup. To  
-start, we need to plan things out a little.  
-  
-  
-  
-  
-I decide that I want to give each remote office a class C network range  
-to allow them to expand as necessary. So, I reserve the 192.168.10.  
-and 192.168.11.0 nets. I also decide that for home users, I've got  
-enough numbers that I don't need to masquerade them on the VPN server  
-side. Each client gets it's own internal IP. So, I need to reserve  
-another class C for that, say 192.168.40.. The only thing that I must  
-now do is to add these ranges to my router. Let's imagine that our  
-company owns a small Cisco (192.168.254.254) that handles all of the  
-traffic through our OC1. Just set routes on the Cisco such that traffic  
-headed to these reserved nets goes to our VPN server (192.168.40.254).  
-I put the VPN server into the home user's net for reasons that should  
-become clear later. We'll name the external interface of the server  
-vpn.mycompany.com, and the internal vpn-internal.mycompany.com.  
-  
-  
-  
-  
-As for external numbers, we don't need to know them explicitly. You  
-should have your own numbers, supplied by your ISP.  
-  
-  
-----  
-!!!5.2. Gather the tools  
-  
-We will need a few pieces of software. Get the following  
-packages, and install them where specified.  
-  
-  
-----  
-!!5.2.1. For the Server:  
-  
-  
-  
-  
-  
-  
-  
-****  
-  
-pppd (version 2.3 or greater)  
-  
-  
-  
-****  
-****  
-  
-ssh (version 1.2.26 or better)  
-  
-  
-  
-****  
-  
-  
-----  
-!!5.2.2. For the Client:  
-  
-  
-  
-  
-  
-  
-  
-****  
-  
-pppd (same version as server)  
-  
-  
-  
-****  
-****  
-  
-ssh  
-  
-  
-  
-****  
-****  
-  
-pty-redir  
-  
-  
-  
-****  
-  
-  
-----  
-!!!5.3. Server: Build the kernel  
-  
-To start, you probably need to rebuild your kernel for the server.  
-You need to make sure that the following kernel options are turned on in  
-addition to basic networking and everything else that you might need. If  
-you've never built your own kernel before, read the Kernel HOWTO.  
-  
-  
-  
-For 2.0 kernels:  
-  
-  
-  
-  
-  
-****  
-  
-CONFIG_FIREWALL  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_FORWARD  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_FIREWALL  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_ROUTER  
-  
-  
-  
-****  
-****  
-  
-CONFIG_PPP  
-  
-  
-  
-****  
-  
-  
-  
-  
-For 2.2 kernels:  
-  
-  
-  
-  
-  
-****  
-  
-CONFIG_FIREWALL  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_ADVANCED_ROUTER  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_FIREWALL  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_ROUTER  
-  
-  
-  
-****  
-****  
-  
-CONFIG_PPP  
-  
-  
-  
-****  
-  
-  
-----  
-!!!5.4. Server: Configure Networking  
-  
-If you are building a server that has only one network card, I suggest  
-that you think about buying another, and rewiring your network. The  
-best way to keep your network private is to keep it on it's own wires.  
-So if you do have two network cards, you'll need to know how to  
-configure both of them. We'll use eth0 for the external interface, and eth1 for  
-the internal interface.  
-  
-  
-----  
-!!5.4.1. Configuring the interfaces  
-  
-We first should configure the external interface of the server. You  
-should already know how to do this, and probably already have it done.  
-If you don't, then do so now. If you don't know how, go back and read  
-the Networking HOWTO  
-  
-  
-  
-  
-Now we bring up the internal interface. According to the numbers that  
-we've chosen, the internal interface of the server is 192.168.40.254.  
-so we have to configure that interface.  
-  
-  
-  
-  
-For 2.0 kernels, use the following:  
-  
-  
-  
-# /sbin/ifconfig eth1 192.168.40.254 netmask 255.255.255.0 broadcast 192.168.40.255  
-# /sbin/route add -net 192.168.40.0 netmask 255.255.255.0 dev eth1  
-  
-  
-For 2.2 kernels, use the following:  
-  
-  
-  
-# /sbin/ifconfig eth1 192.168.40.254 netmask 255.255.255.0 broadcast 192.168.40.255  
-  
-  
-That gets our basic interfaces up. You can now talk to machines on  
-both local networks that are attached to the server.  
-  
-  
-----  
-!!5.4.2. Setting routes  
-  
-We can now talk to machines on our local nets, but we can't get to the rest  
-of our internal network. That requires a few more lines of code. In order  
-to reach the other machines on other subnets, we need have a route that tells  
-traffic to go to the Cisco router. Here's that line:  
-  
-  
-  
-# /sbin/route add -net 192.168..0 gw 192.168.254.254 netmask 255.255..0 dev eth1  
-  
-  
-That line tells the kernel that any traffic destined for the 192.168..0 network  
-should go out eth1, and that it should be handed off to the Cisco. Traffic for  
-our local net still gets where it is supposed to because the routing tables  
-are ordered by the size of the netmask. If we were to have other internal nets  
-in our network, we would have a line like the above for each net.  
-  
-  
-----  
-!!5.4.3. Making filter rules  
-  
-Now that we can reach every machine that we could need to, we need to write  
-the firewall filtering rules that allow or deny access through the VPN server.  
-  
-  
-  
-  
-To set the rules with __ipfwadm__, run it like so:  
-  
-  
-  
-# /sbin/ipfwadm -F -f  
-# /sbin/ipfwadm -F -p deny  
-# /sbin/ipfwadm -F -a accept -S 192.168.40./24 -D 192.168../16  
-# /sbin/ipfwadm -F -a accept -b -S 192.168.10./24 -D 192.168../16  
-# /sbin/ipfwadm -F -a accept -b -S 192.168.11./24 -D 192.168../16  
-  
-  
-To set the rules with __ipchains__, run it like so:  
-  
-  
-  
-# /sbin/ipchains -F forward  
-# /sbin/ipchains -P forward DENY  
-# /sbin/ipchains -A forward -j ACCEPT -s 192.168.40./24 -d 192.168../16  
-# /sbin/ipchains -A forward -j ACCEPT -b -s 192.168.10./24 -d 192.168../16  
-# /sbin/ipchains -A forward -j ACCEPT -b -s 192.168.11./24 -d 192.168../16  
-  
-  
-This tells the kernel to deny all traffic except for the traffic that is coming  
-from the 192.168.40./24 network and destined for the 192.168../16 network. It  
-also tells the kernel that traffic going between the 192.168.10./24 and  
-192.168../16 nets is allowed, and the same for the 192.168.11.0 net. These  
-last two are bidirectional rules, this is important for getting the routing  
-to work going both ways.  
-  
-  
-----  
-!!5.4.4. Routing  
-  
-For home users, everything will work fine to here. However  
-for the remote offices, we need to do some routing. First of all, we  
-need to tell the main router, or Cisco, that the remote offices are  
-behind the VPN server. So specify routes on the Cisco that tell  
-it to send traffic destined for the remote offices to the VPN server.  
-Now that that is taken care of, we must tell the VPN server what to do  
-with the traffic destined for the remote offices. To do this, we run the  
-__route__ command on the server. The only problem is that in order  
-for the __route__ command to work, the link must be up, and if  
-it goes down, the route will be lost. The solution is to add the routes  
-when the clients connects, or more simply, to run the route command frequently  
-as it's not a problem to run it more than is necessary. So, create a script  
-and add it to your crontab to be run every few minutes, in the script, put the  
-following:  
-  
-  
-  
-/sbin/route add -net 192.168.11.0 gw 192.168.10.253 netmask 255.255.255.  
-/sbin/route add -net 192.168.10.0 gw 192.168.11.253 netmask 255.255.255.  
-----  
-!!!5.5. Server: Configure __pppd__  
-  
-Now we will configure pppd on the server to handle VPN connections. If  
-you are already using this server to handle dialup users or even dialing  
-out yourself, then you should note that these changes may affect those  
-services. I go over how to avoid conflicts at the end of this section.  
-  
-  
-----  
-!!5.5.1. /etc/ppp/  
-  
-This directory may contain a number of files. You probably already  
-have a file called options. This file holds all of the global  
-options for __pppd__. These options cannot be overridden by __pppd__ on the  
-command line.  
-  
-  
-----  
-!!5.5.2. /etc/ppp/options  
-  
-Your options file should contain at least the following:  
-  
-  
-  
-ipcp-accept-local  
-ipcp-accept-remote  
-proxyarp  
-noauth  
-  
-  
-The first two lines tell __pppd__ to accept what the other end specifies  
-for IP addresses. This is necessary when hooking up remote offices, but can  
-be disabled if you are only connecting home users. It's okay to leave it on, as  
-it does not prevent the server from assigning addresses, it only says it that  
-it's okay to accept what the client asks for.  
-  
-  
-  
-  
-The third line is very important. From the __pppd__ man page:  
-  
-  
-  
-proxyarp  
-Add an entry to this system's ARP [[Address Resolu-  
-tion Protocol] table with the IP address of the  
-peer and the Ethernet address of this system. This  
-will have the effect of making the peer appear to  
-other systems to be on the local ethernet.  
-  
-  
-This is important because if it is not done, local traffic will not be able  
-to get back through the tunnel.  
-  
-  
-  
-  
-The last line is just as important. This tells __pppd__ to allow  
-connections without username and password. This is safe since authentication  
-is already handled by __sshd__.  
-  
-  
-----  
-!!5.5.3. Avoiding conflicts  
-  
-If you are handling other services with __pppd__, you should  
-consider that the configurations for these other services may not be the  
-same as what the VPN system needs. __pppd__ is designed such that  
-the options in the main options file /etc/ppp/options cannot be  
-overridden by options specified at runtime. This is done for security  
-reasons. In order to avoid conflict, determine which options cause the  
-conflict, and move them from the main file into a separate options file  
-that is loaded when the appropriate application of pppd is run.  
-  
-  
-----  
-!!!5.6. Server: Configure __sshd__  
-  
-The following is what my /etc/sshd_config file looks like. Yours  
-should look the same or similar:  
-  
-  
-  
-# This is the ssh server system wide configuration file.  
-Port 22  
-!ListenAddress ...  
-!HostKey /etc/ssh_host_key  
-!RandomSeed /etc/ssh_random_seed  
-!ServerKeyBits 768  
-!LoginGraceTime 600  
-!KeyRegenerationInterval 3600  
-!PermitRootLogin yes  
-!IgnoreRhosts yes  
-!StrictModes yes  
-!QuietMode no  
-!FascistLogging yes  
-!CheckMail no  
-!IdleTimeout 3d  
-X11Forwarding no  
-!PrintMotd no  
-!KeepAlive yes  
-!SyslogFacility DAEMON  
-!RhostsAuthentication no  
-RhostsRSAAuthentication no  
-RSAAuthentication yes  
-!PasswordAuthentication no  
-!PermitEmptyPasswords no  
-!UseLogin no  
-  
-  
-The important points to note are that password authentication is disabled  
-as are all of the "R" services. I have also turned off mail checking  
-and the message of the day as they can confuse __pppd__ on the client side.  
-I still allow root login, but as this can only be done with a key, it is adequately  
-safe.  
-  
-  
-----  
-!!!5.7. Server: Set up user accounts  
-  
-Now we'll set up the user accounts.  
-  
-  
-----  
-!!!5.8. Add __vpn-users__ group  
-  
-just run:  
-  
-  
-  
-# /usr/sbin/groupadd vpn-users  
-  
-  
-Now cat the /etc/group file and look at the last line. It should be  
-the entry for the vpn-users group. Note the third field. This is the group ID (GID).  
-Write it down, as we'll need it in a minute. For this example, the GID is 101.  
-  
-  
-----  
-!!!5.9. create the vpn-users home directory  
-  
-We're going to use a single home directory for all of the users. So just  
-run:  
-  
-  
-  
-# mkdir /home/vpn-users  
-----  
-!!!5.10. The .ssh directory  
-  
-Now create the .ssh directory in the vpn-users home  
-directory.  
-  
-  
-  
-# mkdir /home/vpn-users/.ssh  
-----  
-!!!5.11. Adding users  
-  
-Now comes the fun part. We're going to edit the /etc/passwd file  
-by hand. Normally you let the system handle this file, but for an unusual  
-setup like this, it is easier to do it yourself. To start, open the  
-/etc/passwd file and see what's in there. Here's an example of what  
-you might find:  
-  
-  
-  
-...  
-nobody:x:65534:100:nobody:/dev/null:  
-mwilson:x:1000:100:Matthew Wilson,,,:/home/mwilson:/bin/bash  
-joe:*:1020:101:Joe Mode (home),,,:/home/vpn-users:/usr/sbin/pppd  
-bill:*:1020:101:Bill Smith (home),,,:/home/vpn-users:/usr/sbin/pppd  
-frank:*:1020:101:Frank Jones (home),,,:/home/vpn-users:/usr/sbin/pppd  
-...  
-  
-  
-You'll find the first user on most any system. The second one is me.  
-After that are a few made up vpn-users. The first field is the username,  
-and the second is the password field. The third is user ID (UID) and the  
-fourth is the group ID (GID). After that comes some info on who the  
-people are in the fifth field. The sixth field is the user's home  
-directory, and the last is their shell. As you can see, each field is  
-separated by a colon. Look at the last three lines. The only difference  
-between them is the username in the first field, and the user info in  
-the fifth field. What we want to do is create lines like this for each  
-user. Don't just use one user for all of the connections, you'll never  
-be able to tell them apart if you do. So copy the last line of this  
-file and edit it so that it looks something like the above. Make sure  
-that the second field has an asterisk (*). The second field should be  
-unique to all the other IDs in the file. I used 1020. You should use a  
-number above 1000, since those below are typically reserved for system  
-use. The fourth field should be the group ID for vpn-users. I told you  
-to write it down, now is the time that you need it. So put the group ID  
-in there. Lastly, change the home directory to  
-/home/vpn-users, and the shell to /usr/sbin/pppd.  
-Now copy that line to make more users. Just edit the first  
-the fifth fields and you're set.  
-  
-  
-----  
-!!!5.12. Server: Administration  
-  
-One of the advantages to using this system for user accounts is that you  
-can take advantage of the UNIX user administration commands. Since each client  
-is logged in as a user, you can use standard methods to get user statistics.  
-The following are a few commands that I like to use to see what all is going on.  
-  
-  
-  
-  
-  
-  
-  
-  
-; who:  
-  
-Prints the users currently logged in, as well as when they logged in,  
-from where (name or IP), and on which port.  
-  
-  
-; w:  
-  
-This command prints a more extensive listing of who is currently logged  
-in. It also tells you uptime and load averages for the system. It also lists  
-the user's current process (which should be -pppd for VPN clients) as well  
-as idle time, and current CPU usage for all processes as well as the current  
-process. Read the w man page for more info.  
-  
-  
-; last [ [username ]:  
-  
-This lists the login history for the specified user, or for all users if  
-a username is not provided. It's most useful for finding out how well  
-the tunnels are running as it prints the length of time that the user  
-was logged in, or states that the user is still logged in. I should warn  
-you that on a system that has been up a long time, this list can grow  
-extremely long. Pipe is through grep or head to find  
-out exactly what you want to know.  
-  
-  
-  
-  
-  
-  
-  
-You can also control which users are allowed to connect by modifying the  
-/home/vpn-users/.ssh/authorized_keys file. If you remove the user's  
-public key line from this file, they won't be able to log in.  
-  
-  
-----  
-!!!5.13. Client: Build the kernel  
-  
-Now we move onto the client. First we must rebuild the kernel so that it can support  
-all of the functions that we need. The minimum requirement is to have ppp in the  
-kernel. You will need forwarding, a firewall, and a gateway only  
-if you are going to allow other machines access to the tunnel. For this example, I  
-will setup one of the remote office machines in my example layout. Add the following  
-options to your kernel. Again, if you've never built a kernel before, read the  
-Kernel HOWTO.  
-  
-  
-  
-For 2.0 kernels:  
-  
-  
-  
-  
-  
-****  
-  
-CONFIG_PPP  
-  
-  
-  
-****  
-****  
-  
-CONFIG_FIREWALL  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_FORWARD  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_FIREWALL  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_ROUTER  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_MASQUERADE  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_MASQUERADE_ICMP  
-  
-  
-  
-****  
-  
-  
-  
-  
-For 2.2 kernels:  
-  
-  
-  
-  
-  
-****  
-  
-CONFIG_PPP  
-  
-  
-  
-****  
-****  
-  
-CONFIG_FIREWALL  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_ADVANCED_ROUTER  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_FIREWALL  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_ROUTER  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_MASQUERADE  
-  
-  
-  
-****  
-****  
-  
-CONFIG_IP_MASQUERADE_ICMP  
-  
-  
-  
-****  
-  
-  
-----  
-!!!5.14. Client: Configure Networking  
-  
-Now we should setup the networking on our client box. Let's assume that  
-we've configured the external network and that it works. Now we will configure  
-the internal interface of the client to service our intranet.  
-  
-  
-----  
-!!5.14.1. Interface  
-  
-We need to first bring up the internal network interface. To do this,  
-add the following to your /etc/rc.d/rc.inet1 (or equivalent) file:  
-  
-  
-  
-  
-For 2.0 Kernels:  
-  
-  
-  
-/sbin/ifconfig eth1 192.168.10.253 broadcast 192.168.10.255 netmask 255.255.255.  
-/sbin/route add -net 192.168.10.0 netmask 255.255.255.0 dev eth1  
-  
-  
-For 2.2 Kernels:  
-  
-  
-  
-/sbin/ifconfig eth1 192.168.10.253 broadcast 192.168.10.255 netmask 255.255.255.  
-----  
-!!5.14.2. Filter rules  
-  
-To set up the remote office, we will want to set up our filter rules  
-that allow traffic to go both directions through the tunnel. Add the following  
-lines to your /etc/rc.d/rc.inet1 (or equivalent) file:  
-  
-  
-  
-  
-For 2.0 kernels:  
-  
-  
-  
-/sbin/ipfwadm -F -f  
-/sbin/ipfwadm -F -p deny  
-/sbin/ipfwadm -F -a accept -b -S 192.168.10./24 -D 192.168../16  
-  
-  
-For 2.2 kernels:  
-  
-  
-  
-/sbin/ipchains -F forward  
-/sbin/ipchains -P forward DENY  
-/sbin/ipchains -A forward -j ACCEPT -b -s 192.168.10./24 -d 192.168../16  
-  
-  
-You may have noticed that these lines look like what we have  
-on the server. That's because they are the same. These rules  
-just say where traffic is allowed to go between these  
-two networks.  
-  
-  
-----  
-!!5.14.3. Routing  
-  
-The only extra routes that are needed are created by the script  
-that bring the tunnel up.  
-  
-  
-----  
-!!!5.15. Client: Configure __pppd__  
-  
-You may not need to edit the client's /etc/ppp/options file at  
-all. You will if the "auth" option is present, or some of the other  
-priveledged options. Try it, and if it fails, a black  
-/etc/ppp/options will work. just keep adding the options from  
-the old file to figure out which one broke it (if it's not obvious) and  
-see if you can get around that. Maybe you don't need them at all. You  
-probably don't if you don't use __pppd__ for anything else.  
-  
-  
-----  
-!!!5.16. Client: Configure __ssh__  
-  
-As root on the client, run the following lines:  
-  
-  
-  
-# mkdir /root/.ssh  
-# ssh-keygen -f /root/.ssh/identity.vpn -P ""  
-  
-  
-This will create two files, identity.vpn and identity.vpn.pub in the  
-.ssh directory. The first is your private key, and should be kept such.  
-''Never send this over the net'' unless it is via an encrypted session. The  
-second file is your public key, and you can send this anywhere you want, it only  
-serves to allow you access to other systems, and cannot be used to get into your  
-own. It is a text file with one line in it that is your actual key. At the end  
-of the line is the comment field which you may change without fear of breaking  
-the key. an example key looks something like this:  
-  
-  
-  
-1024 35 1430723736674162619588314275167.......250872101150654839 root@vpn-client.mycompany.com  
-  
-  
-It's actually a lot longer than that, but it wouldn't fit on the page if I  
-showed the whole thing. Copy your key into the /home/vpn-users/.ssh/authorized_keys  
-file on the server. Make sure that there is only one key per line, and  
-that each key is not broken onto multiple lines. You may alter  
-the comment field all that you like in order to help you remember which  
-line goes with which user. I highly recommend doing so.  
-  
-  
-----  
-!!!5.17. Client: Bring up the connection  
-  
-Now we'll try to actually make the connection to the VPN server. First  
-we'll need to make a single connection to set up the __ssh__ known_hosts  
-file. Run this:  
-  
-  
-  
-# ssh vpn.mycompany.com  
-  
-  
-Answer "yes" when it asks you if you want to continue connecting. The  
-server will tell you "permission denied", but that's okay. It's  
-important that you use the same name for the server that you are using  
-in your connection scripts. Now run the following lines. You will  
-obviously need to change the options to suit your setup.  
-  
-  
-  
-# /usr/sbin/pty-redir /usr/bin/ssh -t -e none -o 'Batchmode yes' -c blowfish -i /root/.ssh/identity.vpn -l vpn-user vpn.mycompany.com b /tmp/vpn-device  
-(now wait about 10 seconds)  
-# /usr/sbin/pppd `cat /tmp/vpn-device` 192.168.10.254:192.168.40.254  
-  
-  
-Note the IP addresses specified on the __pppd__ line. The first is the  
-address of the client end of the tunnel. The second is the address of  
-the server end of the tunnel, which is set to the server's internal  
-address. If all of that seemed to work, move on. If not, check that you  
-have all of the options, and that they are spelled right. If something  
-is still going wrong, check Section 6.1.  
-  
-  
-----  
-!!!5.18. Client: Set the routes  
-  
-Now set the route to send traffic through the tunnel. Just run this:  
-  
-  
-  
-# /sbin/route add -net 192.168..0 gw vpn-internal.mycompany.com netmask 255.255..  
-  
-  
-You should now be able to communicate with machines on the other side of  
-the tunnel. Give it a try. If it doesn't work, try using  
-__ping__ and __traceroute__ to figure out where your problem  
-might be. If in fact it does work, move on to setting up scripts to do  
-the work for you.  
-  
-  
-----  
-!!!5.19. Client: Scripting  
-  
-Use the vpnd script. Only you may need to  
-modify it a little. Make the following changes:  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-****  
-  
-Change the variables at the top to match your setup. Most should be just  
-fine as they are, but you can change them should you need to.  
-  
-  
-  
-****  
-****  
-  
-Line 27: add the local and remote IP addresses before $PPP_OPTIONS  
-  
-  
-  
-****  
-****  
-  
-Line 31: Change this line, and the two after it to set routes for  
-your internal nets.  
-  
-  
-  
-****  
-  
-  
-----  
-!!5.19.1. Keeping it running  
-  
-While bash scripts are generally stable, they have been known to fail.  
-In order to make sure that the __vpnd__ script keeps running, add  
-an entry to the client's crontab that runs the __check-vpnd__  
-script. I run mine every 5 minutes or so. If __vpnd__ is indeed  
-running, __check-vpnd__ doesn't use much CPU.  
-  
-  
-----  
-!!!Chapter 6. Addenda  
-!!!6.1. Pitfalls  
-  
-Here are just a few of the snags that I've run into while using this  
-system. I put them here so that you can hopefully avoid them. If you  
-run into any new ones, please email them to me so that I can keep track, and help others avoid  
-them.  
-  
-----  
-!!6.1.1. read: I/O error  
-  
-This error is associated with mis-matched  
-versions off pppd. If you get it, try upgrading both ends of the  
-connection to the latest version of pppd. I've found that pppd version  
-2.2 has this problem, so use version 2.3.7 or 2.3.8 instead.  
-  
-  
-----  
-!!6.1.2. SIOCADDRT: Network is unreachable  
-  
-This error is generated by __route__. I've seen it happen when the  
-sleep time between __ssh__ and __ppd__ is not long enough. If  
-you get this error, run __ifconfig__, and you may see that there is no  
-pppX interface. This means that __ssh__ was not done  
-authenticating before __pppd__ was launched, and therefore  
-__pppd__ did not make the connection. just increase the delay, and  
-your problems will be solved.  
-  
-  
-  
-  
-I wonder however if there might be some pppd option that will fix this  
-problem.  
-  
-  
-----  
-!!6.1.3. IPv4 Forwarding and 2.2 kernels  
-  
-In the new 2.2 kernel, you must specifically enable IP forwarding in the  
-kernel at boot up. This with the following command:  
-  
-  
-  
-# echo 1 b /proc/sys/net/ipv4/ip_forward  
-  
-  
-Without this, the kernel will not forward any packets, and hence the  
-server will not work, nor will any of the gatewaying clients.  
-  
-  
-----  
-!!6.1.4. Routing  
-  
-It should go without saying, but be careful when you are routing real numbers  
-that you don't route traffic destined for the VPN server's external address  
-through the tunnel. It won't make it. (yes, this ''is'' from personal  
-experience.)  
-  
-  
-----  
-!!!6.2. Hardware and Software Requirements  
-!!6.2.1. Minimum Hardware Requirements  
-  
-This system has been run on a 486SX33 with 8  
-megabytes of RAM. It didn't run very well though, it had trouble  
-handling heavy traffic.  
-  
-  
-  
-  
-It doesn't take much more to make it work though. This system does work  
-very well on a Pentium 75 with 16 megs of RAM, using an LRP distribution  
-running off of a floppy, with a 6 meg ramdisk, and 10 megs of main  
-memory. I've tested this setup by running a 700kbit !RealVideo stream  
-through it for over an hour.  
-  
-  
-  
-  
-I now typically run it on Pentium 90s, as their PCI clocking plays  
-nicer with cheap 100Mbit Ethernet cards.  
-  
-  
-----  
-!!6.2.2. Software Requirements  
-  
-This system works with both the 2.0 and 2.2 kernels. The script to keep  
-the tunnel up requires a reasonably modern bash. I have however noticed  
-that certain distribution's versions of bash don't play too well with  
-the script.  
-  
-  
-  
-  
-Also, if someone could help me refine my scripts (or even write an  
-executable) that would help a lot. I'm not sure why, but even  
-my own bash doesn't follow the rules and doesn't seem to interpret  
-signals correctly. If you do make any improvements, please email me at  
-matthew@shinythings.com
+Describe [HowToVPNHOWTO ] here.