Skip to content

Commit 8b929f0

Browse files
authored
Fix ssh tunnel use case (#1400)
* Fix for `--enable-ssh-tunnel` use case * Update readme with correct instructions * Update readme
1 parent 5b0c484 commit 8b929f0

File tree

3 files changed

+49
-39
lines changed

3 files changed

+49
-39
lines changed

README.md

Lines changed: 32 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1303,17 +1303,16 @@ See [requirements-tunnel.txt](https://github.com/abhinavsingh/proxy.py/blob/deve
13031303
|
13041304
+------------+ | +----------+
13051305
| LOCAL | | | REMOTE |
1306-
| HOST | <== SSH ==== :8900 == | SERVER |
1306+
| HOST | <== SSH ==== :8900 == | PROXY |
13071307
+------------+ | +----------+
13081308
:8899 proxy.py |
13091309
|
13101310
FIREWALL
13111311
(allow tcp/22)
13121312

1313-
## What
1313+
### What
13141314

1315-
Proxy HTTP(s) requests made on a `remote` server through `proxy.py` server
1316-
running on `localhost`.
1315+
Proxy HTTP(s) requests made on a `remote` proxy server through `proxy.py` server running on `localhost`.
13171316

13181317
### How
13191318

@@ -1335,7 +1334,7 @@ Start `proxy.py` as:
13351334

13361335
```console
13371336
# On localhost
1338-
proxy --enable-tunnel \
1337+
proxy --enable-ssh-tunnel \
13391338
--tunnel-username username \
13401339
--tunnel-hostname ip.address.or.domain.name \
13411340
--tunnel-port 22 \
@@ -2341,19 +2340,19 @@ To run standalone benchmark for `proxy.py`, use the following command from repo
23412340

23422341
```console
23432342
proxy -h
2344-
usage: -m [-h] [--threadless] [--threaded] [--num-workers NUM_WORKERS]
2345-
[--enable-events] [--local-executor LOCAL_EXECUTOR]
2346-
[--backlog BACKLOG] [--hostname HOSTNAME]
2347-
[--hostnames HOSTNAMES [HOSTNAMES ...]] [--port PORT]
2348-
[--ports PORTS [PORTS ...]] [--port-file PORT_FILE]
2349-
[--unix-socket-path UNIX_SOCKET_PATH]
2350-
[--num-acceptors NUM_ACCEPTORS] [--tunnel-hostname TUNNEL_HOSTNAME]
2351-
[--tunnel-port TUNNEL_PORT] [--tunnel-username TUNNEL_USERNAME]
2343+
usage: -m [-h] [--tunnel-hostname TUNNEL_HOSTNAME] [--tunnel-port TUNNEL_PORT]
2344+
[--tunnel-username TUNNEL_USERNAME]
23522345
[--tunnel-ssh-key TUNNEL_SSH_KEY]
23532346
[--tunnel-ssh-key-passphrase TUNNEL_SSH_KEY_PASSPHRASE]
2354-
[--tunnel-remote-port TUNNEL_REMOTE_PORT] [--version]
2355-
[--log-level LOG_LEVEL] [--log-file LOG_FILE]
2356-
[--log-format LOG_FORMAT] [--open-file-limit OPEN_FILE_LIMIT]
2347+
[--tunnel-remote-port TUNNEL_REMOTE_PORT] [--threadless]
2348+
[--threaded] [--num-workers NUM_WORKERS] [--enable-events]
2349+
[--local-executor LOCAL_EXECUTOR] [--backlog BACKLOG]
2350+
[--hostname HOSTNAME] [--hostnames HOSTNAMES [HOSTNAMES ...]]
2351+
[--port PORT] [--ports PORTS [PORTS ...]] [--port-file PORT_FILE]
2352+
[--unix-socket-path UNIX_SOCKET_PATH]
2353+
[--num-acceptors NUM_ACCEPTORS] [--version] [--log-level LOG_LEVEL]
2354+
[--log-file LOG_FILE] [--log-format LOG_FORMAT]
2355+
[--open-file-limit OPEN_FILE_LIMIT]
23572356
[--plugins PLUGINS [PLUGINS ...]] [--enable-dashboard]
23582357
[--basic-auth BASIC_AUTH] [--enable-ssh-tunnel]
23592358
[--work-klass WORK_KLASS] [--pid-file PID_FILE] [--openssl OPENSSL]
@@ -2379,10 +2378,25 @@ usage: -m [-h] [--threadless] [--threaded] [--num-workers NUM_WORKERS]
23792378
[--filtered-client-ips FILTERED_CLIENT_IPS]
23802379
[--filtered-url-regex-config FILTERED_URL_REGEX_CONFIG]
23812380

2382-
proxy.py v2.4.4rc6.dev164+g73497f30
2381+
proxy.py v2.4.4rc6.dev172+ge1879403.d20240425
23832382

23842383
options:
23852384
-h, --help show this help message and exit
2385+
--tunnel-hostname TUNNEL_HOSTNAME
2386+
Default: None. Remote hostname or IP address to which
2387+
SSH tunnel will be established.
2388+
--tunnel-port TUNNEL_PORT
2389+
Default: 22. SSH port of the remote host.
2390+
--tunnel-username TUNNEL_USERNAME
2391+
Default: None. Username to use for establishing SSH
2392+
tunnel.
2393+
--tunnel-ssh-key TUNNEL_SSH_KEY
2394+
Default: None. Private key path in pem format
2395+
--tunnel-ssh-key-passphrase TUNNEL_SSH_KEY_PASSPHRASE
2396+
Default: None. Private key passphrase
2397+
--tunnel-remote-port TUNNEL_REMOTE_PORT
2398+
Default: 8899. Remote port which will be forwarded
2399+
locally for proxy.
23862400
--threadless Default: True. Enabled by default on Python 3.8+ (mac,
23872401
linux). When disabled a new thread is spawned to
23882402
handle each client connection.
@@ -2419,21 +2433,6 @@ options:
24192433
--host and --port flags are ignored
24202434
--num-acceptors NUM_ACCEPTORS
24212435
Defaults to number of CPU cores.
2422-
--tunnel-hostname TUNNEL_HOSTNAME
2423-
Default: None. Remote hostname or IP address to which
2424-
SSH tunnel will be established.
2425-
--tunnel-port TUNNEL_PORT
2426-
Default: 22. SSH port of the remote host.
2427-
--tunnel-username TUNNEL_USERNAME
2428-
Default: None. Username to use for establishing SSH
2429-
tunnel.
2430-
--tunnel-ssh-key TUNNEL_SSH_KEY
2431-
Default: None. Private key path in pem format
2432-
--tunnel-ssh-key-passphrase TUNNEL_SSH_KEY_PASSPHRASE
2433-
Default: None. Private key passphrase
2434-
--tunnel-remote-port TUNNEL_REMOTE_PORT
2435-
Default: 8899. Remote port which will be forwarded
2436-
locally for proxy.
24372436
--version, -v Prints proxy.py version.
24382437
--log-level LOG_LEVEL
24392438
Valid options: DEBUG, INFO (default), WARNING, ERROR,
@@ -2506,7 +2505,7 @@ options:
25062505
Default: None. Signing certificate to use for signing
25072506
dynamically generated HTTPS certificates. If used,
25082507
must also pass --ca-key-file and --ca-signing-key-file
2509-
--ca-file CA_FILE Default: /Users/abhinavsingh/Dev/proxy.py/.venv31010/l
2508+
--ca-file CA_FILE Default: /Users/abhinavsingh/Dev/proxy.py/.venv31013/l
25102509
ib/python3.10/site-packages/certifi/cacert.pem.
25112510
Provide path to custom CA bundle for peer certificate
25122511
verification

proxy/core/ssh/handler.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,14 @@
88
:copyright: (c) 2013-present by Abhinav Singh and contributors.
99
:license: BSD, see LICENSE for more details.
1010
"""
11+
import logging
1112
import argparse
1213
from typing import TYPE_CHECKING
1314

15+
from .base import BaseSshTunnelHandler
16+
17+
18+
logger = logging.getLogger(__name__)
1419

1520
if TYPE_CHECKING: # pragma: no cover
1621
from ...common.types import HostPort
@@ -20,7 +25,7 @@
2025
pass
2126

2227

23-
class SshHttpProtocolHandler:
28+
class SshHttpProtocolHandler(BaseSshTunnelHandler):
2429
"""Handles incoming connections over forwarded SSH transport."""
2530

2631
def __init__(self, flags: argparse.Namespace) -> None:
@@ -32,4 +37,7 @@ def on_connection(
3237
origin: 'HostPort',
3338
server: 'HostPort',
3439
) -> None:
35-
pass
40+
logger.debug('handle proxy request')
41+
42+
def shutdown(self) -> None:
43+
logger.debug('ssh handler shutdown')

proxy/proxy.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import threading
1919
from typing import TYPE_CHECKING, Any, List, Type, Optional, cast
2020

21+
from .core.ssh import SshTunnelListener, SshHttpProtocolHandler
2122
from .core.work import ThreadlessPool
2223
from .core.event import EventManager
2324
from .common.flag import FlagParser, flags
@@ -284,13 +285,15 @@ def setup(self) -> None:
284285
@staticmethod
285286
def _setup_tunnel(
286287
flags: argparse.Namespace,
287-
ssh_handler_klass: Type['BaseSshTunnelHandler'],
288-
ssh_listener_klass: Any,
288+
ssh_handler_klass: Optional[Type['BaseSshTunnelHandler']] = None,
289+
ssh_listener_klass: Optional[Any] = None,
289290
**kwargs: Any,
290291
) -> BaseSshTunnelListener:
291-
tunnel = cast(Type[BaseSshTunnelListener], ssh_listener_klass)(
292+
listener_klass = ssh_listener_klass or SshTunnelListener
293+
handler_klass = ssh_handler_klass or SshHttpProtocolHandler
294+
tunnel = cast(Type[BaseSshTunnelListener], listener_klass)(
292295
flags=flags,
293-
handler=ssh_handler_klass(flags=flags),
296+
handler=handler_klass(flags=flags),
294297
**kwargs,
295298
)
296299
tunnel.setup()

0 commit comments

Comments
 (0)