blob: 2ace615d2cb6905a2f36152d08cb373ae8abd349 [file] [log] [blame] [view]
## Port forwarding
### `PortForwardingEventListener`
Informs and allows tracking of port forwarding events as described in [RFC 4254 - section 7](https://tools.ietf.org/html/rfc4254#section-7)
as well as the (simple) [SOCKS](https://en.wikipedia.org/wiki/SOCKS) protocol (versions 4, 5). In this context, one can create a
`PortForwardingTracker` that can be used in a `try-with-resource` block so that the set up forwarding is automatically torn down when
the tracker is `close()`-d:
```java
client.addPortForwardingEventListener(new MySuperDuperListener());
try (ClientSession session = client.connect(user, host, port).verify(...timeout...).getSession()) {
session.addPasswordIdentity(password);
session.auth().verify(...timeout...);
try (PortForwardingTracker tracker = session.createLocal/RemotePortForwardingTracker(...)) {
...do something that requires the tunnel...
}
// Tunnel is torn down when code reaches this point
}
```
### Standard port forwarding
Port forwarding as specified in [RFC 4254 - section 7](https://tools.ietf.org/html/rfc4254#section-7) is fully
supported by the client and server. From the client side, this capability is exposed via the `start/stopLocal/RemotePortForwarding`
method. The key player in this capability is the configured `ForwardingFilter` that controls this feature - on **both** sides - client
and server. By default, this capability is **disabled** - i.e., the user must provide an implementation and call the appropriate
`setForwardingFilter` method on the client/server.
```java
SshClient client = ...create/obtain an instance...
client.setForwardingFilter(...filter instance...);
SshServer server = ...create/obtain an instance...
server.setForwardingFilter(...filter instance...);
```
The code contains 2 simple implementations - an `AcceptAllForwardingFilter` and a `RejectAllForwardingFilter` one that can be used for
these trivial policies. **Note:** setting a _null_ filter is equivalent to rejecting all such attempts.
In order to help with the forwarding policy, the filter is actually made up of 3 "groups" of forwarding:
* `AgentForwardingFilter`
* `X11ForwardingFilter`
* `TcpForwardingFilter`
It is possible to implement each and every one separately and then combine them via `ForwardingFilter#asForwardingFilter`. In this
context, one does not have to implement all 3 - any implementation not provided is assumed to be disabled. Furthermore, there are
reasonable default implementations for all 3, so one can override only a specific group policy and provide defaults for the rest.
### SOCKS
The code implements a [SOCKS](https://en.wikipedia.org/wiki/SOCKS) proxy for versions 4 and 5. The proxy capability is
invoked via the `start/stopDynamicPortForwarding` methods.
### Proxy agent
The code provides to some extent an SSH proxy agent via the available `SshAgentFactory` implementations. As of latest version
both [Secure Shell Authentication Agent Protocol Draft 02](https://tools.ietf.org/html/draft-ietf-secsh-agent-02) and its
[OpenSSH](https://www.libssh.org/features/) equivalent are supported. **Note:** in order to support this feature the
[Apache Portable Runtime Library](https://apr.apache.org/) needs to be added to the Maven dependencies:
```xml
<dependency>
<groupId>tomcat</groupId>
<artifactId>tomcat-apr</artifactId>
</dependency>
```
**Note:** Since the portable runtime library uses **native** code, one needs to also make sure that the appropriate _.dll/.so_ library
is available in the LD\_LIBRARY\_PATH.