From 4a9e41b0b7f23fd4e7d5cd55e08576699bfc7a91 Mon Sep 17 00:00:00 2001 From: Datong Sun Date: Sun, 19 Sep 2021 00:36:40 -0700 Subject: [PATCH] chore(*) refactor Phantun and fake-tcp to their own crates --- Cargo.toml | 20 +- README.md | 146 +++++++++++++++ fake-tcp/Cargo.toml | 19 ++ fake-tcp/LICENSE-APACHE | 201 +++++++++++++++++++++ fake-tcp/LICENSE-MIT | 27 +++ fake-tcp/README.md | 14 ++ src/fake_tcp/mod.rs => fake-tcp/src/lib.rs | 0 {src/fake_tcp => fake-tcp/src}/packet.rs | 0 images/traffic-flow.png | Bin 0 -> 74521 bytes phantun/Cargo.toml | 20 ++ phantun/LICENSE-APACHE | 201 +++++++++++++++++++++ phantun/LICENSE-MIT | 27 +++ phantun/README.md | 13 ++ {src => phantun/src}/bin/client.rs | 4 +- {src => phantun/src}/bin/server.rs | 4 +- src/lib.rs | 1 - 16 files changed, 677 insertions(+), 20 deletions(-) create mode 100644 README.md create mode 100644 fake-tcp/Cargo.toml create mode 100644 fake-tcp/LICENSE-APACHE create mode 100644 fake-tcp/LICENSE-MIT create mode 100644 fake-tcp/README.md rename src/fake_tcp/mod.rs => fake-tcp/src/lib.rs (100%) rename {src/fake_tcp => fake-tcp/src}/packet.rs (100%) create mode 100644 images/traffic-flow.png create mode 100644 phantun/Cargo.toml create mode 100644 phantun/LICENSE-APACHE create mode 100644 phantun/LICENSE-MIT create mode 100644 phantun/README.md rename {src => phantun/src}/bin/client.rs (98%) rename {src => phantun/src}/bin/server.rs (97%) delete mode 100644 src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index 9f45316..35a885f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,16 +1,6 @@ -[package] -name = "phantom" -version = "0.1.0" -edition = "2018" +[workspace] -[dependencies] -bytes = "1" -pnet = "0.28.0" -tokio-tun = "0.3.15" -tokio = { version = "1.11.0", features = ["full"] } -lru_time_cache = "0.11.11" -rand = { version = "0.8.4", features = ["small_rng"] } -clap = "2.33.3" -log = "0.4" -pretty_env_logger = "0.4.0" -socket2 = { version = "0.4.2", features = ["all"] } +members = [ + "fake-tcp", + "phantun", +] diff --git a/README.md b/README.md new file mode 100644 index 0000000..39cb2e6 --- /dev/null +++ b/README.md @@ -0,0 +1,146 @@ +# Phantun + +A lightweight and fast UDP to TCP obfuscator. + +## Overview + +Phanton is a project that obfuscated UDP packets into TCP connections. It aims to +achieve maximum performance with minimum processing and encapsulation overhead. + +It is commonly used in environments where UDP is blocked/throttled but TCP is allowed through. + +Phanton simply converts a stream of UDP packets into obfuscated TCP stream packets. The TCP stack +used by Phantun is designed to pass through most L3/L4 stateful/stateless firewalls/NAT +devices. It will **not** be able to pass through L7 proxies. +However, the advantage of this approach is that none of the common UDP over TCP performance killer +such as retransmissions and flow control will occur. The underlying UDP properties such as +out-of-order delivery are fully preserved even if the connection ends up looking like a TCP +connection from the perspective of firewalls/NAT devices. + +![Traffic flow diagram](images/traffic-flow.png) + +## Usage + +Phantun creates TUN interface for both the Client and Server. For Client, Phantun assigns itself the IP address +`192.168.200.2` and for Server, it assigns `192.168.201.2`. Therefore, your Kernel must have +`net.ipv4.ip_forward` enabled and setup appropriate iptables rules for NAT between your physical +NIC address and Phantun's TUN interface address. + +### Enable Kernel IP forwarding + +Edit `/etc/sysctl.conf`, add `net.ipv4.ip_forward=1` and run `sudo sysctl -p /etc/sysctl.conf`. + +### Add required firewall rules (using nftables as an example) + +#### Client + +Client simply need SNAT enabled on the physical interface to translate Phantun's address into +one that can be used on the physical network. This can be done simply with masquerade. + +Note: change `eth0` to whatever actual physical interface name is + +``` +table inet nat { + chain postrouting { + type nat hook postrouting priority srcnat; policy accept; + iifname tun0 oif eth0 masquerade + } +} +``` + +#### Server + +Server needs to DNAT the TCP listening port to Phantun's TUN interface address. + +Note: change `eth0` to whatever actual physical interface name is and `4567` to +actual TCP port number used by Phanton server + +``` +table ip nat { + chain prerouting { + type nat hook prerouting priority dstnat; policy accept; + iif eth0 tcp dport 4567 dnat to 192.168.201.2 + } +} +``` + +### Give Phantun binaries required capability to it can be run as non-root (Optional) + +It is ill-advised to run network facing applications as root user. Phantun can be run fully +as non-root user with the `cap_net_admin` capability. + +``` +sudo setcap cap_net_admin=+pe phantun_server +sudo setcap cap_net_admin=+pe phantun_client +``` + + +### Start + +#### Server + +Note: `4567` is the TCP port Phantun should listen on and must corresponds to the DNAT +rule specified above. `127.0.0.1:1234` is the UDP Server to connect to for new connections. + +``` +RUST_LOG=info /usr/local/bin/phantun_server --local 4567 --remote 127.0.0.1:1234 +``` + +#### Client + +Note: `127.0.0.1:1234` is the UDP address and port Phantun should listen on. `10.0.0.1:4567` is +the Phantun Server to connect. + +``` +RUST_LOG=info /usr/local/bin/phantun_client --local 127.0.0.1:1234 --remote 10.0.0.1:4567 +``` + +## MTU overhead + +Phantun aims to keep tunneling overhead to the minimum. The overhead compared to a plain UDP packet +is the following: + +Plain UDP packet: 20 byte IP header + 8 byte UDP header = 28 bytes +Phantun obfuscated UDP packet: 20 byte IP header + 20 byte TCP header = 40 bytes + +Phantun's additional overhead: 12 bytes. I other words, when using Phantun, the usable payload for +UDP packet is reduced by 12 bytes. This is the minimum overhead possible when doing such kind +of obfuscation. + +## Version compatibility + +While the TCP stack is fairly stable, the general expectation is that you should run same minor versions +of Server/Client of Phantun on both ends to ensure maximum compatibility. + +## Compariation to udp2raw +[udp2raw](https://github.com/wangyu-/udp2raw-tunnel) is another popular project by [@wangyu-](https://github.com/wangyu-) +that is very similiar to what Phantun can do. In fact I took inspirations of Phantun from udp2raw. The biggest reason for +developing Phanton is because of lack of performance when running udp2raw (especially on multi-core systems such as Raspberry Pi). +However, the goal is never to be as feature complete as udp2raw and only support the most common use cases. Most notably, UDP over ICMP +and UDP over UDP mode are not supported and there is no anti-replay nor encryption support. The benefit of this is much better +performance overall and less MTU overhead because lack of additional headers inside the TCP payload. + +Here is a quick overview of comparison between those two to help you choose: + +| | Phantun | udp2raw | +|--------------------------------------------------|:-------------:|:-----------------:| +| UDP over FakeTCP obfuscation | ✅ | ✅ | +| UDP over ICMP obfuscation | ❌ | ✅ | +| UDP over UDP obfuscation | ❌ | ✅ | +| Multi-threaded | ✅ | ❌ | +| Throughput | Better | Good | +| Raw IP mode | TUN interface | Raw sockets + BPF | +| Tunneling MTU overhead | 12 bytes | 44 bytes | +| Seprate TCP connections for each UDP connection | Client/Server | Server only | +| Anti-replay, encryption | ❌ | ✅ | +| IPv6 | Planned | ✅ | + +## License + +Copyright 2021 Datong Sun + +Licensed under the Apache License, Version 2.0 or the MIT license +, at your +option. Files in the project may not be +copied, modified, or distributed except according to those terms. diff --git a/fake-tcp/Cargo.toml b/fake-tcp/Cargo.toml new file mode 100644 index 0000000..3b05661 --- /dev/null +++ b/fake-tcp/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "fake-tcp" +version = "0.1.0" +edition = "2018" +authors = ["Datong Sun "] +license = "MIT OR Apache-2.0" +repository = "https://github.com/dndx/phantun" +readme = "README.md" +description = """ +A TUN interface based, user space, asynchronous and high performance TCP stack that allows +packet oriented tunneling with minimum overhead. +""" +[dependencies] +bytes = "1" +pnet = "0.28.0" +tokio-tun = "0.3.15" +tokio = { version = "1.11.0", features = ["full"] } +rand = { version = "0.8.4", features = ["small_rng"] } +log = "0.4" diff --git a/fake-tcp/LICENSE-APACHE b/fake-tcp/LICENSE-APACHE new file mode 100644 index 0000000..04169a4 --- /dev/null +++ b/fake-tcp/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2014-2021 The Rust Project Developers + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/fake-tcp/LICENSE-MIT b/fake-tcp/LICENSE-MIT new file mode 100644 index 0000000..90a2d39 --- /dev/null +++ b/fake-tcp/LICENSE-MIT @@ -0,0 +1,27 @@ +MIT License + +Copyright (c) 2014-2021 The Rust Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/fake-tcp/README.md b/fake-tcp/README.md new file mode 100644 index 0000000..5aa6bb5 --- /dev/null +++ b/fake-tcp/README.md @@ -0,0 +1,14 @@ +# fake-tcp + +A TUN interface based, user space, asynchronous and high performance TCP stack that allows +packet oriented tunneling with minimum overhead. + +## License + +Copyright 2021 Datong Sun + +Licensed under the Apache License, Version 2.0 or the MIT license +, at your +option. Files in the project may not be +copied, modified, or distributed except according to those terms. diff --git a/src/fake_tcp/mod.rs b/fake-tcp/src/lib.rs similarity index 100% rename from src/fake_tcp/mod.rs rename to fake-tcp/src/lib.rs diff --git a/src/fake_tcp/packet.rs b/fake-tcp/src/packet.rs similarity index 100% rename from src/fake_tcp/packet.rs rename to fake-tcp/src/packet.rs diff --git a/images/traffic-flow.png b/images/traffic-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..e34e7ae021a2b2a2740daa46a9a30eace56d78e3 GIT binary patch literal 74521 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 W@4zSz%&!vmflpuC2$6sB7XEL%nax`O literal 0 HcmV?d00001 diff --git a/phantun/Cargo.toml b/phantun/Cargo.toml new file mode 100644 index 0000000..a655072 --- /dev/null +++ b/phantun/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "phantun" +version = "0.1.0" +edition = "2018" +authors = ["Datong Sun "] +license = "MIT OR Apache-2.0" +repository = "https://github.com/dndx/phantun" +readme = "README.md" +description = """ +Turns transforms UDP stream into (fake) TCP streams that can go through +Layer 4 firewalls. +""" +[dependencies] +clap = "2.33.3" +socket2 = { version = "0.4.2", features = ["all"] } +fake-tcp = { path = "../fake-tcp" } +tokio-tun = "0.3.15" +tokio = { version = "1.11.0", features = ["full"] } +log = "0.4" +pretty_env_logger = "0.4.0" diff --git a/phantun/LICENSE-APACHE b/phantun/LICENSE-APACHE new file mode 100644 index 0000000..04169a4 --- /dev/null +++ b/phantun/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2014-2021 The Rust Project Developers + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/phantun/LICENSE-MIT b/phantun/LICENSE-MIT new file mode 100644 index 0000000..90a2d39 --- /dev/null +++ b/phantun/LICENSE-MIT @@ -0,0 +1,27 @@ +MIT License + +Copyright (c) 2014-2021 The Rust Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/phantun/README.md b/phantun/README.md new file mode 100644 index 0000000..46476e4 --- /dev/null +++ b/phantun/README.md @@ -0,0 +1,13 @@ +# Phantun + +Client/Server crate, see [Phantun Project README.md](https://github.com/dndx/phantun/blob/main/README.md) for more information. + +## License + +Copyright 2021 Datong Sun + +Licensed under the Apache License, Version 2.0 or the MIT license +, at your +option. Files in the project may not be +copied, modified, or distributed except according to those terms. diff --git a/src/bin/client.rs b/phantun/src/bin/client.rs similarity index 98% rename from src/bin/client.rs rename to phantun/src/bin/client.rs index 8f1e241..85a9539 100644 --- a/src/bin/client.rs +++ b/phantun/src/bin/client.rs @@ -1,7 +1,7 @@ use clap::{App, Arg}; +use fake_tcp::packet::MAX_PACKET_LEN; +use fake_tcp::{Socket, Stack}; use log::{debug, error, info}; -use phantom::fake_tcp::packet::MAX_PACKET_LEN; -use phantom::fake_tcp::{Socket, Stack}; use std::collections::HashMap; use std::convert::TryInto; use std::net::{SocketAddr, SocketAddrV4}; diff --git a/src/bin/server.rs b/phantun/src/bin/server.rs similarity index 97% rename from src/bin/server.rs rename to phantun/src/bin/server.rs index b0d7f7f..f713e88 100644 --- a/src/bin/server.rs +++ b/phantun/src/bin/server.rs @@ -1,7 +1,7 @@ use clap::{App, Arg}; +use fake_tcp::packet::MAX_PACKET_LEN; +use fake_tcp::Stack; use log::info; -use phantom::fake_tcp::packet::MAX_PACKET_LEN; -use phantom::fake_tcp::Stack; use std::net::SocketAddrV4; use tokio::net::UdpSocket; use tokio::time::{self, Duration}; diff --git a/src/lib.rs b/src/lib.rs deleted file mode 100644 index 186356f..0000000 --- a/src/lib.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod fake_tcp;