Click here to Skip to main content
15,881,715 members
Articles / Programming Languages / C++

HTTP Tunneling

Rate me:
Please Sign up or sign in to vote.
4.73/5 (38 votes)
14 Jun 2000 463.5K   17K   128   91
This article describes how to open arbitrary TCP connections through proxy servers

Introduction

The application discussed in this article provides the ability to make TCP connections through a proxy server. Often, computers are behind firewalls that deny many connections. But HTTP connection is usually allowed and is made through a proxy server. This article will show how arbitrary TCP connections can be made using HTTP protocol and the proxy server.

Approach

When an HTTP connection is made through a proxy server, the client (usually the browser) sends the request to the proxy. The proxy opens the connection to the destination, sends the request, receives the response and sends it back to the client. The HTTP protocol specifies a request method called CONNECT. The CONNECT method can be used by the client to inform the proxy server that a connection to some host on some port is required. The proxy server, if it allows such connections, tries to connect to the destination address specified in the request header. If the operation fails, it sends back to the client a negative HTTP response and closes the connection. If the operation succeeded, then it sends back an HTTP positive response and the connection is consider established. After that, the proxy does not care what data is transferred between client requesting the connection and the destination. It just forwards data in both ways acting as a tunnel.

About the Protocol

We are interested in CONNECT method from the HTTP protocol. After the application opens a connection with the proxy server, it must send the connect request in the form of an HTTP request:

C++
CONNECT <destination_address>:<destination_port> <http_version><CR><LF>
<header_line><CR><LF>
<header_line><CR><LF>
...
<header_line><CR><LF>
<CR><LF>

The proxy server processes the request and tries to make a connection to <destionation_address>:<destination_port>.

The proxy server sends back an HTTP response in the form:

<http_version> <code> <message><CR><LF>
<header_line><CR><LF>
<header_line><CR><LF>
...
<header_line><CR><LF>
<CR><LF>

If it is a positive response (code=200), then after the empty line the proxy begins to acts as a tunnel and forwards data. If it is a negative response (code!=200), then connection is closed after the empty line.

The HTTPTunneling Application

The application acts as specified in a configuration file. An entry in the configuration file looks like this:

<Source port> <Destination address> <Destination port> <Proxy address> <Proxy port>

If the application is running and an entry in the configuration files changes, the application automatically updates itself.

For every entry in the configuration file, the application creates a port listener. This is a thread that opens a socket on <Source port> and waits for connection. When a request arrives on that port, it tries to open a tunnel to the <Destination address>:< port>. If the <Proxy address> and <Proxy port> are missing, a direct connection is made. If the field is present, it opens a connection to the proxy and sends a CONNECT request using the method specified above. The tunnel construction is made in a separate thread to let the port listener to accept immediately new connections. After the connection is established, a tunnel object is constructed based on the opened sockets, sockets are marked as non-blocking and the object is passed to manager object. The thread that has created the tunnel is destroyed. Data transfer is made on a single thread. When one of the ends closes the connection, the tunnel closes the other and the tunnel is marked as inactive. The manager finds the tunnel inactive and removes it from the list of active tunnels.

By default, the application generates log information in HTTPTunneling.log file. This file can be consulted to find wrong application behaviour.

Known Problems

  • If no data transfer is made, the proxy could close the connection, even though neither the initiator nor the destination has closed the connection.
  • Proxy authorization may be required. This can be easily solved including in the HTTP request the Proxy-Authorization field.

History

  • 15th June, 2000: Initial post

License

This article has no explicit license attached to it, but may contain usage terms in the article text or the download files themselves. If in doubt, please contact the author via the discussion board below. A list of licenses authors might use can be found here.


Written By
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionCompilation and execution steps for http tunneling source code Pin
Anindya Sinha17-Apr-14 9:48
Anindya Sinha17-Apr-14 9:48 
Questionhelp me Pin
Member 1005576421-May-13 18:41
Member 1005576421-May-13 18:41 
GeneralMy vote of 4 Pin
anderbill8-Nov-10 16:14
anderbill8-Nov-10 16:14 
General[Message Deleted] Pin
it.ragester2-Apr-09 21:57
it.ragester2-Apr-09 21:57 
GeneralQuestion about the method connect!! Pin
Pitoniso15-May-07 10:02
Pitoniso15-May-07 10:02 
GeneralI've got a Modern Compiler [modified] Pin
qduaty11-Dec-06 4:03
qduaty11-Dec-06 4:03 
GeneralBeginner Pin
Paramesh Gunasekaran27-Nov-06 23:11
Paramesh Gunasekaran27-Nov-06 23:11 
GeneralHTTP protocol Pin
renato tome1-Nov-06 16:05
renato tome1-Nov-06 16:05 
GeneralRe: HTTP protocol Pin
renato tome12-Feb-07 15:18
renato tome12-Feb-07 15:18 
QuestionC# Implementation?? Pin
gvanto22-Aug-06 3:52
gvanto22-Aug-06 3:52 
AnswerRe: C# Implementation?? Pin
i0016-Apr-13 14:13
i0016-Apr-13 14:13 
QuestionRedircting data from one tcp port to another Pin
Pankajs_comp31-May-06 20:40
Pankajs_comp31-May-06 20:40 
GeneralSQL via Proxy Pin
MatthysDT22-Mar-06 22:29
MatthysDT22-Mar-06 22:29 
QuestionI have a question about proxy ISA2000 ? Pin
catclaw200016-Jan-06 15:40
catclaw200016-Jan-06 15:40 
Generaltunnelling for VNC Pin
georgenew4-Aug-05 4:34
georgenew4-Aug-05 4:34 
AnswerRe: tunnelling for VNC Pin
Pankaj Sahasrabudhe28-May-08 1:12
Pankaj Sahasrabudhe28-May-08 1:12 
GeneralRe: tunnelling for VNC Pin
anderbill8-Nov-10 16:17
anderbill8-Nov-10 16:17 
I found super network tunnel can do it or you seach google http tunnel for another solution.
GeneralWebsense _HELP Pin
anon-13-Mar-05 23:47
anon-13-Mar-05 23:47 
GeneralAutorisation - how Pin
Member 181514216-Feb-05 12:12
Member 181514216-Feb-05 12:12 
Generalconaito VoIP ActiveX SDK Pin
Attila Szappan13-Dec-04 3:06
sussAttila Szappan13-Dec-04 3:06 
GeneralRe: conaito VoIP ActiveX SDK Pin
brian scott10-Apr-06 4:39
brian scott10-Apr-06 4:39 
GeneralRe: conaito VoIP ActiveX SDK Pin
andyjones129-Jun-09 23:16
andyjones129-Jun-09 23:16 
QuestionCan tunnel solve nat/port forwarding problems? Pin
Anonymous26-Nov-04 19:07
Anonymous26-Nov-04 19:07 
QuestionAny way to reduce .exe file size? Pin
JList8-Aug-04 15:55
JList8-Aug-04 15:55 
GeneralMemory leak problem Pin
Le Hong Anh6-Jun-04 19:11
Le Hong Anh6-Jun-04 19:11 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.