{ "info": { "author": "Atzm WATANABE", "author_email": "atzm@atzm.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "License :: OSI Approved :: BSD License", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 2.7", "Topic :: System :: Networking" ], "description": "Introduction\n============\netherws is an implementation of software switch with the Ethernet over\nWebSocket tunnel.\n\nOverview\n========\n*etherws sw* is a simple virtual ethernet switch. And this is controlled by\n*etherws ctl*::\n\n [tap] [netdev]\n | |\n +--+------+--+ (control)\n | etherws sw | <-----------+\n +-----||-----+ |\n || +-------------+\n (WebSocket) | etherws ctl |\n || +-------------+\n +-----||-----+ |\n | etherws sw | <-----------+\n +--+------+--+ (control)\n | |\n [tap] [netdev]\n\nBasic Usage\n===========\nFor example, consider creating following simple network::\n\n (Physical Network)\n -----+--------- // --------+-----\n | 10.0.0.10 | 10.0.0.5\n +----+-----+ +-----+----+ \n | NodeA | | NodeB |\n | | | |\n | [ethws0] | | [ethws0] |\n +----||----+ +----||----+\n || 192.0.2.10/24 || 192.0.2.5/24\n ``===================''\n (WebSocket Tunnel)\n\nIn this case, WebSocket Tunnel will be created by following commands.\n\non NodeA::\n\n # etherws sw\n # etherws ctl addport tap ethws0\n # etherws ctl setif --address 192.0.2.10 --netmask 255.255.255.0 1\n\non NodeB::\n\n # etherws sw\n # etherws ctl addport tap ethws0\n # etherws ctl setif --address 192.0.2.5 --netmask 255.255.255.0 1\n # etherws ctl addport client ws://10.0.0.10/\n\n*listport*, *listif* or *listfdb* commands will show you current port list,\ninterface list, or forwarding database entries::\n\n # etherws ctl listport\n # etherws ctl listif\n # etherws ctl listfdb\n\nUsing SSL/TLS\n-------------\netherws supports SSL/TLS connection. Tunnels will be encrypted and server will\nbe verified by using following options.\n\nOn server side::\n\n # etherws sw --sslkey ssl.key --sslcert ssl.crt\n\n*ssl.key* is a server private key, and *ssl.crt* is a server\ncertificate.\n\nOn client side::\n\n # etherws ctl addport client --cacerts ssl.crt wss://10.0.0.10/\n\nURL scheme was just changed to *wss*, and CA certificate to verify server\ncertificate was specified.\n\nClient verifies server certificate by default. So, for example, *addport* will\nfail if your server uses self-signed certificate and client uses another CA\ncertificate.\n\nIf you want to just encrypt tunnels and do not need to verify server\ncertificate, then you can use *--insecure* option::\n\n # etherws ctl addport client --insecure wss://10.0.0.10/\n\nNote: see http://docs.python.org/library/ssl.html for more information about\ncertificates.\n\nUsing HTTP Proxy\n----------------\nYou can create WebSocket tunnels via HTTP proxy. Proxy server's address and\nport number are specified by generic environment variables: e.g. *$http_proxy*\n\nSee https://docs.python.org/library/urllib.html for more information about\nenvironment variables for the proxy.\n\nIf you want to know what WebSocket client requires to HTTP proxy server, you\ncan see library documentation: https://pypi.python.org/pypi/websocket-client/\n\nClient Authentication\n---------------------\netherws supports HTTP Basic Authentication. This means you can use etherws as\nsimple L2-VPN server/client.\n\nOn server side, etherws requires user informations in Apache htpasswd format\n(and currently supports SHA-1 digest only). To create this file::\n\n # htpasswd -s -c filename username\n\nIf you do not have htpasswd command, then you can use python one-liner\ninstead::\n\n # python -c 'import hashlib; print(\"username:{SHA}\" + hashlib.sha1(\"password\").digest().encode(\"base64\"))'\n\nTo run server with this file::\n\n # etherws sw --htpasswd filename\n\nOn client side, etherws requires username and password from option with\n*addport* command::\n\n # etherws ctl addport client --user username --passwd password ws://10.0.0.10/\n\nOr, password can be input from stdin::\n\n # etherws ctl addport client --user username ws://10.0.0.10/\n Client Password:\n\nIf authentication did not succeed, then *addport* will fail.\n\nNote that you should not use HTTP Basic Authentication without SSL/TLS support,\nbecause this is insecure in itself.\n\nAdvanced Usage\n==============\n\nRemote Control\n--------------\n*etherws ctl* controls *etherws sw* by JSON-RPC over HTTP. This means you can\ncontrol *etherws sw* from remote nodes. However, allowing remote control\nwithout careful consideration also allows to attack to your server or\nnetwork. So control URL is bound to localhost by default.\n\nIf you just want to allow remote control, you can use following options for\nexample::\n\n # etherws sw --ctlhost 10.0.0.10 --ctlport 1234\n\nThis means allowing remote control from any nodes that can access\n10.0.0.10:1234 TCP/IP. Of course this is very dangerous as described above.\n\nHere, *etherws ctl* can control remote *etherws sw* using following option::\n\n # etherws ctl --ctlurl http://10.0.0.10:1234/ctl ...\n\n*etherws sw* controller supports SSL/TLS connection and client authentication\nas well as WebSocket tunnel service.\n\nOn server side::\n\n # etherws sw --ctlhost 10.0.0.10 --ctlport 443 \\\n --ctlhtpasswd htpasswd --ctlsslkey ssl.key --ctlsslcert ssl.crt\n\nOn client side::\n\n # etherws ctl --ctlurl https://10.0.0.10/ctl \\\n --ctluser username --ctlpasswd password ...\n\nPassword can be input from stdin as well as WebSocket tunnel creation.\n\nLogging\n-------\netherws uses standard logging library. You can customize the logger using the\n*fileConfig* described in https://docs.python.org/library/logging.config.html\n\nTo run *etherws sw* with the custom logger::\n\n # etherws sw --logconf /path/to/logging.ini ...\n\netherws uses a logger stream named \"etherws\". And internally Tornado uses\nsome logger streams described in http://www.tornadoweb.org/en/stable/log.html\n\nNote: etherws does not write debug logs even if you simply configure loglevel\nDEBUG, to avoid performance degradation. To write debug logs, you can\nspecify *--debug* option.\n\nVirtual Machines Connection\n---------------------------\nFor example, consider creating following virtual machine network::\n\n +------------------+ +------------------+\n | HypervisorA | | HypervisorB |\n | +-----+ | | +-----+ |\n | | VM | | | | VM | |\n | +--+--+ | | +--+--+ |\n | (vnet0) | | (vnet0) |\n | | | | | |\n | [etherws] (eth0) | | (eth0) [etherws] |\n +----||--------+---+ +----+-------||----+\n || | | ||\n || -----+--------- // ---------+----- ||\n || (Physical Network) ||\n || ||\n ``=======================================''\n (WebSocket Tunnel)\n\nExisting network interfaces can also be added to *etherws sw*.\nSo in this case, this will be created by following commands.\n\non HypervisorA::\n\n # etherws sw\n # etherws ctl addport netdev vnet0\n\non HypervisorB::\n\n # etherws sw\n # etherws ctl addport netdev vnet0\n # etherws ctl addport client ws://HypervisorA/\n\nOf course, you can create TAP ports and connect them using the Linux Bridge\nor the like.\n\nHistory\n=======\n1.3 (2015-06-26 JST)\n - logging support\n - http proxy support on client connection\n - fix listport bug on tornado 4.0.x\n\n1.2 (2014-12-29 JST)\n - verification of controller SSL certificate support\n - correspond to some library updates\n\n1.1 (2013-10-10 JST)\n - netdev (existing network interfaces) support\n\n1.0 (2012-08-18 JST)\n - global architecture change\n\n0.7 (2012-06-29 JST)\n - switching support\n - multiple ports support\n\n0.6 (2012-06-16 JST)\n - improve performance\n\n0.5 (2012-05-20 JST)\n - added passwd option to client mode\n - fixed bug: basic authentication password cannot contain colon\n - fixed bug: client loops meaninglessly even if server stops\n\n0.4 (2012-05-19 JST)\n - server certificate verification support\n\n0.3 (2012-05-17 JST)\n - client authentication support\n\n0.2 (2012-05-16 JST)\n - SSL/TLS connection support\n\n0.1 (2012-05-15 JST)\n - First release", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "UNKNOWN", "keywords": "http,websocket,ethernet,network", "license": "BSD-2", "maintainer": null, "maintainer_email": null, "name": "etherws", "package_url": "https://pypi.org/project/etherws/", "platform": "Linux", "project_url": "https://pypi.org/project/etherws/", "project_urls": { "Download": "UNKNOWN", "Homepage": "UNKNOWN" }, "release_url": "https://pypi.org/project/etherws/1.3/", "requires_dist": null, "requires_python": null, "summary": "Ethernet over WebSocket", "version": "1.3" }, "last_serial": 1607654, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "b0541c9f7391290c3bca70c81256f290", "sha256": "0dbc22b074906be8bdd79a43f8ecbe31a9453cbd13bdb39ae1c5d3700c5a11d8" }, "downloads": -1, "filename": "etherws-0.1.tar.gz", "has_sig": false, "md5_digest": "b0541c9f7391290c3bca70c81256f290", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4150, "upload_time": "2012-05-15T10:43:08", "url": "https://files.pythonhosted.org/packages/e8/65/f62f1850ad700351d663c67c637f1acf60045565241c670f8734242294bb/etherws-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "9027714e87e670069e61d7ca73075be4", "sha256": "e5c73edfaed439d82a9f0fc4593ab7270a89f7f9b8d7f31835fc0b48502bf564" }, "downloads": -1, "filename": "etherws-0.2.tar.gz", "has_sig": false, "md5_digest": "9027714e87e670069e61d7ca73075be4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4743, "upload_time": "2012-05-15T17:26:06", "url": "https://files.pythonhosted.org/packages/14/1d/e01e80495077d4d1ffa25c6ebffc2982afca5a95eaf2fb19b0fbbcf6fea8/etherws-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "aa251e2b782097c8f199971968924985", "sha256": "05780f70673319e96879a4c8d06c171e6683559f3b7e82213c1d15e5704c6fad" }, "downloads": -1, "filename": "etherws-0.3.tar.gz", "has_sig": false, "md5_digest": "aa251e2b782097c8f199971968924985", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6033, "upload_time": "2012-05-16T17:10:33", "url": "https://files.pythonhosted.org/packages/1d/89/0c3736135bac11540b601160d4578b77fdf22b69c837dc731bddb731de9b/etherws-0.3.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "d5c252f554ae0840f0763498e44e1971", "sha256": "f62f7115f91fdf46d8b5ac124b8ff60d8c0f983ffa7f341f1990a9455e687956" }, "downloads": -1, "filename": "etherws-0.4.tar.gz", "has_sig": false, "md5_digest": "d5c252f554ae0840f0763498e44e1971", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6417, "upload_time": "2012-05-18T20:46:44", "url": "https://files.pythonhosted.org/packages/20/cc/2e34efd5d5dc41d94aef71b1ce0d8cc31bc652b0701babc6d8ad9dcd9f5f/etherws-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "8bd78ffb0337e19030824e201e3dac9a", "sha256": "ecd19c4dcefd3a7fcb752f9ed3d50ab5f9455aa74a999065c23be1a86c522326" }, "downloads": -1, "filename": "etherws-0.5.tar.gz", "has_sig": false, "md5_digest": "8bd78ffb0337e19030824e201e3dac9a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6759, "upload_time": "2012-05-19T19:52:42", "url": "https://files.pythonhosted.org/packages/28/3b/9d4c96ee7522a6b2b41b4543930b91f5cb4486a623ff7ac4b15ce36bd05e/etherws-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "7644018ab522d812faa05dec6ec6d8c2", "sha256": "7dd81cb664cb356c825f7a284834337b89614ea290264bd959f52f783fdb0ce9" }, "downloads": -1, "filename": "etherws-0.6.tar.gz", "has_sig": false, "md5_digest": "7644018ab522d812faa05dec6ec6d8c2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6856, "upload_time": "2012-06-16T13:03:41", "url": "https://files.pythonhosted.org/packages/bb/12/8044cfa106e3e79a1c81835d5f870dfed1aaa37ddfc42b8fc48338e70375/etherws-0.6.tar.gz" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "865cacd3d46d29c27d11a6bb1e619a6d", "sha256": "fd39998ba44a9dfe2924ad60b1154220306c7236d325736650ee76b3207ecd5d" }, "downloads": -1, "filename": "etherws-0.7.tar.gz", "has_sig": false, "md5_digest": "865cacd3d46d29c27d11a6bb1e619a6d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8892, "upload_time": "2012-06-28T17:11:29", "url": "https://files.pythonhosted.org/packages/78/56/4738ae88589a211c62dbc3ff1c92142dc406315de488a63c7f2d15cf2c64/etherws-0.7.tar.gz" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "5f52f32d0bc4ec7e017d4a4d42f24ad6", "sha256": "dd98bb34262bf8fd08a7d4e05a1d1a6c4ec7898c991ce06a91b91108380bc5a5" }, "downloads": -1, "filename": "etherws-1.0.tar.gz", "has_sig": false, "md5_digest": "5f52f32d0bc4ec7e017d4a4d42f24ad6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15903, "upload_time": "2012-08-17T15:04:07", "url": "https://files.pythonhosted.org/packages/32/00/e67ea59ded04246a65428de144542f2ebbd03cbe0366340e393fb027fc7e/etherws-1.0.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "07c6123ec02265c0aab0db91b8f3c720", "sha256": "82d39439b56479e6533d033db571abfc6fa6e43b75c577896b1e5e785194d62f" }, "downloads": -1, "filename": "etherws-1.1.tar.gz", "has_sig": false, "md5_digest": "07c6123ec02265c0aab0db91b8f3c720", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16509, "upload_time": "2013-10-09T17:11:35", "url": "https://files.pythonhosted.org/packages/c5/01/a0b6c7c94c06c866c5ed5011206f65aa7a101fcb53f3a5805a4e5b1de3c0/etherws-1.1.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "93e19fd069a866515b376b7d734346d6", "sha256": "85b3f283a6b3c9be2478a318e952da1f1f21e1cd4f885f60faebbbdb5566bbe3" }, "downloads": -1, "filename": "etherws-1.2.tar.gz", "has_sig": false, "md5_digest": "93e19fd069a866515b376b7d734346d6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16764, "upload_time": "2014-12-29T09:12:03", "url": "https://files.pythonhosted.org/packages/2c/72/af160bbdd091a009b5dd66dcca506b5115ebe72811dc9f47043e5f388d45/etherws-1.2.tar.gz" } ], "1.3": [ { "comment_text": "", "digests": { "md5": "bdda9764bb9a46418dc22571b4b29e49", "sha256": "aafa5b02f3011e0c6ea873850fd8a23eac6288377ad309b004c1d18b4e9a05ec" }, "downloads": -1, "filename": "etherws-1.3.tar.gz", "has_sig": false, "md5_digest": "bdda9764bb9a46418dc22571b4b29e49", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17927, "upload_time": "2015-06-26T10:55:05", "url": "https://files.pythonhosted.org/packages/0b/86/68d3591bd37d4d7b1765661bc775ebe5f9b75a0bbee046894647bea73147/etherws-1.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "bdda9764bb9a46418dc22571b4b29e49", "sha256": "aafa5b02f3011e0c6ea873850fd8a23eac6288377ad309b004c1d18b4e9a05ec" }, "downloads": -1, "filename": "etherws-1.3.tar.gz", "has_sig": false, "md5_digest": "bdda9764bb9a46418dc22571b4b29e49", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17927, "upload_time": "2015-06-26T10:55:05", "url": "https://files.pythonhosted.org/packages/0b/86/68d3591bd37d4d7b1765661bc775ebe5f9b75a0bbee046894647bea73147/etherws-1.3.tar.gz" } ] }