source: etherws/trunk/README.rst @ 280

Revision 280, 7.8 KB checked in by atzm, 9 years ago (diff)
  • logging support
  • Property svn:keywords set to Id
RevLine 
[141]1Introduction
2============
[260]3etherws is an implementation of software switch with the Ethernet over
4WebSocket tunnel.
[141]5
[216]6Overview
7========
[260]8*etherws sw* is a simple virtual ethernet switch.  And this is controlled by
9*etherws ctl*::
[141]10
[260]11   [tap] [netdev]
12     |      |
13  +--+------+--+   (control)
[216]14  | etherws sw | <-----------+
15  +-----||-----+             |
16        ||            +-------------+
17    (WebSocket)       | etherws ctl |
18        ||            +-------------+
19  +-----||-----+             |
20  | etherws sw | <-----------+
[260]21  +--+------+--+   (control)
22     |      |
23   [tap] [netdev]
[141]24
[216]25Basic Usage
26===========
27For example, consider creating following simple network::
[141]28
[216]29          (Physical Network)
[260]30  -----+--------- // --------+-----
[216]31       | 10.0.0.10           | 10.0.0.5
32  +----+-----+         +-----+----+
33  | NodeA    |         | NodeB    |
34  |          |         |          |
35  | [ethws0] |         | [ethws0] |
36  +----||----+         +----||----+
37       || 192.0.2.10/24     || 192.0.2.5/24
38       ``===================''
39          (WebSocket Tunnel)
[141]40
[260]41In this case, WebSocket Tunnel will be created by following commands.
[141]42
[216]43on NodeA::
[141]44
[216]45  # etherws sw
46  # etherws ctl addport tap ethws0
[218]47  # etherws ctl setif --address 192.0.2.10 --netmask 255.255.255.0 1
[141]48
[216]49on NodeB::
[146]50
[216]51  # etherws sw
52  # etherws ctl addport tap ethws0
[218]53  # etherws ctl setif --address 192.0.2.5 --netmask 255.255.255.0 1
[216]54  # etherws ctl addport client ws://10.0.0.10/
[144]55
[216]56*listport*, *listif* or *listfdb* commands will show you current port list,
57interface list, or forwarding database entries::
[162]58
[216]59  # etherws ctl listport
60  # etherws ctl listif
61  # etherws ctl listfdb
[162]62
[156]63Using SSL/TLS
[216]64-------------
[260]65etherws supports SSL/TLS connection.  Tunnels will be encrypted and server will
[216]66be verified by using following options.
[144]67
[216]68On server side::
[152]69
[216]70  # etherws sw --sslkey ssl.key --sslcert ssl.crt
[144]71
[260]72*ssl.key* is a server private key, and *ssl.crt* is a server
73certificate.
[144]74
[216]75On client side::
[144]76
[216]77  # etherws ctl addport client --cacerts ssl.crt wss://10.0.0.10/
[152]78
[216]79URL scheme was just changed to *wss*, and CA certificate to verify server
80certificate was specified.
[156]81
[260]82Client verifies server certificate by default.  So, for example, *addport* will
[216]83fail if your server uses self-signed certificate and client uses another CA
84certificate.
[156]85
[216]86If you want to just encrypt tunnels and do not need to verify server
87certificate, then you can use *--insecure* option::
[156]88
[216]89  # etherws ctl addport client --insecure wss://10.0.0.10/
[156]90
[216]91Note: see http://docs.python.org/library/ssl.html for more information about
92certificates.
[156]93
[152]94Client Authentication
[216]95---------------------
[260]96etherws supports HTTP Basic Authentication.  This means you can use etherws as
[216]97simple L2-VPN server/client.
[152]98
[216]99On server side, etherws requires user informations in Apache htpasswd format
[260]100(and currently supports SHA-1 digest only).  To create this file::
[152]101
102  # htpasswd -s -c filename username
103
[216]104If you do not have htpasswd command, then you can use python one-liner
105instead::
[152]106
107  # python -c 'import hashlib; print("username:{SHA}" + hashlib.sha1("password").digest().encode("base64"))'
108
[216]109To run server with this file::
[152]110
[216]111  # etherws sw --htpasswd filename
[152]112
[216]113On client side, etherws requires username and password from option with
114*addport* command::
[152]115
[216]116  # etherws ctl addport client --user username --passwd password ws://10.0.0.10/
[152]117
[216]118Or, password can be input from stdin::
[152]119
[216]120  # etherws ctl addport client --user username ws://10.0.0.10/
121  Client Password:
[152]122
[216]123If authentication did not succeed, then *addport* will fail.
[152]124
[216]125Note that you should not use HTTP Basic Authentication without SSL/TLS support,
[260]126because this is insecure in itself.
[152]127
[216]128Advanced Usage
129==============
[152]130
[280]131Proxy
132-----
133You can create WebSocket tunnels via HTTP proxy.  Proxy server's address and
134port number are specified by generic environment variables: e.g. *$http_proxy*
135
136See https://docs.python.org/library/urllib.html for more information about
137environment variables for the proxy.
138
139Logging
140-------
141etherws uses standard logging library.  You can customize the logger using the
142*fileConfig* described in https://docs.python.org/library/logging.config.html
143
144To run *etherws sw* with the custom logger::
145
146  # etherws sw --logconf /path/to/logging.ini
147
148etherws uses a logger stream named "etherws".  And internally Tornado uses
149some logger streams described in http://www.tornadoweb.org/en/stable/log.html
150
151Note: etherws does not write debug logs even if you simply configure loglevel
152DEBUG, to avoid performance degradation.  To write debug logs, you can
153specify *--debug* option.
154
[216]155Remote Control
156--------------
[260]157*etherws ctl* controls *etherws sw* by JSON-RPC over HTTP.  This means you can
158control *etherws sw* from remote nodes.  However, allowing remote control
159without careful consideration also allows to attack to your server or
160network.  So control URL is bound to localhost by default.
[170]161
[216]162If you just want to allow remote control, you can use following options for
163example::
[170]164
[216]165  # etherws sw --ctlhost 10.0.0.10 --ctlport 1234
[170]166
[216]167This means allowing remote control from any nodes that can access
[260]16810.0.0.10:1234 TCP/IP.  Of course this is very dangerous as described above.
[170]169
[216]170Here, *etherws ctl* can control remote *etherws sw* using following option::
[170]171
[216]172  # etherws ctl --ctlurl http://10.0.0.10:1234/ctl ...
173
174*etherws sw* controller supports SSL/TLS connection and client authentication
175as well as WebSocket tunnel service.
176
177On server side::
178
179  # etherws sw --ctlhost 10.0.0.10 --ctlport 443 \
180               --ctlhtpasswd htpasswd --ctlsslkey ssl.key --ctlsslcert ssl.crt
181
182On client side::
183
184  # etherws ctl --ctlurl https://10.0.0.10/ctl \
185                --ctluser username --ctlpasswd password ...
186
187Password can be input from stdin as well as WebSocket tunnel creation.
188
[260]189Virtual Machines Connection
190---------------------------
[216]191For example, consider creating following virtual machine network::
192
193  +------------------+             +------------------+
194  | HypervisorA      |             |      HypervisorB |
195  |  +-----+         |             |         +-----+  |
196  |  | VM  |         |             |         | VM  |  |
197  |  +--+--+         |             |         +--+--+  |
[260]198  |  (vnet0)         |             |         (vnet0)  |
[216]199  |     |            |             |            |     |
[260]200  | [etherws] (eth0) |             | (eth0) [etherws] |
[216]201  +----||--------+---+             +----+-------||----+
202       ||        |                      |       ||
[260]203       ||   -----+--------- // ---------+-----  ||
[216]204       ||           (Physical Network)          ||
205       ||                                       ||
206       ``=======================================''
207                   (WebSocket Tunnel)
208
[260]209Existing network interfaces can also be added to *etherws sw*.
210So in this case, this will be created by following commands.
[216]211
212on HypervisorA::
213
214  # etherws sw
[260]215  # etherws ctl addport netdev vnet0
[216]216
217on HypervisorB::
218
219  # etherws sw
[260]220  # etherws ctl addport netdev vnet0
[216]221  # etherws ctl addport client ws://HypervisorA/
222
[260]223Of course, you can create the TAP port and connect these using the Linux Bridge
224or the like.
225
[141]226History
227=======
[276]2281.3
[280]229  - logging support
[279]230  - http proxy support on client connection
[276]231  - fix listport bug on tornado 4.0.x
232
[274]2331.2 (2014-12-29 JST)
234  - verification of controller SSL certificate support
235  - correspond to some library updates
236
[260]2371.1 (2013-10-10 JST)
238  - netdev (existing network interfaces) support
239
[220]2401.0 (2012-08-18 JST)
[216]241  - global architecture change
242
[170]2430.7 (2012-06-29 JST)
244  - switching support
245  - multiple ports support
246
[162]2470.6 (2012-06-16 JST)
248  - improve performance
249
[160]2500.5 (2012-05-20 JST)
251  - added passwd option to client mode
252  - fixed bug: basic authentication password cannot contain colon
253  - fixed bug: client loops meaninglessly even if server stops
254
[158]2550.4 (2012-05-19 JST)
256  - server certificate verification support
257
[152]2580.3 (2012-05-17 JST)
259  - client authentication support
260
[144]2610.2 (2012-05-16 JST)
262  - SSL/TLS connection support
263
2640.1 (2012-05-15 JST)
[141]265  - First release
Note: See TracBrowser for help on using the repository browser.