diff options
author | Colin Watson <cjwatson@debian.org> | 2010-03-31 10:46:28 +0100 |
---|---|---|
committer | Colin Watson <cjwatson@debian.org> | 2010-03-31 10:46:28 +0100 |
commit | efd3d4522636ae029488c2e9730b60c88e257d2e (patch) | |
tree | 31e02ac3f16090ce8c53448677356b2b7f423683 /PROTOCOL.mux | |
parent | bbec4db36d464ea1d464a707625125f9fd5c7b5e (diff) | |
parent | d1a87e462e1db89f19cd960588d0c6b287cb5ccc (diff) |
* New upstream release (LP: #535029).
- After a transition period of about 10 years, this release disables SSH
protocol 1 by default. Clients and servers that need to use the
legacy protocol must explicitly enable it in ssh_config / sshd_config
or on the command-line.
- Remove the libsectok/OpenSC-based smartcard code and add support for
PKCS#11 tokens. This support is enabled by default in the Debian
packaging, since it now doesn't involve additional library
dependencies (closes: #231472, LP: #16918).
- Add support for certificate authentication of users and hosts using a
new, minimal OpenSSH certificate format (closes: #482806).
- Added a 'netcat mode' to ssh(1): "ssh -W host:port ...".
- Add the ability to revoke keys in sshd(8) and ssh(1). (For the Debian
package, this overlaps with the key blacklisting facility added in
openssh 1:4.7p1-9, but with different file formats and slightly
different scopes; for the moment, I've roughly merged the two.)
- Various multiplexing improvements, including support for requesting
port-forwardings via the multiplex protocol (closes: #360151).
- Allow setting an explicit umask on the sftp-server(8) commandline to
override whatever default the user has (closes: #496843).
- Many sftp client improvements, including tab-completion, more options,
and recursive transfer support for get/put (LP: #33378). The old
mget/mput commands never worked properly and have been removed
(closes: #270399, #428082).
- Do not prompt for a passphrase if we fail to open a keyfile, and log
the reason why the open failed to debug (closes: #431538).
- Prevent sftp from crashing when given a "-" without a command. Also,
allow whitespace to follow a "-" (closes: #531561).
Diffstat (limited to 'PROTOCOL.mux')
-rw-r--r-- | PROTOCOL.mux | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/PROTOCOL.mux b/PROTOCOL.mux new file mode 100644 index 000000000..d22f7379c --- /dev/null +++ b/PROTOCOL.mux | |||
@@ -0,0 +1,196 @@ | |||
1 | This document describes the multiplexing protocol used by ssh(1)'s | ||
2 | ControlMaster connection-sharing. | ||
3 | |||
4 | Most messages from the client to the server contain a "request id" field. | ||
5 | This field is returned in replies as "client request id" to facilitate | ||
6 | matching of responses to requests. | ||
7 | |||
8 | 1. Connection setup | ||
9 | |||
10 | When a multiplexing connection is made to a ssh(1) operating as a | ||
11 | ControlMaster from a ssh(1) in multiplex slave mode, the first | ||
12 | action of each is to exchange hello messages: | ||
13 | |||
14 | uint32 MUX_MSG_HELLO | ||
15 | uint32 protocol version | ||
16 | string extension name [optional] | ||
17 | string extension value [optional] | ||
18 | ... | ||
19 | |||
20 | The current version of the mux protocol is 4. A slave should refuse | ||
21 | to connect to a master that speaks an unsupported protocol version. | ||
22 | Following the version identifier are zero or more extensions | ||
23 | represented as a name/value pair. No extensions are currently | ||
24 | defined. | ||
25 | |||
26 | 2. Opening sessions | ||
27 | |||
28 | To open a new multiplexed session, a client may send the following | ||
29 | request: | ||
30 | |||
31 | uint32 MUX_C_MSG_NEW_SESSION | ||
32 | uint32 request id | ||
33 | string reserved | ||
34 | bool want tty flag | ||
35 | bool want X11 forwarding flag | ||
36 | bool want agent flag | ||
37 | bool subsystem flag | ||
38 | uint32 escape char | ||
39 | string terminal type | ||
40 | string command | ||
41 | string environment string 0 [optional] | ||
42 | ... | ||
43 | |||
44 | To disable the use of an escape character, "escape char" may be set | ||
45 | to 0xffffffff. "terminal type" is generally set to the value of | ||
46 | $TERM. zero or more environment strings may follow the command. | ||
47 | |||
48 | The client then sends its standard input, output and error file | ||
49 | descriptors (in that order) using Unix domain socket control messages. | ||
50 | |||
51 | The contents of "reserved" are currently ignored. | ||
52 | |||
53 | If successful, the server will reply with MUX_S_SESSION_OPENED | ||
54 | |||
55 | uint32 MUX_S_SESSION_OPENED | ||
56 | uint32 client request id | ||
57 | uint32 session id | ||
58 | |||
59 | Otherwise it will reply with an error: MUX_S_PERMISSION_DENIED or | ||
60 | MUX_S_FAILURE. | ||
61 | |||
62 | Once the server has received the fds, it will respond with MUX_S_OK | ||
63 | indicating that the session is up. The client now waits for the | ||
64 | session to end. When it does, the server will send an exit status | ||
65 | message: | ||
66 | |||
67 | uint32 MUX_S_EXIT_MESSAGE | ||
68 | uint32 session id | ||
69 | uint32 exit value | ||
70 | |||
71 | The client should exit with this value to mimic the behaviour of a | ||
72 | non-multiplexed ssh(1) connection. Two additional cases that the | ||
73 | client must cope with are it receiving a signal itself and the | ||
74 | server disconnecting without sending an exit message. | ||
75 | |||
76 | 3. Health checks | ||
77 | |||
78 | The client may request a health check/PID report from a server: | ||
79 | |||
80 | uint32 MUX_C_ALIVE_CHECK | ||
81 | uint32 request id | ||
82 | |||
83 | The server replies with: | ||
84 | |||
85 | uint32 MUX_S_ALIVE | ||
86 | uint32 client request id | ||
87 | uint32 server pid | ||
88 | |||
89 | 4. Remotely terminating a master | ||
90 | |||
91 | A client may request that a master terminate immediately: | ||
92 | |||
93 | uint32 MUX_C_TERMINATE | ||
94 | uint32 request id | ||
95 | |||
96 | The server will reply with one of MUX_S_OK or MUX_S_PERMISSION_DENIED. | ||
97 | |||
98 | 5. Requesting establishment of port forwards | ||
99 | |||
100 | A client may request the master to establish a port forward: | ||
101 | |||
102 | uint32 MUX_C_OPEN_FORWARD | ||
103 | uint32 request id | ||
104 | uint32 forwarding type | ||
105 | string listen host | ||
106 | string listen port | ||
107 | string connect host | ||
108 | string connect port | ||
109 | |||
110 | forwarding type may be MUX_FWD_LOCAL, MUX_FWD_REMOTE, MUX_FWD_DYNAMIC. | ||
111 | |||
112 | A server may reply with a MUX_S_OK, a MUX_S_PERMISSION_DENIED or a | ||
113 | MUX_S_FAILURE. | ||
114 | |||
115 | 5. Requesting closure of port forwards | ||
116 | |||
117 | A client may request the master to establish a port forward: | ||
118 | |||
119 | uint32 MUX_C_OPEN_FORWARD | ||
120 | uint32 request id | ||
121 | uint32 forwarding type | ||
122 | string listen host | ||
123 | string listen port | ||
124 | string connect host | ||
125 | string connect port | ||
126 | |||
127 | forwarding type may be MUX_FWD_LOCAL, MUX_FWD_REMOTE, MUX_FWD_DYNAMIC. | ||
128 | |||
129 | A server may reply with a MUX_S_OK, a MUX_S_PERMISSION_DENIED or a | ||
130 | MUX_S_FAILURE. | ||
131 | |||
132 | 6. Requesting stdio forwarding | ||
133 | |||
134 | A client may request the master to establish a stdio forwarding: | ||
135 | |||
136 | uint32 MUX_C_NEW_STDIO_FWD | ||
137 | uint32 request id | ||
138 | string reserved | ||
139 | string connect host | ||
140 | string connect port | ||
141 | |||
142 | The client then sends its standard input and output file descriptors | ||
143 | (in that order) using Unix domain socket control messages. | ||
144 | |||
145 | The contents of "reserved" are currently ignored. | ||
146 | |||
147 | A server may reply with a MUX_S_SESSION_OPEED, a MUX_S_PERMISSION_DENIED | ||
148 | or a MUX_S_FAILURE. | ||
149 | |||
150 | 7. Status messages | ||
151 | |||
152 | The MUX_S_OK message is empty: | ||
153 | |||
154 | uint32 MUX_S_OK | ||
155 | uint32 client request id | ||
156 | |||
157 | The MUX_S_PERMISSION_DENIED and MUX_S_FAILURE include a reason: | ||
158 | |||
159 | uint32 MUX_S_PERMISSION_DENIED | ||
160 | uint32 client request id | ||
161 | string reason | ||
162 | |||
163 | uint32 MUX_S_FAILURE | ||
164 | uint32 client request id | ||
165 | string reason | ||
166 | |||
167 | 7. Protocol numbers | ||
168 | |||
169 | #define MUX_MSG_HELLO 0x00000001 | ||
170 | #define MUX_C_NEW_SESSION 0x10000002 | ||
171 | #define MUX_C_ALIVE_CHECK 0x10000004 | ||
172 | #define MUX_C_TERMINATE 0x10000005 | ||
173 | #define MUX_C_OPEN_FORWARD 0x10000006 | ||
174 | #define MUX_C_CLOSE_FORWARD 0x10000007 | ||
175 | #define MUX_S_OK 0x80000001 | ||
176 | #define MUX_S_PERMISSION_DENIED 0x80000002 | ||
177 | #define MUX_S_FAILURE 0x80000003 | ||
178 | #define MUX_S_EXIT_MESSAGE 0x80000004 | ||
179 | #define MUX_S_ALIVE 0x80000005 | ||
180 | #define MUX_S_SESSION_OPENED 0x80000006 | ||
181 | |||
182 | #define MUX_FWD_LOCAL 1 | ||
183 | #define MUX_FWD_REMOTE 2 | ||
184 | #define MUX_FWD_DYNAMIC 3 | ||
185 | |||
186 | XXX TODO | ||
187 | XXX extended status (e.g. report open channels / forwards) | ||
188 | XXX graceful close (delete listening socket, but keep existing sessions active) | ||
189 | XXX lock (maybe) | ||
190 | XXX watch in/out traffic (pre/post crypto) | ||
191 | XXX inject packet (what about replies) | ||
192 | XXX server->client error/warning notifications | ||
193 | XXX port0 rfwd (need custom response message) | ||
194 | XXX send signals via mux | ||
195 | |||
196 | $OpenBSD: PROTOCOL.mux,v 1.1 2010/01/26 01:28:35 djm Exp $ | ||