home *** CD-ROM | disk | FTP | other *** search
- The VPN HOWTO
- Arpad Magosanyi <mag@bunuel.tii.matav.hu> v0.1, 3 May 1997
-
- 1. Blurb
-
- This is the Linux VPN howto, a collection of information on how to set
- up a Virtual Protected Network in Linux (and other unices in general).
-
- 1.1. Copyright
-
- This document is part of the Linux HOWTO project. The copyright notice
- is the following: Unless otherwise stated, Linux HOWTO documents are
- copyrighted by their respective authors. Linux HOWTO documents may be
- reproduced and distributed in whole or in part, in any medium physical
- or electronic, as long as this copyright notice is retained on all
- copies. Commercial redistribution is allowed and encouraged; however,
- the author would like to be notified of any such distributions. All
- translations, derivative works, or aggregate works incorporating any
- Linux HOWTO documents must be covered under this copyright notice.
- That is, you may not produce a derivative work from a HOWTO and impose
- additional restrictions on its distribution. Exceptions to these rules
- may be granted under certain conditions; please contact the Linux
- HOWTO coordinator at the address given below. In short, we wish to
- promote dissemination of this information through as many channels as
- possible. However, we do wish to retain copyright on the HOWTO
- documents, and would like to be notified of any plans to redistribute
- the HOWTOs. If you have questions, please contact Greg Hankins, the
- Linux HOWTO coordinator, at gregh@sunsite.unc.edu via email.
-
- 1.2. Disclaimer
-
- As usual: the author not responsible for any damage. For the correct
- wording, see the relevant part of the GNU GPL 0.1.1
-
- 1.3. Disclaimer
-
- We are dealing with security: you are not safe if you haven't got good
- security policy, and other rather boring things.
-
- 1.4. State of this document
-
- This is very preliminary. You should have thorough knowledge of
- administrating IP, at least some knowledge of firewalls, ppp and ssh.
- You should know them anyway if you want to set up a VPN. I just
- decided to write down my experiences not to forget them. There are
- possibly some security holes indeed. To be fair I've tried it on hosts
- configured as routers not firewalls, saying: It's simple from that
- point.
-
- 1.5. Related documentations
-
- o The Linux Firewall-HOWTO /usr/doc/HOWTO/Firewall-HOWTO
-
- o The Linux PPP-HOWTO /usr/doc/HOWTO/PPP-HOWTO.gz
-
- o The ssh documentations /usr/doc/ssh/*
-
- o The Linux Network Admins' Guide
-
- o NIST Computer Security Special Publications
- http://csrc.ncsl.nist.gov/nistpubs/
-
- o Firewall list (majordomo@greatcircle.com)
-
- 2. Introduction
-
- As firewalls are in more and more widely use in internet and intranet
- security, the ability to do nice VPNs is important. Here are my
- experiences. Comments are welcome.
-
- 2.1. Naming conventions
-
- I will use the terms "master firewall" and "slave firewall", though
- making a VPN has nothing to do with client-server architecture. I
- simply refer to them as the active and passive participants of the
- connection's setup. The host which is starts the setup will be
- referred as the master, and the passive participant will be the slave.
-
- 3. Doing it
-
- 3.1. Planning
-
- Before you start to set up your system, you should know the networking
- details. I assume you have two firewalls protecting one intranet per
- firewall, and they are both connected to the internet. So now you
- should have two network interfaces (at least) per firewall. Take a
- sheet of paper, write down their IP addresses and network mask. You
- will need one more IP adresses per firewall for the VPN you want to do
- now. Those addresses should be outside of your existing subnets. I
- suggest using addresses from the "private" address ranges. They are
- the followings:
-
- o 10.0.0.0 - 10.255.255.255
-
- o 172.16.0.0 - 172.31.255.255
-
- o 192.168.0.0 - 192.168.255.255
-
- For the sake of example, here's a sample configuration: The two
- bastions are called fellini and polanski. They have one interface for
- the internet (-out), one for the intranet (-in), and one for the vpn
- (-vpn). The addresses and netmasks:
-
- o fellini-out: 193.6.34.12 255.255.255.0
-
- o fellini-in: 193.6.35.12 255.255.255.0
-
- o fellini-vpn: 192.168.0.1 point-to-point
-
- o polanski-out: 193.6.36.12 255.255.255.0
-
- o polanski-in: 193.6.37.12 255.255.255.0
-
- o polanski-vpn: 192.168.0.2 point-to-point
-
- So we have the plan.
-
- 3.2. Gathering the tools
-
- You will need a
-
- o Linux firewall
-
- o kernel
-
- o very minimal configuration
-
- o ipfwadm
-
- o fwtk
-
- o Tools for the VPN
-
- o ssh
-
- o pppd
-
- o sudo
-
- o pty-redir
-
- Current versions:
-
- o kernel: 2.0.30. Use a stable kernel, and it must be newer than
- 2.0.20, because the ping'o'death bug.
-
- o base system: I prefer Debian. YMMV. You absolutely don't want to
- use any big packages, and you never even tought of using sendmail,
- of course. You also definitely don't want to enable telnet, ftp,
- and the 'r' commands (as usual in case of any other unix hosts).
-
- o ipfwadm: I've used 2.3.0 fwtk: I've used 1.3
-
- o ssh: >= 1.2.20. There are problems with the underlying protocol in
- the older versions.
-
- o pppd: I've used 2.2.0f for the tests, but I'm not sure if is it
- secure, this is why I turned the setuid bit off, and used sudo to
- launch it.
-
- o sudo: 1.5.2 the newest I am aware of
-
- o pty-redir: It is written by me. Try
- ftp://ftp.vein.hu/ssa/contrib/mag/pty-redir-0.1.tar.gz. Its version
- number is 0.1 now. Tell me it there is any problem with it.
-
- 3.3. Compile and install
-
- Compile or otherwise install the gathered tools. Look at every one's
- documentation (and the firewall-howto) for details. Now we have the
- tools.
-
- 3.4. Configure the other subsystems
-
- Configure your firewall rules, etc. You need to enable ssh traffic
- between the two firewll hosts. It means a connection to port 22 on the
- slave from the master. Start sshd on the slave and verify if you can
- login. This step is untested, please tell me your results.
-
- 3.5. Set up the accounts for the VPN
-
- Create an account on the slave firewall use your favourite tool (e.g.
- vi, mkdir, chown, chmod) you might create an account on the master
- also, but I think you want to set up the connection at boot time, so
- your ordinary root account will do. Can anyone point out risks on
- using the root account on the master?
-
- 3.6. Generate an ssh key for your master account
-
- Use the ssh-keygen program. Set empty password for the private key if
- you want to do automatic setup of the VPN.
-
- 3.7. Set up automatic ssh login for the slave account
-
- Copy the newly generated public key in the slave account under
- .ssh/authorized_keys, and set up file permissions like the following:
-
- drwx------ 2 slave slave 1024 Apr 7 23:49 ./
-
- drwx------ 4 slave slave 1024 Apr 24 14:05 ../
-
- -rwx------ 1 slave slave 328 Apr 7 03:04 authorized_keys
-
- -rw------- 1 slave slave 660 Apr 14 15:23 known_hosts
-
- -rw------- 1 slave slave 512 Apr 21 10:03 random_seed
-
- The first row being ~slave/.ssh, and the second is ~slave.
-
- 3.8. Tighten ssh security on the bastions.
-
- It means the followings on my setup in sshd_conf:
-
- PermitRootLogin no
-
- IgnoreRhosts yes
-
- StrictModes yes
-
- QuietMode no
-
- FascistLogging yes
-
- KeepAlive yes
-
- RhostsAuthentication no
-
- RhostsRSAAuthentication no
-
- RSAAuthentication yes
-
- PasswordAuthentication no
-
- PermitEmptyPasswords no
-
- Password authentication is turned off, so login is only possible with
- authorized keys. (You've turned off telnet and the 'r' commands of
- course).
-
- 3.9. Enable execution of ppp and route for both accounts.
-
- As the master account is the root in my case, it has nothing to do.
- For the slave account, the following lines appear in /etc/sudoers:
-
- Cmnd_Alias VPN=/usr/sbin/pppd,/usr/local/vpn/route
-
- slave ALL=NOPASSWD: VPN
-
- As you can see, I am using some scripts to set up ppp and the routing
- tables on the slave host.
-
- 3.10. Do the scripting
-
- On the master host there is a full-blown init script I am using:
-
- #! /bin/sh
-
- # skeleton example file to build /etc/init.d/ scripts.
-
- # This file should be used to construct scripts for /etc/init.d.
-
- #
-
- # Written by Miquel van Smoorenburg <miquels@cistron.nl>.
-
- # Modified for Debian GNU/Linux
-
- # by Ian Murdock <imurdock@gnu.ai.mit.edu>.
-
- #
-
- # Version: @(#)skeleton 1.6 11-Nov-1996 miquels@cistron.nl
-
- #
-
- PATH=/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin/X11/:
-
- PPPAPP=/home/slave/ppp
-
- ROUTEAPP=/home/slave/route
-
- PPPD=/usr/sbin/pppd
-
- NAME=VPN
-
- REDIR=/usr/local/bin/pty-redir
-
- SSH=/usr/bin/ssh
-
- MYPPPIP=192.168.0.1
-
- TARGETIP=192.168.0.2
-
- TARGETNET=193.6.37.0
-
- MYNET=193.6.35.0
-
- SLAVEWALL=polanski-out
-
- SLAVEACC=slave
-
- test -f $PPPD || exit 0
-
- set -e
-
- case "$1" in
-
- start)
-
- echo setting up vpn
-
- $REDIR $SSH -t -l $SLAVEACC $SLAVEWALL sudo $PPPAPP >/tmp/device
-
- TTYNAME=`cat /tmp/device`
-
- echo tty is $TTYNAME
-
- sleep 10s
-
- if [ ! -z $TTYNAME ]
-
- then
-
- $PPPD $TTYNAME ${MYPPPIP}:${TARGETIP}
-
- else
-
- echo FAILED!
-
- logger "vpn setup failed"
-
- fi
-
- sleep 5s
-
- route add -net $TARGETNET gw $TARGETIP
-
- ssh -l $SLAVEACC $SLAVEWALL sudo $ROUTEAPP
-
- ;;
-
- stop)
-
- ps -ax | grep "ssh -t -l $SLAVEACC " | grep -v grep | awk '{print $1}' | xargs kill
-
- ;;
-
- *)
-
- # echo "Usage: /etc/init.d/$NAME {start|stop|reload}"
-
- echo "Usage: /etc/init.d/$NAME {start|stop}"
-
- exit 1
-
- ;;
-
- esac
-
- exit 0
-
- The slave uses one script for routing setup (/usr/local/vpn/route):
-
- #!/bin/bash
-
- /sbin/route add -net 193.6.35.0 gw 192.168.0.1
-
- and its .ppprc consists of the following:
-
- passive
-
- 4. Look at what's happening:
-
- The master logs in into the slave, starts pppd, and redirects this all
- thing into a local pty. It consists of the following steps:
-
- o allocating a new pty
-
- o sshing into the slave
-
- o running pppd on the slave
-
- o the master runs pppd in this local pty
-
- o and sets up the routing table on the client.
-
- There are (not very tight) timing considerations involved, this is why
- that 'sleep 10s'.
-
- 5. Doing it by hand.
-
- 5.1. Logging in
-
- You've already tried if ssh works well, aren't you? If the slave
- refuses to log you in, read the logs. Perhaps there are problems with
- file permissions or the sshd setup.
-
- 5.2. Firing up ppp
-
- Log in into slave, and issue:
-
- sudo /usr/sbin/pppd passive
-
- You should see garbage coming at this point. If it works good, if not,
- there is some problem either with sudo, either with pppd. Look what
- the commands had said, and at the logs and at the /etc/ppp/options,
- and the .ppprc file. If it works, write this 'passive' word into
- .ppprc, and try again. To get rid off the garbage and continue
- working, press enter,'~' and '^Z'. You should have the master's
- prompt now, and kill %1. See the section about tuning if you want to
- know more of the escape character.
-
- 5.3. Together the two
-
- Well, then
-
- ssh -l slave polanski sudo /usr/sbin/pppd
-
- should work also, and deliver the garbage right into your face.
-
- 5.4. Pty redirecting
-
- Try to redirect this whole thing this time:
-
- /usr/local/bin/pty-redir /usr/bin/ssh -l slave polanski sudo /usr/sbin/pppd
-
- Nice long sentence isn't it? You should use the full path into the
- ssh executable, as the pty-redir program allows only this form for
- security reasons. Now you've got a device name from the program.
- Let's say, you've got /dev/ttyp0 You can use the ps command to look
- what has happened. Look for 'p0'
-
- 5.5. Is anything on the device?
-
- Try
-
- /usr/sbin/pppd /dev/ttyp0 local 192.168.0.1:192.168.0.2
-
- to establish the connection. Look at the output of the ifconfig
- command to see if the device has established, and use ping to check
- your virtual net.
-
- 5.6. Setting up the routes
-
- Set up the routes on the master host, and on the slave also. Now you
- should be able to ping one host in one intranet from other host in the
- other intranet. Set up the additional firewalling rules. Now as you
- have the VPN, you can set up the rules concerning the connectivity of
- the two intranets.
-
- 6. Tuning
-
- 6.1. Configuration tuning
-
- As I said this HOWTO is mainly a quick memo on how I had set up a VPN.
- There are things in the configuration I didn't experiment yet. These
- things will go into their place when I try them, or anyone tells me
- "it works in the following way" The most important thing is that the
- connection ppp uses is not 8-bit yet. I believe it has something to do
- either with ssh configuration or the pty setup. In this configuration
- ssh uses the tilde (~) character as an escape character. It might stop
- or slow down the communication, as any newline-tilde sequence causes
- ssh to give a prompt. Ssh documentation said: <On most systems,
- setting the escape character to ``none'' will also make the session
- transparent even if a tty is used.> The corresponding flag to ssh is
- '-e', and you can also set it in the configuration file.
-
- 6.2. Bandwith vs. cicles
-
- Creating anything virtual comes with utilization of real-world
- resources. A VPN eats up bandwidth and computing resources. The goal
- would be to get balance between the two. You can tune it with the '-C'
- switch or the 'CompressionLevel' option. You might try using another
- cipher, but I don't recommend it. Also note that the round-trip-time
- can be longer if you use better compression. Any experiments on it are
- welcome.
-
- 7. Vulnerability analisis
-
- I try to cover here the vulnerability issues arising from this
- particular setup and VPNs in general. Any comments are warmly welcome.
-
- o sudo: Well, I'm excessively using sudo. I believe it's still safer
- than using setuid bits. It's still a backdraw of Linux that it
- hasn't got more fine-grained access control. Waiting for POSIX.6
- compatibility <http://www.xarius.demon.co.uk/software/posix6/>.
- What is worse, there are shell scripts which are getting called
- through sudo. Bad enough. Any idea out there?
-
- o pppd: It runs suid root also. It can be configured by user's
- .ppprc. There might be some nice buffer overruns in it. The bottom
- line: secure your slave account as tightly as you can.
-
- o ssh: Beware that ssh older than 1.2.20 has security holes. What is
- worse, we made a configuration such when the master account had
- been compromised, the slave account is also compromised, and wide
- open to attacks using the two sudoed programs. It is because I've
- choosen not to have password on the master's secret key to enable
- automatic setup of the VPN.
-
- o firewall: With inproperly set firewall rules on one bastion, you
- open both of the intranets. I recommend using IP masquerading (as
- setting up incorrect routes is a bit less trivial), and doing hard
- control on the VPN interfaces.
-
-