General purpose TCP proxy?

Discussion in 'Ruby' started by Markus Fischer, Sep 27, 2010.

  1. Hi,

    I'm trying to figure out if there's a gem or software available in Ruby
    which allows me to act as a general purpose in-between proxy between a
    server and multiple clients?

    Basically:

    <some tcp server> -- <ruby tcp propxy> -- <client1>
    \- <client2>
    \- <client3>
    etc.

    It's not an HTTP server, pure TCP with it's own (documented) protocol.
    My idea is to be able to act in-between and put certain restrictions on
    clients that the server itself is not capable of.

    Connections can be long-running, hours or days. I'm not planning on high
    traffic (although real traffic requirements are not known to me yet),
    but the number of clients will max around 15 or 20, not yet decided.

    So, before I start into action on my own I was wandering if there's
    something out there?

    thanks for pointer,
    - Markus
     
    Markus Fischer, Sep 27, 2010
    #1
    1. Advertising

  2. [Note: parts of this message were removed to make it a legal post.]

    Afternoon Markus,

    On Mon, Sep 27, 2010 at 3:47 PM, Markus Fischer <> wrote:

    > Hi,
    >
    > I'm trying to figure out if there's a gem or software available in Ruby
    > which allows me to act as a general purpose in-between proxy between a
    > server and multiple clients?
    >


    Transparent proxy - http://github.com/mojombo/proxymachine/

    Transparent or Intercepting - http://github.com/igrigorik/em-proxy

    John
     
    John W Higgins, Sep 28, 2010
    #2
    1. Advertising

  3. Hi!

    On 28.09.2010 01:16, John W Higgins wrote:
    > Transparent or Intercepting - http://github.com/igrigorik/em-proxy


    This one looks very promising based on the slides and the documentation.

    However I've instantly ran into troubles outlined here:
    http://github.com/igrigorik/em-proxy/issues#issue/3 . Any idea?

    Another thing I'm not sure: when I look at the simply forwarding example
    in the README.rdoc, I see that I basically have hook methods (on_data,
    on_response, etc.) onto which I can attach my own code.

    What I would need is a per client/connection logic. I.e. a client
    connects, I inspect and forward the traffic. I also my intercept some
    requests from the client and send back my own stuff. Ultimately I have a
    state per client.

    From the examples it's unclear to me how would I be able to identify the
    different clients through the whole connection process?

    thanks,
    - Markus
     
    Markus Fischer, Sep 28, 2010
    #3
  4. This will probably (be hackable to) do what you want:
    <http://github.com/cjheath/loggingproxy>

    Clifford Heath, Data Constellation. http://dataconstellation.com
    Agile Information Management and Design
     
    Clifford Heath, Sep 28, 2010
    #4
  5. Markus Fischer

    hemant Guest

    Whats wrong with haproxy ?

    Works for raw TCP sockets.



    On Tue, Sep 28, 2010 at 2:30 PM, Clifford Heath <> wrote:
    > This will probably (be hackable to) do what you want:
    > <http://github.com/cjheath/loggingproxy>
    >
    > Clifford Heath, Data Constellation. http://dataconstellation.com
    > Agile Information Management and Design
    >
    >




    --
    Let them talk of their oriental summer climes of everlasting
    conservatories; give me the privilege of making my own summer with my
    own coals.

    http://gnufied.org
     
    hemant, Sep 28, 2010
    #5
  6. Markus Fischer

    hemant Guest

    On Tue, Sep 28, 2010 at 4:14 PM, hemant <> wrote:
    > Whats wrong with haproxy ?
    >
    > Works for raw TCP sockets.


    And sorry for top posting.
     
    hemant, Sep 28, 2010
    #6
  7. On 28.09.2010 12:44, hemant wrote:
    > Whats wrong with haproxy ?
    >
    > Works for raw TCP sockets.


    I don't know .. does it allow my to have per Client connection logic and
    traffic interception, scripted, custom answers and rejection? Ideally in
    Ruby.

    - Markus
     
    Markus Fischer, Sep 28, 2010
    #7
  8. Markus Fischer

    Tony Arcieri Guest

    [Note: parts of this message were removed to make it a legal post.]

    Don't apologize, the anti-top posting nazis need to learn TIMTOWTDI some day

    On Tue, Sep 28, 2010 at 4:45 AM, hemant <> wrote:

    > On Tue, Sep 28, 2010 at 4:14 PM, hemant <> wrote:
    > > Whats wrong with haproxy ?
    > >
    > > Works for raw TCP sockets.

    >
    > And sorry for top posting.
    >
    >



    --
    Tony Arcieri
    Medioh! A Kudelski Brand
     
    Tony Arcieri, Sep 28, 2010
    #8
  9. [Note: parts of this message were removed to make it a legal post.]

    On Mon, Sep 27, 2010 at 11:51 PM, Markus Fischer <>wrote:

    > Hi!
    >
    > On 28.09.2010 01:16, John W Higgins wrote:
    > > Transparent or Intercepting - http://github.com/igrigorik/em-proxy

    >
    > This one looks very promising based on the slides and the documentation.
    >
    > However I've instantly ran into troubles outlined here:
    > http://github.com/igrigorik/em-proxy/issues#issue/3 . Any idea?
    >


    I would chalk it up to probably just a mistake in the sample code - yes,
    it's not the best first impression but it does happen. It may very well be
    conn.unbind instead of unbind but I'm not certain (unbind is a method of the
    connection object).


    >
    > Another thing I'm not sure: when I look at the simply forwarding example
    > in the README.rdoc, I see that I basically have hook methods (on_data,
    > on_response, etc.) onto which I can attach my own code.
    >
    > What I would need is a per client/connection logic. I.e. a client
    > connects, I inspect and forward the traffic. I also my intercept some
    > requests from the client and send back my own stuff. Ultimately I have a
    > state per client.
    >


    Try looking at the smtp_whitelist example. It shows intercepting a request -
    looking at it and sending back a response without the proxy actually passing
    it on to the backend server. If you return nil from the on_data call then
    nothing is forwarded along.

    You do have a state - the "conn" object, which EventMachine creates per
    connection and passes into the outer block that then calls into the on_data,
    on_response et al. blocks.

    My guess for your case would be that you would want to extend the connection
    class (see connection.rb) to hold more information that would be available
    to you during the lifetime of the connection.

    If nothing else this is around 200 or so lines of code that gives a nice
    starting point to anything more custom that you believe you would need/want.
    I would be rather impressed if something else gave you more flexibility than
    this and lived in the ruby world. You may find very well that a few helper
    methods would help you along the way or perhaps the opposite in that you
    don't want the blocks but rather to work in a custom connection object that
    eliminates the block calls. But I do assure you that this is the right road
    to be on.....

    John
     
    John W Higgins, Sep 29, 2010
    #9
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Robert Bj?rn
    Replies:
    0
    Views:
    427
    Robert Bj?rn
    Jun 1, 2004
  2. Maarten van Reeuwijk

    Looking for very simple general purpose tokenizer

    Maarten van Reeuwijk, Jan 19, 2004, in forum: Python
    Replies:
    6
    Views:
    392
  3. Ron Stephens
    Replies:
    23
    Views:
    2,923
    Ron Stephens
    Apr 12, 2004
  4. Donald Newcomb

    NEWB: General purpose list iteration?

    Donald Newcomb, Aug 12, 2005, in forum: Python
    Replies:
    4
    Views:
    322
    Donald Newcomb
    Aug 12, 2005
  5. John Machin
    Replies:
    6
    Views:
    397
    metaperl
    Aug 16, 2006
Loading...

Share This Page