~ubuntu-branches/ubuntu/vivid/sslh/vivid-proposed

« back to all changes in this revision

Viewing changes to README

  • Committer: Package Import Robot
  • Author(s): Guillaume Delacour
  • Date: 2014-08-07 00:06:06 UTC
  • mfrom: (1.1.6)
  • Revision ID: package-import@ubuntu.com-20140807000606-y1tg7j8i5t7d4drr
Tags: 1.16-1
* New upstream release: fix some startup problem when interfaces are not
  ready at boot time (IP_FREEBIND support when available) and can use libcap
  for transparent mode
* Enable libcap and libwrap support at build time
* Enable dpkg-buildflags: Drop hardening-wrapper Build-Depends and use
  DEB_BUILD_HARDENING instead of DEB_BUILD_MAINT_OPTIONS
* Remove old .gitignore as upstream has one too
* debian/sslh.tmpfile: Create /run/sslh for systemd as root because sslh
  write its pid before dropping privileges (Closes: #740560)
* debian/patches/disable_ip_freebind_test.diff: Remove "Can't bind address"
  upstream test because IP_FREEBIND is now enabled upstream
* debian/docs: upstream README is now README.md
* debian/rules:
  + use DESTDIR in addition of PREFIX as upstream change Makefile
* Refresh debian/patches/disable_valgrind_launch.diff due to upstream
  changes
* Stop service in case of purge (to be able to remove the user too)
* Use DEB_BUILD_OPTIONS to speed the build
* debian/patches/fixed_version.diff: Fix the version of binaries based on
  debian/changelog (instead of relying on git)
* Update Description as sslh is not only a ssl/ssh multiplexer but a
  protocol multiplexer

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
===== sslh -- A ssl/ssh multiplexer. =====
2
 
 
3
 
Sslh accepts connections on specified ports, and forwards
4
 
them further based on tests performed on the first data
5
 
packet sent by the remote client.
6
 
 
7
 
Probes for HTTP, SSL, SSH, OpenVPN, tinc, XMPP are
8
 
implemented, and any other protocol that can be tested using
9
 
a regular expression, can be recognised. A typical use case
10
 
is to allow serving several services on port 443 (e.g. to
11
 
connect to ssh from inside a corporate firewall, which
12
 
almost never block port 443) while still serving HTTPS on
13
 
that port. 
14
 
 
15
 
Hence sslh acts as a protocol demultiplexer, or a
16
 
switchboard. Its name comes from its original function to
17
 
serve SSH and HTTPS on the same port.
18
 
 
19
 
==== Compile and install ====
20
 
 
21
 
sslh uses libconfig (http://www.hyperrealm.com/libconfig/)
22
 
and libwrap.
23
 
 
24
 
For Debian, these are contained in packages libwrap0-dev and
25
 
libconfig8-dev.  
26
 
 
27
 
For OpenSUSE, these are contained in packages libconfig9 and
28
 
libconfig-dev in repository
29
 
http://download.opensuse.org/repositories/multimedia:/libs/openSUSE_12.1/
30
 
 
31
 
For Fedora, this package should work:
32
 
https://admin.fedoraproject.org/pkgdb/acls/name/libconfig
33
 
(feedback from Fedorans appreciated).
34
 
 
35
 
If you can't find libconfig, or just don't want a
36
 
configuration file, set 'USELIBCONFIG=' in the Makefile.
37
 
 
38
 
After this, the Makefile should work:
39
 
 
40
 
make install
41
 
 
42
 
There are a couple of configuration options at the beginning
43
 
of the Makefile: 
44
 
 
45
 
    USELIBWRAP compiles support for host access control (see
46
 
    hosts_access(3)), you will need libwrap headers and
47
 
    library to compile (libwrap0-dev in Debian).
48
 
 
49
 
    USELIBCONFIG compiles support for the configuration
50
 
    file. You will need libconfig headers to compile
51
 
    (libconfig8-dev in Debian).
52
 
 
53
 
The Makefile produces two different executables: sslh-fork
54
 
and sslh-select. 
55
 
 
56
 
sslh-fork forks a new process for each incoming connection.
57
 
It is well-tested and very reliable, but incurs the overhead
58
 
of many processes.  sslh-select uses only one thread, which
59
 
monitors all connections at once. It is more recent and less
60
 
tested, but only incurs a 16 byte overhead per connection.
61
 
Also, if it stops, you'll lose all connections, which means
62
 
you can't upgrade it remotely.
63
 
 
64
 
If you are going to use sslh for a "small" setup (less than
65
 
a dozen ssh connections and a low-traffic https server) then
66
 
sslh-fork is probably more suited for you. If you are going
67
 
to use sslh on a "medium" setup (a few thousand ssh
68
 
connections, and another few thousand ssl connections),
69
 
sslh-select will be better. If you have a very large site
70
 
(tens of thousands of connections), you'll need a vapourware
71
 
version that would use libevent or something like that.
72
 
 
73
 
 
74
 
To install:
75
 
 
76
 
make
77
 
cp sslh-fork /usr/local/sbin/sslh
78
 
cp scripts/etc.default.sslh /etc/default/sslh
79
 
 
80
 
For Debian:
81
 
cp scripts/etc.init.d.sslh /etc/init.d/sslh
82
 
For CentOS:
83
 
cp scripts/etc.rc.d.init.d.sslh /etc/rc.d/init.d/sslh
84
 
 
85
 
and probably create links in /etc/rc<x>.d so that the server
86
 
start automatically at boot-up, e.g. under Debian:
87
 
update-rc.d sslh defaults
88
 
 
89
 
 
90
 
 
91
 
==== Configuration ====
92
 
 
93
 
You can edit settings in /etc/default/sslh:
94
 
 
95
 
LISTEN=ifname:443
96
 
SSH=localhost:22
97
 
SSL=localhost:443
98
 
 
99
 
A good scheme is to use the external name of the machine in
100
 
$LISTEN, and bind httpd to localhost:443 (instead of all
101
 
binding to all interfaces): that way, https connections
102
 
coming from inside your network don't need to go through
103
 
sslh, and sslh is only there as a frontal for connections
104
 
coming from the internet.
105
 
 
106
 
Note that 'external name' in this context refers to the
107
 
actual IP address of the machine as seen from your network,
108
 
i.e. that that is not 127.0.0.1 in the output of
109
 
ifconfig(8).
110
 
 
111
 
==== Libwrap support ====
112
 
 
113
 
Sslh can optionnaly perform libwrap checks for the sshd
114
 
service: because the connection to sshd will be coming
115
 
locally from sslh, sshd cannot determine the IP of the
116
 
client.
117
 
 
118
 
==== OpenVPN support ====
119
 
 
120
 
OpenVPN clients connecting to OpenVPN running with
121
 
-port-share reportedly take more than one second between
122
 
the time the TCP connexion is established and the time they
123
 
send the first data packet. This results in sslh with
124
 
default settings timing out and assuming an SSH connexion.
125
 
To support OpenVPN connexions reliably, it is necessary to
126
 
increase sslh's timeout to 5 seconds.
127
 
 
128
 
Instead of using OpenVPN's port sharing, it is more reliable
129
 
to use sslh's -o option to get sslh to do the port sharing.
130
 
 
131
 
==== Using proxytunnel with sslh ====
132
 
 
133
 
If you are connecting through a proxy that checks that the
134
 
outgoing connection really is SSL and rejects SSH, you can
135
 
encapsulate all your traffic in SSL using proxytunnel (this
136
 
should work with corkscrew as well). On the server side you
137
 
receive the traffic with stunnel to decapsulate SSL, then
138
 
pipe through sslh to switch HTTP on one side and SSL on the
139
 
other.
140
 
 
141
 
In that case, you end up with something like this:
142
 
 
143
 
ssh -> proxytunnel -e --------ssh/ssl------> stunnel ---ssh---> sslh --> sshd
144
 
 
145
 
Web browser --------http/ssl------> stunnel ---http---> sslh --> http:80
146
 
 
147
 
Configuration goes like this:
148
 
 
149
 
On the server side, using stunnel3:
150
 
stunnel -f -p mycert.pem  -d thelonious:443 -l /usr/local/sbin/sslh -- sslh -i  --http localhost:80 --ssh localhost:22
151
 
 
152
 
stunnel options: -f for foreground/debugging, -p specifies
153
 
the key + certificate, -d specifies which interface and port
154
 
we're listening to for incoming connexions, -l summons sslh
155
 
in inetd mode.
156
 
 
157
 
sslh options: -i for inetd mode, --http to forward http
158
 
connexions to port 80, and SSH connexions to port 22.
159
 
 
160
 
==== capapbilities support ====
161
 
 
162
 
On Linux (only?), you can use POSIX capabilities to reduce a
163
 
server's capabilities to the minimum it needs (see
164
 
capabilities(8).  For sslh, this is CAP_NET_ADMIN (to
165
 
perform transparent proxy-ing) and CAP_NET_BIND_SERVICE (to
166
 
bind to port 443 without being root).
167
 
 
168
 
The simplest way to use capabilities is to give them to the
169
 
executable as root:
170
 
 
171
 
# setcap cap_net_bind_service,cap_net_admin+pe sslh-select
172
 
 
173
 
Then you can run sslh-select as an unpriviledged user, e.g.:
174
 
 
175
 
$ sslh-select -p myname:443 --ssh localhost:22 --ssl localhost:443
176
 
 
177
 
This has 2 advantages over starting as root with -u:
178
 
- You no longer start as root (duh)
179
 
- This enables transparent proxying.
180
 
 
181
 
Caveat: CAP_NET_ADMIN does give sslh too many rights, e.g.
182
 
configuring the interface. If you're not going to use
183
 
transparent proxying, just don't use it.
184
 
 
185
 
==== Transparent proxy support ====
186
 
 
187
 
On Linux (only?) you can use the --transparent option to
188
 
request transparent proying. This means services behind sslh
189
 
(Apache, sshd and so on) will see the external IP and ports
190
 
as if the external world connected directly to them. This
191
 
simplifies IP-based access control (or makes it possible at
192
 
all).
193
 
 
194
 
sslh needs extended rights to perform this: you'll need to
195
 
give it cap_net_admin capabilities (see appropriate chapter)
196
 
or run it as root (but don't do that).
197
 
 
198
 
The firewalling tables also need to be adjusted as follow
199
 
(example to connect to https on 4443 -- adapt to your needs
200
 
(I don't think it is possible to have httpd listen to 443 in
201
 
this scheme -- let me know if you manage that))):
202
 
 
203
 
# iptables -t mangle -N SSLH
204
 
# iptables -t mangle -A  OUTPUT --protocol tcp --out-interface eth0 --sport 22 --jump SSLH
205
 
# iptables -t mangle -A OUTPUT --protocol tcp --out-interface eth0 --sport 4443 --jump SSLH
206
 
# iptables -t mangle -A SSLH --jump MARK --set-mark 0x1
207
 
# iptables -t mangle -A SSLH --jump ACCEPT
208
 
# ip rule add fwmark 0x1 lookup 100
209
 
# ip route add local 0.0.0.0/0 dev lo table 100
210
 
 
211
 
This will only work if sslh does not use any loopback
212
 
addresses (no 127.0.0.1 or localhost), you'll need to use
213
 
explicit IP addresses (or names):
214
 
 
215
 
sslh --listen 192.168.0.1:443 --ssh 192.168.0.1:22 --ssl 192.168.0.1:4443
216
 
 
217
 
This will not work:
218
 
sslh --listen 192.168.0.1:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:4443
219
 
 
220
 
==== Comments? Questions? ====
221
 
 
222
 
You can subscribe to the sslh mailing list here:
223
 
http://rutschle.net/cgi-bin/mailman/listinfo/sslh
224
 
 
225
 
This mailing list should be used for discussion, feature
226
 
requests, and will be the prefered channel for
227
 
announcements.
228