Differences between version 3 and predecessor to the previous major change of HowToFirewallPiercing.
Other diffs: Previous Revision, Previous Author, or view the Annotated Edit History
Newer page: | version 3 | Last edited on Thursday, October 21, 2004 4:55:14 pm | by AristotlePagaltzis | Revert |
Older page: | version 2 | Last edited on Friday, June 7, 2002 1:06:35 am | by perry | Revert |
@@ -1,1168 +1 @@
-Firewall Piercing mini-HOWTO
-!!!Firewall Piercing mini-HOWTO
-!François-René Rideau
-
-v0
.97, 24 November 2001
-
-
-__Revision History__Revision v0.972001-11-24Revised by: frrConversion to !DocBook SGML.
-
-
-
-
-
-Directions for using __ppp__ over __ssh__,
-__telnet__ or whatever,
-so as to do achieve transparent network connection accross a firewall.
-Applies to friendly VPN construction
-as well as to piercing unfriendly firewalls.
-
-
-
-
-
-----; __Table of Contents__; 1. Stuff: ; 1.1. DISCLAIMER; 1.2. Legal Blurp; 1.3. Looking for a maintainer; 1.4. Credits; 1.5. Latest versions; 2. Introduction: ; 2.1. Foreword; 2.2. Security issues; 2.3. Other requirements; 2.4. Downloading software; 3. Understanding the problem: ; 3.1. Giving names to things; 3.2. The main problem; 3.3. The secondary problem; 4. Secure solution: piercing using ssh: ; 4.1. Principle; 4.2. A sample session; 5. Unsecure solution: piercing using telnet: ; 5.1. Principle; 5.2. fwprc; 5.3. .fwprcrc; 6. Routing: ; 6.1. The catch; 6.2. Example of routing; 7. Reverse piercing: ; 7.1. Rationale; 7.2. Getting the trigger message; 7.3. Other automated tools for reverse piercing; 8. Final notes: ; 8.1. Other settings; 8.2. HOWTO maintenance; 8.3. Related Documents; 8.4. Final Word; 8.5. Extra copy of IMPORTANT DISCLAIMER --- BELIEVE IT!!!
-!!!1. Stuff
-!!1.1. DISCLAIMER
-
-''READ THIS IMPORTANT SECTION !!!''
-
-
-
-''I hereby disclaim all responsibility
-for ''your'' use of this hack.
-If it backfires on you in any way whatsoever,
-that's the breaks. Not my fault.
-If you don't understand the risks inherent in doing this, don't do it.
-If you use this hack and it allows vicious vandals
-to break into your company's computers and costs you your job and
-your company millions of dollars, well that's just tough nuggies.
-Don't come crying to me.''
-
-----
-!!1.2. Legal Blurp
-
-Copyright © 1998-2001 by François-René Rideau.
-
-
-
-This document is free software published under the
-bugroff license.
-
-
-
-To ease their task, it has also been released
-to the LDP maintainers under the
-GNU Free Documentation License.
-
-----
-!!1.3. Looking for a maintainer
-
-I have stopped actively developing this mini-HOWTO,
-although I'm still maintaining it.
-I'm looking for a maintainer to take over this document,
-who would extend it into a full-fledged HOWTO
-by expanding on the solutions whose existence I only mention,
-and who would maybe develop software to make it easier to pierce firewalls.
-I have a lot of ideas to expand this HOWTO and write according software,
-if anyone is interested.
-I also used to write a french version of this HOWTO,
-but no one has been maintaining it anymore for a long time.
-
-----
-!!1.4. Credits
-
-Even though the only thing left is the disclaimers,
-this document owes a lot to the
-Term-Firewall mini-HOWTO
-by Barak Pearlmutter `bap@cs.unm.edub.
-Barak's mini-HOWTO relies on
-an ancient and no-more-supported program named Term
-(a great program in its time,
-and maybe still useful in some unhappy circumstances),
-as well as on peculiarities of a not-so-standard telnet implementation,
-that is, many obsolete and non-portable facts.
-Nevertheless, there was a necessity for a mini-HOWTO about piercing firewalls,
-and despite the limitations of its hacks,
-this mini-HOWTO was a model and an encouragement.
-
-
-
-I'd also like to congratulate
-Lars Brinkhoff `lars@nocrew.orgb
-and Magnus Lundström `logic@gore.nocrew.orgb
-for their fine http, mail and icmp tunnels.
-
-----
-!!1.5. Latest versions
-
-The latest official LDP version of this document is on:
-http://www.linuxdoc.org/HOWTO/mini/Firewall-Piercing.html
-
-
-
-The source of my latest official version of this document is on:
-http://fare.tunes.org/files/fwprc/
-
-
-
-The source of my latest working draft of this document is on:
-http://tunes.org/cgi-bin/cvsweb/fare/fare/www/articles/Firewall-Piercing.en.sgml
-
-----
-!!!2. Introduction
-!!2.1. Foreword
-
-This document has a moral. And the moral is:
-''a firewall cannot protect a network against its own internal users,
-and should not even try to.''
-
-
-
-When an internal user asks you system administrator
-to open an outbound port to an external machine,
-or an inbound port to an internal machine,
-then you should do it for him.
-Of course you should help the user to make sure
-that his transactions are secure, and that his software is robust.
-But a flat out denial of service is plain incompetence.
-For unless he is so firewalled as to be completely cut from the outside world,
-with no __ssh__, no __telnet__,
-no web browsing, no email, no dns, no __ping__,
-no phone line, no radio, no nothing,
-then the user can and will use firewall piercing techniques to access
-the machines he wants nonetheless,
-and the net result for security will be
-an unaudited connection with the outside world.
-So either you trust your users, after proper training and selection,
-or you shouldn't grant them access to the network at all - but then again,
-the role of a network administrator is usually to serve its users,
-so your goal should be the former rather than the latter.
-You can and you shall protect them from the outside world;
-you can and you shall protect your critical services from them;
-but you can't and you shall not protect them from themselves.
-
-
-
-Because there exists such things as system administrators
-who are either unresponsive, absent, overworked, plain incompetent,
-irresponsible, or more generally managed by incompetent people,
-it so happens that a user may find himself behind a firewall
-that he may cross, but only in awkward ways.
-This mini-HOWTO explains a generic and portable way
-to pierce tunnels into firewalls,
-by turning any thin, tiny trickle of bits
-into a full-fledged information superhighway,
-so the user can seamlessly use standard tools to access computers
-on the other side of the firewall.
-The very same technique can be used by competent system administrators
-to build virtual private networks (VPN).
-
-----
-!!2.2. Security issues
-
-Of course, if your sysadm has setup a firewall
-s/he might have a good reason,
-and you may have signed an agreement to not circumvent it.
-On the other hand, the fact that you can use
-telnet, the web, e-mail, or whatever other bidirectional information flux
-with the outside of the firewall
-(which is a prerequisite for the presented hacks to work)
-means that you are allowed to access external systems,
-and the fact that you can log into a particular external system
-somehow means you're allowed to do it, too.
-
-
-
-So this is all a matter of ''conveniently''
-using legal holes in a firewall,
-and allow generic programs to work from there with generic protocols,
-as opposed to requiring special or modified (and recompiled) programs
-going through lots of special-purpose proxies
-that be misconfigured by an uncaring or incompetent sysadm,
-or to installing lots of special-purpose converters
-to access each of your usual services (like e-mail)
-through ways supported by the firewall (like the web).
-
-
-
-Moreover, the use of a user-level IP emulator such as
-SLiRP
-should still prevent external attackers from piercing the firewall back
-in the other way, unless explicitly permitted by you
-(or they are clever and wicked,
-and root or otherwise able to spy you on the server host).
-
-
-
-All in all, the presented hack should be ''relatively'' safe.
-However, it all depends on the particular circumstances
-in which you set things up,
-and I can give no guarantee about this hack.
-Lots of things are intrinsically unsafe
-about any Internet connection, be it with this hack or not,
-so don't you assume anything is safe unless you have good reasons,
-and/or use some kind of encryption all the way.
-
-
-
-Let's repeat the basics of networking security:
-''you cannot trust anything about a connection
-more than you trust the hosts that can handle the unencrypted data'',
-including hosts on both ends of the connection,
-and all hosts that can intercept the communication,
-unless the communication is properly encrypted with secret keys.
-If you misplace your trust,
-your passwords may be stolen and used against you,
-your credit card number may be stolen and used against you,
-and you may be fired from your work for endangering the whole company.
-Tough nuggies.
-
-
-
-To sum it up, don't use this hack unless you know what you're doing.
-Re-read the disclaimer above.
-
-----
-!!2.3. Other requirements
-
-It is assumed that you know what you're doing,
-that you know about configuring a network connection,
-that in case of doubt, you will have read all relevant documentation
-(HOWTOs, manual pages, web pages, mailing-list archives,
-RFCs, courses, tutorials).
-
-
-
-It is assumed that you have shell accounts on both sides of the firewall,
-that you can somehow transmit packets of information both ways
-across the firewall (with __telnet__, __ssh__,
-e-mail, and the web being the ways currently known to work),
-and that you can let a daemon run as a background task on the server site
-(or benefit from and existing daemon,
-__sshd__, __telnetd__, or
-__sendmail__/__procmail__).
-
-
-
-It is assumed that you know or are willing to learn
-how to configure an IP emulator
-(__pppd__, __slirp__)
-or an Internet access daemon and its associated library
-(SOCKS, Term)
-on each side, according to your needs in terms of connectivity
-and to your access rights, with your recompiling some software if needed.
-
-
-
-Last but not least, so that you can use the hacks described in this document,
-it is assumed that you are root on the side of the firewall
-that needs full transparent IP access to the other side.
-Indeed, you'll want to run the PPP daemon on this side which
-allows for use the normal kernel packet routing facilities.
-In case you're not root on this side, your case is not desperate though:
-indeed, Barak Pearlmutter's
-Term-Firewall mini-HOWTO
-describes how to use Term,
-a purely userland program,
-to the end of piercing firewalls.
-Although there's no HOWTO, I suspect SOCKS
-could also be used as a way to pierce firewalls without have root privilege;
-I will gladly accept patches to this HOWTO that describe
-such a method of piercing firewalls.
-
-----
-!!2.4. Downloading software
-
-Most software named in this HOWTO should be available
-from your standard Linux distribution, possibly among contrib's.
-At least, the four first below are available in
-as .rpm and .deb packages.
-In case you want to fetch the latest sources
-(after all, one of the ends of the connection may not be running under Linux),
-use the addresses below:
-
-
-
-
-
-*
-
-__SLiRP__ can be found at
-http://blitzen.canberra.edu.au/slirp
-and/or
-ftp://www.ibc.wustl.edu/pub/slirp_bin/.
-
-
-*
-*
-
-__zsh__ can be found at
-http://www.zsh.org/.
-
-
-*
-*
-
-__ppp__ can be found at
-ftp://cs.anu.edu.au/pub/software/ppp/.
-
-
-*
-*
-
-__ssh__ can be found at
-http://www.openssh.com/.
-
-
-*
-*
-
-__fwprc__, __cotty__
-and __getroute.pl__ can be found at
-http://fare.tunes.org/files/fwprc/.
-
-
-*
-*
-
-__httptunnel__ can be found at
-http://www.nocrew.org/software/httptunnel/.
-
-
-*
-*
-
-__mailtunnel__ can be found at
-http://www.detached.net/mailtunnel/.
-
-
-*
-
-----
-!!!3. Understanding the problem
-
-Understanding a problem is the first half of the path to solving it.
-
-----
-!!3.1. Giving names to things
-
-If you want this hack to work for you,
-you'll have to get an idea of how it works,
-so that in case anything breaks,
-you know where to look for.
-
-
-
-The first step toward understanding the problem
-is to give a name to relevant concepts.
-
-
-
-As usual, we'll herein call "client" the machine
-that decides to initiate the connection,
-as well as programs and files on that machine.
-Conversely, we'll call "server" that waits for connections and accepts them,
-as well as programs and files on that machine.
-Firewall piercing is useful when the two machines are separated by a firewall,
-such that it is possible for the server to accept some kind of connections,
-whereas the client might or might not be able to accept any.
-A tunnel will be created between the two machines
-that allows full IP traffic despite the firewall.
-
-
-
-Usually, when piercing firewalls, the client is the machine behind a firewall:
-it has limited access to the internet,
-but can somehow open some kind of connection to the server.
-The server is a machine with full internet access,
-that will serve as a proxy for the client to access all of the internet.
-In a VPN, the firewall the roles might be reversed,
-with the client being on the internet, and
-the server serving as a proxy for the client to access some private network.
-
-----
-!!3.2. The main problem
-
-The main problem with firewall piercing is to create a tunnel:
-a continuous connection from the client machine
-to a server machine on the other side of the firewall,
-that allows for bidirectional exchange of information.
-Optionally, this connection should be a secure one.
-The secondary problem is to transform this connection
-into a full IP access for normal programs to use transparently.
-
-
-
-For the main problem, we'll assume that
-either (1) you can establish normal TCP/IP connections
-from the client side of the firewall to some port on a server machine
-where a sshd runs or can be set to run, or
-(2) you can somehow establish a telnet connection through a telnet proxy.
-In case you cannot, we will give you pointers
-to other software that allows you
-to pierce a tunnel accross a firewall.
-Although we only give a secure solution in the first case,
-you can hack your own secure solution in the other cases,
-if you understand the principle
-(if you don't, someone, e.g. I, can do it for you in exchange for money).
-
-----
-!!3.3. The secondary problem
-
-For the secondary problem,
-IP emulators (__pppd__ or SLiRP)
-are run on each side of the tunnel.
-
-
-
-On the side that wants full IP access to the other side,
-you'll want to run __pppd__.
-On the other side, you want to run __pppd__
-if you also want full IP access to the first side,
-or SLiRP if you want to prevent any access.
-Go to your usual __pppd__ or SLiRP
-documentation for more information,
-if you have specific needs not covered by the examples given below.
-
-
-
-Although this is conceptually trivial,
-it nonetheless requires a few silly tricks, so as to work, since
-(a) in case you're using some kind of programmed interactive shell session
-to start the server's IP emulator on either side, you need to correctly
-synchronize the start of the IP emulator on the other side,
-so as not to send garbage into the shell session,
-and
-(b) IP emulators are designed to be run on a "tty" interface
-so you have to convert your tunnel's interface into a tty one.
-
-
-
-Issue (a) is just your usual synchronization problem,
-and doesn't even exist if you use __ssh__,
-that transparently handles server's command launching.
-
-
-
-Issue (b) requires the use of a simple external utility.
-We wrote one, __cotty__ just for that purpose.
-
-
-
-`FLAME ONb
-
-
-
-Among the silly problems caused by __pppd__
-maintainers' shortmindedness (no more true in recent Linux versions),
-you can only run it through
-either a device in /dev or the current tty.
-You cannot run it through a pair of pipe
-(which would be the obvious design).
-This is fine for the server's __pppd__ if any,
-as it can use the __telnet__ or __ssh__
-session's tty;
-but for the client's __pppd__, this conflicts with
-the possible use of __telnet__
-as a way to establish a connection.
-
-
-
-Indeed, __telnet__, too wants to be on a tty;
-it behaves ''almost'' correctly with a pair of pipe,
-except that it will still insist on doing ioctl's to the current tty,
-with which it will interfere;
-using __telnet__ without a tty also causes race conditions,
-so that the whole connection will fail on "slow" computers
-(__fwprc__ .1 worked perfectly on a P/MMX 233,
-one time out of 6 on a 6x86-P200+, and never on a 486dx2/66).
-All in all, when using __telnet__,
-you need __cotty__ to run as a daemon
-to copy output from one tty on which runs __pppd__
-into another tty on which runs __telnet__, and conversely.
-
-
-
-If I find the sucker (probably a MULTICS guy,
-though there must have been UNIX people
-stupid enough to copy the idea)
-who invented the principle of "tty" devices
-by which you read and write from a "same" pseudo-file,
-instead of having clean pairs of pipes,
-I strangle him!
-
-
-
-`/FLAMEb
-
-----
-!!!4. Secure solution: piercing using ssh
-!!4.1. Principle
-
-Let's assume that your firewall administrator allows
-transparent TCP connections to some port on some server machine
-on the other side of the firewall
-(be it the standard SSH port 22, or an alternate destination port,
-like the HTTP port 80 or whatever),
-or that you somehow managed to get some port in one side of the firewall
-to get redirected to a port on the other side
-(using __httptunnel__, __mailtunnel__,
-some tunnel over __telnet__, or whatelse).
-
-
-
-Then, you can run an __sshd__ on the server side port,
-and connect to it with an __ssh__ on the client side port.
-On both sides of the __ssh__ connection,
-you run IP emulators ( __pppd__),
-and there you have your VPN, Virtual Public Network,
-that circumvents the stupid firewall limitations,
-with the added bonus of being encrypted for privacy
-(beware: the firewall administrator still knows the other end of the tunnel,
-and whatever authentication information you might have sent before to run
-__ssh__).
-
-
-
-The exact same technology can be used to build a VPN, Virtual Private Network,
-whereby you securely join physical sites into a one logical network
-without sacrificing security with respect to the transport network
-between the sites.
-
-----
-!!4.2. A sample session
-
-Below is a sample script for you to adapt to your needs.
-It uses the array feature of __zsh__,
-but you may easily adapt it to your favorite shell.
-Use option __-p__ for __ssh__
-to try another port than port 22
-(but then, be sure to run __sshd__ on same port).
-
-
-
-Note that the script supposes that __ssh__
-can login without your having to interactively type your password
-(indeed, it's controlling tty will be connected to __pppd__,
-so if it asks for a password, you lose).
-This can be done either by ssh keys in your
-#732/.ssh/authorized_keys
-that either do not require a password,
-or that you unlock using __ssh-agent__
-or __ssh-askpass__.
-See your SSH documentation.
-Actually, you might also use a __chat__ script
-to enter your password,
-but this is definitely ''not'' the Right Thing.
-
-
-
-If you are not __root__ on the server end,
-or simply if want to screen your client's network from outbound connections,
-you can use __slirp__ instead of __pppd__
-as the server's PPP emulator.
-Just uncomment the relevant line.
-
-
-
-
-#!/bin/zsh -f
-SERVER_ACCOUNT=root@server.fqdn.tld
-SERVER_PPPD="pppd ipcp-accept-local ipcp-accept-remote"
-#SERVER_PPPD="pppd" ### This usually suffices if it's in /usr/sbin/
-#SERVER_PPPD="/home/joekluser/bin/slirp ppp"
-CLIENT_PPPD=( pppd
-silent
-10..2.15:10..2.2
-### For debugging purposes, you may uncomment the following:
-# updetach debug
-### Another potentially useful option (see section on Routing):
-# defaultroute
-)
-$CLIENT_PPPD pty "ssh -t $SERVER_ACCOUNT $SERVER_PPPD"
-
-
-
-Note that default options from your /etc/ppp/options
-or #732/.slirprc
-may break this script, so remove any unwanted option from there.
-
-
-
-Also note that 10..2.2
-is the default setting for __slirp__,
-which might or not fit your specific setup.
-In any case, you should most likely be using some address in one
-of the ranges reserved by RFC 1918 for private networks:
-10.../8,
-172.16../12 or 192.168../16.
-The firewall-protected LAN might already be using some of them,
-and avoiding clashes is your responsibility.
-For more customization, please read the appropriate documentation.
-
-
-
-If your client's __pppd__ is old or non-linux (e.g. BSD)
-and hasn't got the __pty__ option, use
-
-cotty -d -- $CLIENT_PPPD -- ssh -t $SERVER_ACCOUNT $SERVER_PPPD
-Catches: don't put quotes around commands given to cotty,
-as they are just __exec()__'d as is,
-and don't forget to specify the full path for
-the server's __pppd__
-if it's not in the standard path setup by __ssh__.
-
-
-
-Automatic reconnection is left as an exercise to the reader
-(hint: the __nodetach__ option from __pppd__
-might help for that).
-
-----
-!!!5. Unsecure solution: piercing using telnet
-!!5.1. Principle
-
-If all you can do is __telnet__
-(because of a __telnet__ proxy),
-then this solution might be fit for you.
-
-
-
-The firewall-piercing program, __fwprc__,
-will use a "tty proxy", __cotty__,
-that opens two pseudo-tty devices,
-launches some command on each of those devices' slaves,
-and stubbornly copies every character that one outputs
-to the tty that serves as input of the other command.
-One command will be telnet connection to server site,
-and the other will be the client's __pppd__.
-__pppd__ can then open and control the telnet session
-with a chat script as usual.
-
-
-
-Actually, if your telnet proxy allows connection to an arbitrary port,
-and if you can reliably run a daemon on the server host
-(with a cron job to relaunch it in case of breakage),
-then you'd better write some program that will just connect
-a client side port to the server side port through the proxy,
-so you can use the above secure solution,
-possibly using some variant of
-
-ssh -t -o "!ProxyCommand ..."
-(if you submit it to me, I'll gladly integrate such a solution
-to the __fwprc__ distribution).
-
-
-
-Note: if you must use the unsecure telnet-based solution,
-be sure that nothing lies in your target account
-that you want to keep secret or untampered,
-since the password will be sent in clear text accross the Internet.
-If you can control these things, a one-time-password system,
-or an explicit cryptographic challenge system will enhance your security,
-although it will make automated connection scripts much more complex.
-
-----
-!!5.2. fwprc
-
-I wrote a very well self-documented script
-to pierce firewalls, __fwprc__,
-available from
-my site,
-together with __cotty__
-(which is required by __fwprc__ .2
-and later).
-At the time of my writing these lines, latest versions are
-__fwprc__ .3e and
-__cotty__ .4c.
-
-
-
-The name "fwprc" is voluntarily made unreadable and unpronounceable,
-so that it will confuse the incompetent paranoid sysadm
-who might be the cause of the firewall that annoys you
-(of course, there can be legitimate firewalls, too,
-and even indispensable ones;
-security is all a matter of ''correct'' configuration).
-If you must read it aloud, choose the worst way you can imagine.
-
-
-
-CONTEST! CONTEST! Send me an audio file
-with a digital audio recording of how you pronounce "fwprc".
-The worst entry will win a free upgrade and his name
-on the __fwprc__ 1.0 page!
-
-
-
-I tested the program in several settings,
-by configuring it through resource files.
-But of course, by Murphy's law, it will break for you.
-Feel free to contribute enhancements that will make life
-easier to other people who'll configure it after you.
-
-----
-!!5.3. .fwprcrc
-
-__fwprc__ can be customized through a file
-.fwprcrc
-meant to be the same on both sides of the firewall.
-Having several alternate configurations to choose from is sure possible
-(for instance, ''I'' do it),
-and is left as an exercise to the reader.
-
-
-
-To begin with, copy the appropriate section of __fwprc__
-(the previous to last) into a file named .fwprcrc
-in your home directory.
-Then replace variable values with stuff that fits your configuration.
-Finally, copy to the other host, and test.
-
-
-
-Default behavior is to use __pppd__ on the client,
-and __slirp__ on the server.
-To modify that, you can redefine the appropriate function
-in your .fwprcrc with such a line as:
-
-remote_IP_emu () { remote_pppd }
-
-
-
-Note that SLiRP
-is safer than __pppd__,
-and easier to have access to,
-since it does not require being root on the server machine,
-and needn't additional firewall configuration to prevent
-connections from the outside world into the firewalled network.
-The basic functionality in SLiRP works quite well,
-but I haven't managed to get some advertised pluses to work
-(like run-time controllability).
-Of course, since it is free software,
-feel free to hack the source
-so as to actually implement or fix whichever feature you need.
-
-----
-!!!6. Routing
-
-Piercing the firewall is not everything.
-You must also route the packets
-from the client side of the firewall to the server side.
-This section tackles the basic settings specific
-about routing accross a tunnel.
-For more detailed explanations of routing,
-see the relevant HOWTOs and man pages
-about networking, routing and masquerading.
-
-----
-!!6.1. The catch
-
-The catch is that although your network administration would tell you
-to setup your some router on your client side's as the default route,
-(this may be relevant if you want to have a specific route
-to the networks on the client of the firewall),
-you should setup PPP link as the route to the networks on the server side.
-
-
-
-In other words, your default route should point to a router
-on whichever side of the tunnel that gives you access to the Internet.
-
-
-
-Most importantly, packets sent to the server host as part of running the tunnel
-should be routed through your usual network
-(e.g. your default ethernet router);
-otherwise, your kernel will have problems,
-as it tries to route through the inside the tunnel
-the very packets that ought to constitute the outside of the tunnel.
-
-
-
-Thus, you'll have to setup correct routes
-in your network startup configuration.
-The precise location of your routing configuration data
-depends on your distribution, but it is typically
-under /etc/init.d/network
-or /etc/network/;
-similarly, your PPP configuration is typically
-in /etc/ppp/,
-and the proper place to configure its routes is usually
-in ip-up or ip-up.d/.
-(Tip: to identify your distribution-specific file locations,
-you must read the documentation of your distribution and otherwise
-RTFM;
-alternatively use __grep__ recursively
-on your /etc;
-at worst, trace what happens at boot time,
-as configured in your /etc/inittab.)
-
-
-
-When piercing a tunnel from a roaming laptop on the Internet
-into a protected network, the script __getroute.pl__
-(available from the __fwprc__ distribution)
-gives the current route to the server host that is the other end of the tunnel.
-
-
-
-Once you can route packets to the server side of the tunnel,
-you might want to setup your machine as a router for all your pals
-on the client side of the firewall, achieving a full-fledged shared VPN.
-This is not specific to Firewall-Piercing, so just you read
-the relevant HOWTOs about networking, routing and masquerading.
-Also, for security reasons, be sure to also setup
-a proper firewall on your machine,
-especially if you're going to be a router for other people.
-
-
-
-Finally, be reminded that if you're using __pppd__
-on the server end of the tunnel
-(as opposed to user-mode __slirp__),
-you will have to configure proper routes and firewall rules
-on the server side of the tunnel, too.
-
-----
-!!6.2. Example of routing
-
-In this example, your client machine is connected to a firewalled LAN
-through ethernet device eth0.
-Its IP address is 12.34.56.78;
-its network is 12.34.56./24;
-its router is 12.34.56.1.
-
-
-
-Your network administrator may have told you
-to use 12.34.56.1
-as default router, but you shouldn't.
-You should only use it as a route to the client side of the firewall.
-
-
-
-Let's suppose the client side of your firewall is made of networks
-12.34../16 and 12.13../16,
-and of host 11.22.33.44.
-To make them accessible through your client router,
-add these routes to your global network startup script:
-
-route add -net 12.34..0 netmask 255.255..0 gw 12.34.56.1
-route add -net 12.13..0 netmask 255.255..0 gw 12.34.56.1
-route add -host 11.22.33.44 gw 12.34.56.1
-You must also keep the route to the client's local network,
-necessary for linux kernel 2.0 and earlier,
-but but unnecessary for linux kernel 2.2 and later
-(that implicitly adds it during the __ifconfig__):
-
-route add -net 12.34.56.0 netmask 255.255.255.0 dev eth0
-On the other hand, you ''must'' remove
-any default route from your scripts.
-Delete or comment away a line like:
-
-route add default gw 12.34.56.1
-Note that it is also possible to remove the route from the running
-kernel configuration without rebooting, by the following command:
-
-route del default gw 12.34.56.1
-Then you can have __pppd__ setup a default route automatically
-when it starts by using its __defaultroute__ option.
-Alternatively, you can add it afterwards:
-
-route add default gw 10..2.2
-If you don't want __pppd__ as a default route,
-because the Internet access is available on your side of the firewall,
-and if you instead want network 98.76.48./20
-to be routed through the tunnel,
-except from host 98.76.54.32
-that serves as the other end of the tunnel,
-then add the following lines to your /etc/ppp/ip-up:
-
-route add -host 98.76.54.32 gw 12.34.56.1
-route add -net 98.76.48.0 netmask 255.255.240.0 gw 10..2.2
-If you're a laptop and your current LAN moves,
-and yet you want to keep your current route to 98.76.54.32,
-whatever it be, then use __getroute.pl__ as follows
-to automatically find the right gateway
-in the __route add -host__ command:
-
-$(getroute.pl 98.76.54.32)
-Note that if you have them in your /etc/hosts,
-you might use symbolic names instead of numerical IP addresses
-(and you might even use FQDN's, if you trust the DNS never to fail).
-
-----
-!!!7. Reverse piercing
-!!7.1. Rationale
-
-Sometimes, only one side of the firewall can launch telnet sessions
-into the other side; however, some means of communication is possible
-(typically, through e-mail).
-Piercing the firewall is still possible, by triggering with
-whatever messaging capability is available
-a telnet connection from the ``right'' side of the firewall to the other.
-
-
-
-__fwprc__ includes code to trigger such connections
-from an OpenPGP-authentified email message;
-all you need is add __fwprc__
-as a __procmail__ filter
-to messages using the protocol,
-(instructions included in __fwprc__ itself).
-Note however, that if you are to launch __pppd__
-with appropriate privileges,
-you might need create your own suid wrapper to become root.
-Instructions enclosed in __fwprc__.
-
-
-
-Also, authentified trigger does not remotely mean secure connection.
-You should really use __ssh__ (perhaps over telnet)
-for secure connections.
-And then, beware of what happens between the triggering of a telnet
-connection, and __ssh__ taking over that connection.
-Contribution in that direction welcome.
-
-----
-!!7.2. Getting the trigger message
-
-If you are firewalled, your mail may as well be in a central mailserver
-that doesn't do procmail filtering or allow telnet sessions.
-No problem! You can run __fetchmail__
-in daemon mode (or within a cron job)
-to poll your mailserver and deliver mail to your linux system
-which itself will have been configured to use __procmail__
-at delivery.
-Note that if you run __fetchmail__ as a background daemon,
-it will lock away any other fetchmail that you'd like to run
-only at other times, like when you open a __fwprc__;
-of course, if you can also run a fetchmail daemon as a fake user.
-Too frequent a poll won't be nice to either the mailserver or your host.
-Too infrequent a poll means you'll have to wait before the message gets read
-and the reverse connection gets established.
-I use two-minute poll frequency.
-
-----
-!!7.3. Other automated tools for reverse piercing
-
-Another way to poll for messages, when you don't have a mailbox,
-but do have outbound FTP access, is to use
-FTP tunnel.
-
-
-
-A tool to maintain a permanent connection between a firewalled host and
-an external proxy, so as to export services from the host to the world, is
-firewall tunnel.
-
-----
-!!!8. Final notes
-!!8.1. Other settings
-
-I have no idea how to pierce firewalls with lesser operating systems,
-but you can take one of these old disused computers
-(about anything with 8MB of RAM and an ethernet card should do),
-install Linux or BSD as on it, and pierce the firewall with it,
-while serving as a router for other machines running lesser OSes.
-See appropriate HOWTOs about routing, IP forwarding, NAT, etc.
-
-
-
-I don't know the details, but a promising tool to pierce firewalls is
-Chris Mason's Bouncer,
-which acts as a SOCKS-proxy-over-SSL.
-
-
-
-There are other kinds of firewalls
-than those that allow for direct ssh or telnet connections.
-As long as a continuous flow of packets
-may transmit information through a firewall in both directions,
-it is possible to pierce it;
-only the price of writing the piercer may be higher or lower.
-
-
-
-In a very easy case, we saw that you can just launch __ssh__
-over a pty master and do some __pppd__ in the slave tty.
-You may even want to do it without an adverse firewall,
-just so as to build a secure ``VPN'' (Virtual Private Network).
-The VPN mini-HOWTO
-gives all the details you need about this.
-We invite you, as an exercise,
-to modify __fwprc__
-so as to use this technique,
-or perhaps even so as to use it
-inside a previous non-secure __fwprc__ session.
-
-
-
-Now, if the only way through the firewall is a WWW proxy
-(usually, a minimum for an Internet-connected network),
-you might want to use
-Chris Chiappa's
-script
-ssh-https-tunnel.
-
-
-
-Another promising program for piercing through HTTP is
-Lars Brinkoff's
-httptunnel,
-a http server and client combination that achieves a TCP/IP tunnel connection
-through the proxy-friendly HTTP protocol.
-You should then be able to run __fwprc__
-(preferably over __ssh__)
-over that connection, although I haven't tried it yet.
-Could anyone test and report?
-Note that __httptunnel__ is still under development,
-so you may help implement
-the features it currently lacks,
-like, having multiple connections, and/or serving fake pages
-so as to mislead suspicious adverse firewall administrators.
-
-
-
-Whatever goes through your firewall,
-be it telnet, HTTP or other TCP/IP connections,
-or something real weird like DNS queries, ICMP packets, e-mail
-(see mailtunnel,
-icmptunnel),
-or whatelse,
-you can always write a tunnel client/server combination,
-and run a __ssh__ and/or PPP connection through it.
-The performance mightn't be high,
-depending on the effective information communication rate
-after paying the overhead for coding around filters and proxies;
-but such a tunnel is still interesting as long as it's good enough
-to use __fetchmail__, __suck__,
-and other non-interactive programs.
-
-
-
-If you need cross a 7-bit line, you'll want to use SLIP instead of PPP.
-I never tried, because lines are more or less 8-bit clean these days,
-but it shouldn't be difficult.
-If necessary, fall back to using the
-Term-Firewall mini-HOWTO.
-
-
-
-If you have an 8-bit clean connection and you're root on linux both sides
-of the firewall, you might want to use ethertap for better performance,
-encapsulating raw ethernet communications on top of your connection.
-David Madore has written ethertap-over-TCP and ethertap-over-UDP tunneling
-ftp://quatramaran.ens.fr/pub/madore/misc/.
-There remains to write some ethertap-over-tty to combine with fwprc-like tools.
-
-
-
-If you really need more performance than you can get
-while paying for a user-space sequential communication tunnel
-through which to run PPP,
-then you're in the very hard case
-where you might have to re-hack a weird IP stack,
-using (for instance) the Fox project's packet-protocol functors.
-You'll then achieve some direct IP-over-HTTP, IP-over-DNS, IP-over-ICMP,
-or such, which requires not only an elaborate protocol,
-but also an interface to an OS kernel, both of which are costly to implement.
-
-
-
-Finally, if you're not fighting against an adverse firewall,
-but just building your own VPN, there is a large offer of VPN tools,
-and although the tricks I present are simple, work well,
-and might be enough for your needs, it could be a good idea
-to look at this evolving offer (that I do not know much about)
-for a solution that fits your requirements of performance and maintainability.
-
-----
-!!8.2. HOWTO maintenance
-
-I felt it was necessary to write it,
-but I don't have that much time for that,
-so this mini-HOWTO is very rough.
-Thus will it stay,
-until I get enough feedback so as to know what sections to enhance,
-or better, until someone comes and takes over maintenance for the mini-HOWTO.
-Feedback welcome. Help welcome. mini-HOWTO maintenance take-over welcome.
-
-
-
-In any case, the above sections have shown many problems
-whose solution is just a matter of someone (you?)
-spending some time (or money, by hiring someone else)
-to sit down and write it:
-nothing conceptually complicated,
-though the details might be burdensome or tricky.
-
-
-
-Do not hesitate to contribute more problems, and hopefully more solutions,
-to this mini-HOWTO.
-
-----
-!!8.3. Related Documents
-
-The LDP
-publishes many documents related to this
-mini-HOWTO.
-most notably the
-Linux Security Knowledge Base,
-the VPN HOWTO
-and the VPN mini-HOWTO.
-For more general questions about networking, routing and firewalling,
-start from the
-Networking Overview HOWTO.
-See also the
-Linux Firewall and Security site.
-
-
-
-Then again, when facing a problem with some program,
-one reflex for any Linux user should be to
-RTFM:
-Read The Fscking Manual pages for the considered programs.
-
-----
-!!8.4. Final Word
-
-I've come to the conclusion that much like the need for Design Patterns
-came directly from the fact that people were using inferior languages
-like C++ or Java
-that don't allow to directly express higher-level programming constructs
-(whereas good languages such as LISP
-allow to express them),
-the need HOWTOs comes directly from the fact that
-Linux and UNIX systems
-are inferior operating systems that do not allow to directly express
-those simple tasks that people attempt to do with them.
-
-
-
-If you think that all this mucking around with stupid scripts and silly HOWTOs
-is overly complicated and that a decent computer system ought
-to automate it all for you, then welcome with me among
-UNIX haters
-and other people who hate current low-level operating systems,
-and yearn for declarative computing systems
-that take care of the silly details and let us focus on things that matter.
-(Maybe have a peek at my own
-TUNES project).
-
-----
-!!8.5. Extra copy of IMPORTANT DISCLAIMER --- BELIEVE IT!!!
-
-"''I hereby disclaim all responsibility for
-''your'' use of this hack.
-If it backfires on you in any way whatsoever,
-that's the breaks. Not my fault.
-If you don't understand the risks inherent in doing this, don't do it.
-If you use this hack and it allows vicious vandals
-to break into your company's computers and costs you your job and
-your company millions of dollars, well that's just tough nuggies.
-Don't come crying to me.''"
+Describe [HowToFirewallPiercing] here
.