From 8f3bf5c7c7109821d737a6a67a7fd51fdf3b0917 Mon Sep 17 00:00:00 2001 From: Yujia Qiao Date: Sat, 11 Dec 2021 20:30:42 +0800 Subject: [PATCH] feat: init --- .gitignore | 3 + Cargo.lock | 932 ++++++++++++++++++++++++ Cargo.toml | 28 + LICENSE | 176 +++++ README.md | 100 +++ doc/benchmark.md | 87 +++ doc/img/overview.excalidraw | 1356 +++++++++++++++++++++++++++++++++++ doc/img/overview.png | Bin 0 -> 155129 bytes doc/img/rathole-logo.png | Bin 0 -> 28370 bytes doc/img/tcp_bitrate.svg | 1 + doc/img/tcp_latency.svg | 1 + doc/internals.md | 34 + doc/out-of-scope.md | 9 + example/minimal/client.toml | 6 + example/minimal/server.toml | 7 + src/cli.rs | 20 + src/client.rs | 242 +++++++ src/config.rs | 124 ++++ src/helper.rs | 15 + src/lib.rs | 153 ++++ src/main.rs | 10 + src/multi_map.rs | 114 +++ src/protocol.rs | 137 ++++ src/server.rs | 389 ++++++++++ 24 files changed, 3944 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 doc/benchmark.md create mode 100644 doc/img/overview.excalidraw create mode 100644 doc/img/overview.png create mode 100644 doc/img/rathole-logo.png create mode 100644 doc/img/tcp_bitrate.svg create mode 100644 doc/img/tcp_latency.svg create mode 100644 doc/internals.md create mode 100644 doc/out-of-scope.md create mode 100644 example/minimal/client.toml create mode 100644 example/minimal/server.toml create mode 100644 src/cli.rs create mode 100644 src/client.rs create mode 100644 src/config.rs create mode 100644 src/helper.rs create mode 100644 src/lib.rs create mode 100644 src/main.rs create mode 100644 src/multi_map.rs create mode 100644 src/protocol.rs create mode 100644 src/server.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..40082fd6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target +perf.data +perf.data.old diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 00000000..5c3d5e83 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,932 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "anyhow" +version = "1.0.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b26702f315f53b6071259e15dd9d64528213b44d61de1ec926eca7715d62203" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "backoff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fe17f59a06fe8b87a6fc8bf53bb70b3aba76d7685f432487a68cd5552853625" +dependencies = [ + "futures-core", + "getrandom", + "instant", + "pin-project", + "rand", + "tokio", +] + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bumpalo" +version = "3.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1e260c3a9040a7c19a12468758f4c16f31a81a1fe087482be9570ec864bb6c" + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "cc" +version = "1.0.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "winapi", +] + +[[package]] +name = "clap" +version = "3.0.0-beta.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "feff3878564edb93745d58cf63e17b63f24142506e7a20c87a5521ed7bfb1d63" +dependencies = [ + "atty", + "bitflags", + "clap_derive", + "indexmap", + "lazy_static", + "os_str_bytes", + "strsim", + "termcolor", + "textwrap", + "unicase", +] + +[[package]] +name = "clap_derive" +version = "3.0.0-beta.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b15c6b4f786ffb6192ffe65a36855bc1fc2444bcd0945ae16748dcd6ed7d0d3" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "fdlimit" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4c9e43643f5a3be4ca5b67d26b98031ff9db6806c3440ae32e02e3ceac3f1b" +dependencies = [ + "libc", +] + +[[package]] +name = "futures-core" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "629316e42fe7c2a0b9a65b47d159ceaa5453ab14e8f0a3c5eedbb8cd55b4a445" + +[[package]] +name = "getrandom" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "indexmap" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "js-sys" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8521a1b57e76b1ec69af7599e75e38e7b7fad6610f037db8c79b127201b5d119" + +[[package]] +name = "lock_api" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "matchers" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "mio" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "winapi", +] + +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi", +] + +[[package]] +name = "ntapi" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" +dependencies = [ + "winapi", +] + +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" + +[[package]] +name = "os_str_bytes" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addaa943333a514159c80c97ff4a93306530d965d27e139188283cd13e06a799" +dependencies = [ + "memchr", +] + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall", + "smallvec", + "winapi", +] + +[[package]] +name = "pin-project" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "576bc800220cc65dac09e99e97b08b358cfab6e17078de8dc5fee223bd2d0c08" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" + +[[package]] +name = "ppv-lite86" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba508cc11742c0dc5c1659771673afbab7a0efab23aa17e854cbab0837ed0b43" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rathole" +version = "0.1.0" +dependencies = [ + "anyhow", + "backoff", + "bincode", + "bytes", + "clap", + "fdlimit", + "hex", + "lazy_static", + "rand", + "ring", + "serde", + "socket2", + "tokio", + "toml", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "redox_syscall" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +dependencies = [ + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "ryu" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b30e4c09749c107e83dd61baf9604198efc4542863c88af39dafcaca89c7c9f9" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "serde" +version = "1.0.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0ffa0837f2dfa6fb90868c2b5468cad482e175f7dad97e7421951e663f2b527" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] + +[[package]] +name = "smallvec" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" + +[[package]] +name = "socket2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dc90fe6c7be1a323296982db1836d1ea9e47b6839496dde9a541bc496df3516" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8daf5dd0bb60cbd4137b1b587d2fc0ae729bc07cf01cd70b36a1ed5ade3b9d59" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "termcolor" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0066c8d12af8b5acd21e00547c3797fde4e8677254a7ee429176ccebbe93dd80" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "thread_local" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tokio" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e992e41e0d2fb9f755b37446f20900f64446ef54874f40a60c78f021ac6144" +dependencies = [ + "autocfg", + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "once_cell", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "tokio-macros", + "winapi", +] + +[[package]] +name = "tokio-macros" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9efc1aba077437943f7515666aa2b882dfabfbfdf89c819ea75a8d6e9eaba5e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "toml" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +dependencies = [ + "serde", +] + +[[package]] +name = "tracing" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f480b8f81512e825f337ad51e94c1eb5d3bbdf2b363dcd01e2b19a9ffe3f8e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "tracing-log" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb65ea441fbb84f9f6748fd496cf7f63ec9af5bca94dd86456978d055e8eb28b" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "ansi_term", + "chrono", + "lazy_static", + "matchers", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "unicase" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-segmentation" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" + +[[package]] +name = "unicode-width" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "version_check" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasm-bindgen" +version = "0.2.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" + +[[package]] +name = "web-sys" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 00000000..f5a9e108 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "rathole" +version = "0.1.0" +edition = "2021" +authors = ["Yujia Qiao "] +description = "A reverse proxy for NAT traversal" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[profile.bench] +debug = 1 + +[dependencies] +tokio = { version = "1", features = ["full"] } +bytes = { version = "1"} +clap = "3.0.0-beta.5" +toml = "0.5" +serde = {version = "1.0", features = ["derive"]} +anyhow = "1.0" +ring = "0.16" +bincode = "1" +lazy_static = "1.4.0" +hex = "0.4" +rand = "0.8.0" +backoff = {version="0.3.0", features=["tokio"]} +tracing = "0.1" +tracing-subscriber = "0.2" +socket2 = "0.4" +fdlimit = "0.2.1" diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..d9a10c0d --- /dev/null +++ b/LICENSE @@ -0,0 +1,176 @@ + 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 diff --git a/README.md b/README.md new file mode 100644 index 00000000..312c6989 --- /dev/null +++ b/README.md @@ -0,0 +1,100 @@ +# rathole +![rathole-logo](./doc/img/rathole-logo.png) + +A fast and stable reverse proxy for NAT traversal, written in Rust + +rathole, like frp, can help to expose the service on the device behind the NAT to the Internet, via a server with a public IP. + +## Quickstart + +To use rathole, you need a server with a public IP, and a device behind the NAT, where some services that need to be exposed to the Internet. + +Assuming you have a NAS at home behind the NAT, and want to expose its ssh service to the Internet: + +1. On the server which has a public IP + +Create `server.toml` with the following content and accommodate it to your needs. +```toml +# server.toml +[server] +bind_addr = "0.0.0.0:2333" # `2333` specifys the port that rathole listens for clients + +[server.services.my_nas_ssh] +token = "use_a_secret_that_only_you_know" # Token that is used to authenticate the client for the service. Change to a arbitrary value. +bind_addr = "0.0.0.0:5202" # `5202` specifys the port that exposes `my_nas_ssh` to the Internet +``` + +Then run: +```bash +./rathole server.toml +``` + +2. On the host which is behind the NAT (your NAS) + +Create `client.toml` with the following content and accommodate it to your needs. +```toml +[client] +remote_addr = "myserver.com:2333" # The address of the server. The port must be the same with the port in `server.bind_addr` + +[client.services.my_nas_ssh] +token = "use_a_secret_that_only_you_know" # Must be the same with the server to pass the validataion +local_addr = "127.0.0.1:22" # The address of the service that needs to be forwarded +``` + +Then run: +```bash +./rathole client.toml +``` + +3. Now the client will try to connect to the server `myserver.com` on port `2333`, and any traffic to `myserver.com:5202` will be forwarded to the client's port `22`. + +So you can `ssh myserver.com:5202` to ssh to your NAS. + +## Configuration +`rathole` can automatically determine to run in the server mode or the client mode, according to the content of the configuration file, if only one of `[server]` and `[client]` block is present, like the example in [Quickstart](#Quickstart). + +But the `[client]` and `[server]` block can also be put in one file. Then on the server side, run `rathole --server config.toml` and on the client side, run `rathole --client config.toml` to explictly tell `rathole` the running mode. + +Here is the full configuration specification: +```toml +[client] +remote_addr = "example.com:2333" # Necessary. The address of the server +default_token = "default_token_if_not_specify" # Optional. The default token of services, if they don't define their own ones + +[client.services.service1] # A service that needs forwarding. The name `service1` can change arbitrarily, as long as identical to the name in the server's configuration +token = "whatever" # Necessary if `client.default_token` not set +local_addr = "127.0.0.1:1081" # Necessary. The address of the service that needs to be forwarded + +[client.services.service2] # Multiple services can be defined +local_addr = "127.0.0.1:1082" + +[server] +bind_addr = "0.0.0.0:2333" # Necessary. The address that the server listens for clients. Generally only the port needs to be change. +default_token = "default_token_if_not_specify" # Optional + +[server.services.service1] # The service name must be identical to the client side +token = "whatever" # Necesary if `server.default_token` not set +bind_addr = "0.0.0.0:8081" # Necessary. The address of the service is exposed at. Generally only the port needs to be change. + +[server.services.service2] +bind_addr = "0.0.0.1:8082" +``` + +# Benchmark + +rathole has similiar latency to frp, but can handle more connections. Also it can provide much better bandwidth than frp. + +See also [Benchmark](./doc/benchmark.md). + +![tcp_bitrate](./doc/img/tcp_bitrate.svg) + +![tcp_latency](./doc/img/tcp_latency.svg) + +# Development + +`rathole` is in active development. A load of features is on the way: + +- [ ] UDP support +- [ ] TLS transport +- [ ] Hot reloading +- [ ] HTTP APIs for configuration diff --git a/doc/benchmark.md b/doc/benchmark.md new file mode 100644 index 00000000..71816a1b --- /dev/null +++ b/doc/benchmark.md @@ -0,0 +1,87 @@ +# Benchmark + +> Date: 2021/12/14 +> +> Arch Linux with 5.15.7-arch1-1 kernel +> +> Intel i7-6600U CPU @ 2.60GHz +> +> 20GB RAM + + +## Bitrate + +![tcp_bitrate](./img/tcp_bitrate.svg) + +rathole with the following configuration: +```toml +[client] +remote_addr = "localhost:2333" +default_token = "123" + +[client.services.foo1] +local_addr = "127.0.0.1:80" + +[server] +bind_addr = "0.0.0.0:2333" +default_token = "123" + +[server.services.foo1] +bind_addr = "0.0.0.0:5202" +``` + +frp 0.38.0 with the following configuration: +```ini +[common] +bind_port = 7000 +authentication_method = token +token = 1233 +``` +```ini +# frpc.ini +[common] +server_addr = 127.0.0.1 +#server_addr = 47.100.208.60 +server_port = 7000 +authentication_method = token +token = 1233 + +[ssh] +type = tcp +local_ip = 127.0.0.1 +local_port = 80 +remote_port = 5203 +``` + +``` +$ iperf3 -v +iperf 3.10.1 (cJSON 1.7.13) +Linux sig 5.15.7-arch1-1 #1 SMP PREEMPT Wed, 08 Dec 2021 14:33:16 +0000 x86_64 +Optional features available: CPU affinity setting, IPv6 flow label, TCP congestion algorithm setting, sendfile / zerocopy, socket pacing, authentication, bind to device, support IPv4 don't fragment +$ sudo iperf3 -s -p 80 +``` + +For rathole benchmark: +``` +$ iperf3 -c 127.0.0.1 -p 5202 +``` + +For frp benchmark: +``` +$ iperf3 -c 127.0.0.1 -p 5203 +``` + +## Latency + +nginx/1.20.2 listens on port 80, with the default test page. + +frp and rathole configuration is same with the previous section. + +Using [ali](https://github.com/nakabonne/ali) with different rate. + +e.g. for rathole 10 QPS benchmark: +``` +ali -r 10 http://127.0.0.1:5202 +``` + +![tcp_latency](./img/tcp_latency.svg) diff --git a/doc/img/overview.excalidraw b/doc/img/overview.excalidraw new file mode 100644 index 00000000..e1598eb8 --- /dev/null +++ b/doc/img/overview.excalidraw @@ -0,0 +1,1356 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 127, + "versionNonce": 80643966, + "isDeleted": false, + "id": "_ROJe0KCjbnKQjLDcc-Ag", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 274.66668701171875, + "y": 87.49995422363281, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 450.66668701171875, + "height": 208.66667175292972, + "seed": 1939336259, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [ + "1Sorez2zxxKqyRilx21-m", + "uJx77oj5eyZPw61wszaJN" + ], + "updated": 1639393963541 + }, + { + "type": "text", + "version": 248, + "versionNonce": 1524512610, + "isDeleted": false, + "id": "X-BwNQGYSBy-tPINiKBCt", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 283.33331298828125, + "y": 94.50007629394531, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 61, + "height": 25, + "seed": 429932333, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "updated": 1639393963541, + "fontSize": 20, + "fontFamily": 1, + "text": "Server", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top" + }, + { + "type": "ellipse", + "version": 166, + "versionNonce": 1926031294, + "isDeleted": false, + "id": "5KLQ8EXnY3KjzuLRGbhJU", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 873.3333129882812, + "y": 151.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 37.33331298828125, + "height": 34.66667175292969, + "seed": 565619875, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [ + "-lU_z4mfDB58ZiJ8HlTxY" + ], + "updated": 1639393963541 + }, + { + "type": "line", + "version": 112, + "versionNonce": 447019810, + "isDeleted": false, + "id": "ViC_qO7r1ED1cN1IlPe7s", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 892.6666259765625, + "y": 188.16668701171875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0, + "height": 34, + "seed": 1032403459, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "updated": 1639393963541, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 34 + ] + ] + }, + { + "type": "line", + "version": 86, + "versionNonce": 177553406, + "isDeleted": false, + "id": "8SCEaNme89qCxY-xAS0it", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 890, + "y": 199.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 24, + "height": 18.66668701171875, + "seed": 773580109, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "updated": 1639393963541, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -24, + 18.66668701171875 + ] + ] + }, + { + "type": "line", + "version": 110, + "versionNonce": 73221858, + "isDeleted": false, + "id": "Kbl62J0jyfWlbTEVgMqJH", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 895.3333129882812, + "y": 197.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 24, + "height": 18, + "seed": 464452045, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "updated": 1639393963541, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 24, + 18 + ] + ] + }, + { + "type": "line", + "version": 130, + "versionNonce": 1881706558, + "isDeleted": false, + "id": "PRHAdurETJSYCaa5l6Iwa", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 892, + "y": 222.16668701171875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 14.66668701171875, + "height": 25.33331298828125, + "seed": 1595489411, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "updated": 1639393963542, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -14.66668701171875, + 25.33331298828125 + ] + ] + }, + { + "type": "line", + "version": 162, + "versionNonce": 1888885410, + "isDeleted": false, + "id": "HkWBRTjPa-LTKYPbw8XS-", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 894, + "y": 223.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 17.630663207545922, + "height": 23.561635782942176, + "seed": 1412110733, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "updated": 1639393963542, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 17.630663207545922, + 23.561635782942176 + ] + ] + }, + { + "type": "rectangle", + "version": 307, + "versionNonce": 1975983586, + "isDeleted": false, + "id": "2GauISsAXxBxXaARLdO2v", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 277.6666564941406, + "y": 419.99999237060547, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 442, + "height": 132.0000152587891, + "seed": 1008142253, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "updated": 1639394067925 + }, + { + "type": "text", + "version": 375, + "versionNonce": 69970238, + "isDeleted": false, + "id": "4t6IqDCz_2ovUHEWf3VyP", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 287.16668701171875, + "y": 428.4999084472656, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 54, + "height": 25, + "seed": 1136307299, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [ + "uJx77oj5eyZPw61wszaJN" + ], + "updated": 1639394067925, + "fontSize": 20, + "fontFamily": 1, + "text": "Client", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top" + }, + { + "type": "text", + "version": 406, + "versionNonce": 1298876478, + "isDeleted": false, + "id": "i-iOOSRyBhiISzIY5AG2O", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 650, + "y": 135.50001525878906, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 72, + "height": 40, + "seed": 1004543373, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [ + "1Sorez2zxxKqyRilx21-m" + ], + "updated": 1639394028864, + "fontSize": 16, + "fontFamily": 1, + "text": "service1\nbind addr", + "baseline": 34, + "textAlign": "left", + "verticalAlign": "top" + }, + { + "type": "text", + "version": 471, + "versionNonce": 437130622, + "isDeleted": false, + "id": "Lld8m5f8AeGoMRmkfryGK", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 650, + "y": 246.1667022705078, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 72, + "height": 40, + "seed": 1760597182, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [ + "1Sorez2zxxKqyRilx21-m" + ], + "updated": 1639394090709, + "fontSize": 16, + "fontFamily": 1, + "text": "service2\nbind addr", + "baseline": 34, + "textAlign": "left", + "verticalAlign": "top" + }, + { + "type": "text", + "version": 212, + "versionNonce": 1840891362, + "isDeleted": false, + "id": "5io-dv6h3U5ORt9DXFq37", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 308.66668701171875, + "y": 250.83334350585938, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 72, + "height": 40, + "seed": 1771953379, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [ + "wLQ-nby5mNnwfX9LnFrEt" + ], + "updated": 1639393963542, + "fontSize": 16, + "fontFamily": 1, + "text": "server\nbind addr", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top" + }, + { + "type": "arrow", + "version": 228, + "versionNonce": 1728857058, + "isDeleted": false, + "id": "-lU_z4mfDB58ZiJ8HlTxY", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 870.7065228655306, + "y": 194.87651239705974, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 129.96929122242796, + "height": 1.4508687081649327, + "seed": 585847683, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "updated": 1639393963543, + "startBinding": { + "elementId": "5KLQ8EXnY3KjzuLRGbhJU", + "focus": -1.5107931785090518, + "gap": 15.791401051287782 + }, + "endBinding": { + "elementId": "mR2qjxJFdOso9NGgCoq4h", + "focus": 0.3208591338543321, + "gap": 10.737231643102632 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -129.96929122242796, + -1.4508687081649327 + ] + ] + }, + { + "id": "2DQbzxVigt_dM1muvXWYN", + "type": "text", + "x": 872.8333740234375, + "y": 127, + "width": 49, + "height": 20, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1110579390, + "version": 21, + "versionNonce": 974179198, + "isDeleted": false, + "boundElementIds": null, + "updated": 1639393963543, + "text": "visitor", + "fontSize": 16, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "top", + "baseline": 14 + }, + { + "id": "LU4D6A2Ugd1V9uKE6SwOC", + "type": "arrow", + "x": 696.2380319060499, + "y": 189.44727288880773, + "width": 134.59847736695497, + "height": 6.61671213194353, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 275565346, + "version": 351, + "versionNonce": 481916706, + "isDeleted": false, + "boundElementIds": null, + "updated": 1639393963543, + "points": [ + [ + 0, + 0 + ], + [ + -134.59847736695497, + 6.61671213194353 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "mR2qjxJFdOso9NGgCoq4h", + "focus": 0.0597242207313621, + "gap": 9.095342117387645 + }, + "endBinding": { + "elementId": "NzpaVP1cgsvfg6KfdD99G", + "focus": 0.1507396149689704, + "gap": 3.4879322512409843 + }, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "NzpaVP1cgsvfg6KfdD99G", + "type": "diamond", + "x": 372.66668701171875, + "y": 152.5, + "width": 184, + "height": 84, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 891739170, + "version": 42, + "versionNonce": 1136678334, + "isDeleted": false, + "boundElementIds": [ + "LU4D6A2Ugd1V9uKE6SwOC", + "xm8fFB4fOVowURVtFEyfx", + "E-k0fg9CKUsCbBcIFgpQN", + "iqQRk3oncpFlTohh4RxWf", + "S1o9eYMClf4Mrmfw9HlDs", + "nbIlU5kICCXoOhMWP1aoq", + "4mPQElLVeuU0MBB9zyNTL" + ], + "updated": 1639394052440 + }, + { + "id": "6Ym2F9bT0rNpkiLbkm6Ku", + "type": "text", + "x": 414.6666564941406, + "y": 185.50003051757812, + "width": 112, + "height": 20, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 162216574, + "version": 33, + "versionNonce": 199316542, + "isDeleted": false, + "boundElementIds": null, + "updated": 1639393963543, + "text": "rathole server", + "fontSize": 16, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 14 + }, + { + "id": "72LJc8JYfizCW-59n-YiJ", + "type": "diamond", + "x": 313.9999694824219, + "y": 456.83331298828125, + "width": 172.66668701171875, + "height": 74.66668701171876, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 627082402, + "version": 203, + "versionNonce": 1475968062, + "isDeleted": false, + "boundElementIds": [ + "xm8fFB4fOVowURVtFEyfx", + "CYPbqJ97T4dK8aTY2NoA6", + "xQjRQnu2M-Lx4L_FApAWi", + "ZBwjcWgJYIRx-XieGSul2", + "DjwSuFQtjGNkkF4rl7myd", + "8qillKpd5VKO0hrasQMVX" + ], + "updated": 1639394068076 + }, + { + "id": "mR2qjxJFdOso9NGgCoq4h", + "type": "rectangle", + "x": 705.3333740234375, + "y": 176.83335876464844, + "width": 24.6666259765625, + "height": 24.6666259765625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1143103778, + "version": 45, + "versionNonce": 1343517282, + "isDeleted": false, + "boundElementIds": [ + "-lU_z4mfDB58ZiJ8HlTxY", + "LU4D6A2Ugd1V9uKE6SwOC" + ], + "updated": 1639393963543 + }, + { + "id": "rp7H2PQFGWvQJIbz1y8IG", + "type": "rectangle", + "x": 705.3333740234375, + "y": 220.83335876464844, + "width": 24.6666259765625, + "height": 24.6666259765625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 764034658, + "version": 77, + "versionNonce": 1528280446, + "isDeleted": false, + "boundElementIds": [ + "-lU_z4mfDB58ZiJ8HlTxY", + "LU4D6A2Ugd1V9uKE6SwOC", + "n9WWKSJRRhkFG2L3AY6W_", + "4mPQElLVeuU0MBB9zyNTL" + ], + "updated": 1639394052440 + }, + { + "id": "5H4DUHb4ELZWIIpXO32ix", + "type": "rectangle", + "x": 385.3333740234375, + "y": 284.16668701171875, + "width": 22, + "height": 22, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1387104638, + "version": 257, + "versionNonce": 947580094, + "isDeleted": false, + "boundElementIds": [ + "uJx77oj5eyZPw61wszaJN", + "CYPbqJ97T4dK8aTY2NoA6", + "E-k0fg9CKUsCbBcIFgpQN", + "iqQRk3oncpFlTohh4RxWf", + "xQjRQnu2M-Lx4L_FApAWi", + "ZBwjcWgJYIRx-XieGSul2", + "S1o9eYMClf4Mrmfw9HlDs", + "nbIlU5kICCXoOhMWP1aoq" + ], + "updated": 1639393977422 + }, + { + "id": "1-O9JOrs2pnONGNtZiH4B", + "type": "text", + "x": 349.1666564941406, + "y": 482.8332824707031, + "width": 105, + "height": 20, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1412742590, + "version": 106, + "versionNonce": 541336190, + "isDeleted": false, + "boundElementIds": null, + "updated": 1639394067926, + "text": "rathole client", + "fontSize": 16, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 14 + }, + { + "id": "CYPbqJ97T4dK8aTY2NoA6", + "type": "arrow", + "x": 400.5230856224749, + "y": 452.05962166754307, + "width": 3.021429201284718, + "height": 139.89293465582432, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 941766434, + "version": 627, + "versionNonce": 840863074, + "isDeleted": false, + "boundElementIds": null, + "updated": 1639394067926, + "points": [ + [ + 0, + 0 + ], + [ + -3.021429201284718, + -139.89293465582432 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "72LJc8JYfizCW-59n-YiJ", + "focus": 0.012722437706498701, + "gap": 4.777461928511805 + }, + "endBinding": { + "elementId": "5H4DUHb4ELZWIIpXO32ix", + "focus": -0.07128881792747094, + "gap": 6 + }, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "iqQRk3oncpFlTohh4RxWf", + "type": "arrow", + "x": 411.88175007980965, + "y": 278.4142786269854, + "width": 41.1875896678809, + "height": 38.07827569869187, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 316085374, + "version": 241, + "versionNonce": 705621374, + "isDeleted": false, + "boundElementIds": null, + "updated": 1639393963544, + "points": [ + [ + 0, + 0 + ], + [ + 41.1875896678809, + -38.07827569869187 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "5H4DUHb4ELZWIIpXO32ix", + "focus": -0.111311585930796, + "gap": 7.333343505859375 + }, + "endBinding": { + "elementId": "NzpaVP1cgsvfg6KfdD99G", + "focus": -0.4128416678755755, + "gap": 8.3058554409374 + }, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "xQjRQnu2M-Lx4L_FApAWi", + "type": "arrow", + "x": 415.03538422542744, + "y": 453.3711527236708, + "width": 10.189618736042235, + "height": 139.87115272367078, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 419928446, + "version": 136, + "versionNonce": 325751074, + "isDeleted": false, + "boundElementIds": null, + "updated": 1639394067926, + "points": [ + [ + 0, + 0 + ], + [ + -10.189618736042235, + -139.87115272367078 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "72LJc8JYfizCW-59n-YiJ", + "focus": 0.20468988783315253, + "gap": 9.013184853545113 + }, + "endBinding": { + "elementId": "5H4DUHb4ELZWIIpXO32ix", + "focus": -0.6081345501761519, + "gap": 7.33331298828125 + }, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "ZBwjcWgJYIRx-XieGSul2", + "type": "arrow", + "x": 381.63001651123903, + "y": 456.0383959625252, + "width": 2.158517689316966, + "height": 145.46817028787365, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 39236898, + "version": 133, + "versionNonce": 1006640354, + "isDeleted": false, + "boundElementIds": null, + "updated": 1639394067926, + "points": [ + [ + 0, + 0 + ], + [ + 2.158517689316966, + -145.46817028787365 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "72LJc8JYfizCW-59n-YiJ", + "focus": -0.22319845234228697, + "gap": 8.153168060821436 + }, + "endBinding": { + "elementId": "5H4DUHb4ELZWIIpXO32ix", + "focus": 1.1032903390278315, + "gap": 4.666656494140625 + }, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "S1o9eYMClf4Mrmfw9HlDs", + "type": "arrow", + "x": 418.66668701171875, + "y": 287.5, + "width": 38.666656494140625, + "height": 43.33331298828125, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 247933282, + "version": 30, + "versionNonce": 1800972706, + "isDeleted": false, + "boundElementIds": null, + "updated": 1639393973403, + "points": [ + [ + 0, + 0 + ], + [ + 38.666656494140625, + -43.33331298828125 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "5H4DUHb4ELZWIIpXO32ix", + "focus": 0.7442699983400397, + "gap": 11.33331298828125 + }, + "endBinding": { + "elementId": "NzpaVP1cgsvfg6KfdD99G", + "focus": -0.4020068751542848, + "gap": 10.019774658829391 + }, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "nbIlU5kICCXoOhMWP1aoq", + "type": "arrow", + "x": 403.3333435058594, + "y": 273.5, + "width": 44, + "height": 37.33331298828125, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 261563746, + "version": 26, + "versionNonce": 1384498722, + "isDeleted": false, + "boundElementIds": null, + "updated": 1639393977422, + "points": [ + [ + 0, + 0 + ], + [ + 44, + -37.33331298828125 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "5H4DUHb4ELZWIIpXO32ix", + "focus": -0.7734750559093652, + "gap": 10.66668701171875 + }, + "endBinding": { + "elementId": "NzpaVP1cgsvfg6KfdD99G", + "focus": -0.6418956116222861, + "gap": 6.895194123821575 + }, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "7N39v3qK0fltyhClnuI_Q", + "type": "ellipse", + "x": 582.0000305175781, + "y": 444.16668701171875, + "width": 112.6666259765625, + "height": 47.33331298828125, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1272534334, + "version": 116, + "versionNonce": 1964223486, + "isDeleted": false, + "boundElementIds": [ + "DjwSuFQtjGNkkF4rl7myd" + ], + "updated": 1639394068076 + }, + { + "id": "THrrqy4Axfy1vlF2wrI9s", + "type": "ellipse", + "x": 582.0000305175781, + "y": 498.8333740234375, + "width": 112.6666259765625, + "height": 47.33331298828125, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 614595234, + "version": 142, + "versionNonce": 909853822, + "isDeleted": false, + "boundElementIds": [ + "8qillKpd5VKO0hrasQMVX" + ], + "updated": 1639394068076 + }, + { + "id": "WyAj01yc3DnhvWQG7tHd9", + "type": "text", + "x": 605.8333435058594, + "y": 457.8333435058594, + "width": 65, + "height": 20, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 2040747710, + "version": 45, + "versionNonce": 172071906, + "isDeleted": false, + "boundElementIds": null, + "updated": 1639394067926, + "text": "service 1", + "fontSize": 16, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 14 + }, + { + "id": "CDfW7H0EVISeS0Zugsf8W", + "type": "text", + "x": 600.9999694824219, + "y": 512.5000305175781, + "width": 72, + "height": 20, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1292334754, + "version": 74, + "versionNonce": 1763707710, + "isDeleted": false, + "boundElementIds": null, + "updated": 1639394067926, + "text": "service 2", + "fontSize": 16, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 14 + }, + { + "id": "DjwSuFQtjGNkkF4rl7myd", + "type": "arrow", + "x": 493.3333435058594, + "y": 489.0001220703125, + "width": 80.49465291276579, + "height": 19.591364584118082, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1489129058, + "version": 177, + "versionNonce": 1120784162, + "isDeleted": false, + "boundElementIds": null, + "updated": 1639394068076, + "points": [ + [ + 0, + 0 + ], + [ + 80.49465291276579, + -19.591364584118082 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "72LJc8JYfizCW-59n-YiJ", + "focus": 0.46790554502387516, + "gap": 7.388222614736868 + }, + "endBinding": { + "elementId": "7N39v3qK0fltyhClnuI_Q", + "focus": 0.5164042977199623, + "gap": 8.24035262874532 + }, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "8qillKpd5VKO0hrasQMVX", + "type": "arrow", + "x": 497.3333435058594, + "y": 496.33331298828125, + "width": 78, + "height": 22, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1551722530, + "version": 144, + "versionNonce": 1536814754, + "isDeleted": false, + "boundElementIds": null, + "updated": 1639394068076, + "points": [ + [ + 0, + 0 + ], + [ + 78, + 22 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "72LJc8JYfizCW-59n-YiJ", + "focus": -0.6747942752141096, + "gap": 6.222408426625634 + }, + "endBinding": { + "elementId": "THrrqy4Axfy1vlF2wrI9s", + "focus": -0.4771879886646304, + "gap": 7.177668745668626 + }, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "n9WWKSJRRhkFG2L3AY6W_", + "type": "arrow", + "x": 876.3054169557988, + "y": 206.15009644516743, + "width": 139.63872994408007, + "height": 28.349903554832565, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1631704318, + "version": 50, + "versionNonce": 1307848610, + "isDeleted": false, + "boundElementIds": null, + "updated": 1639394048593, + "points": [ + [ + 0, + 0 + ], + [ + -139.63872994408007, + 28.349903554832565 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "rp7H2PQFGWvQJIbz1y8IG", + "focus": 0.3498468485388594, + "gap": 6.66668701171875 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "4mPQElLVeuU0MBB9zyNTL", + "type": "arrow", + "x": 696.6666870117188, + "y": 231.83334350585938, + "width": 140.66668701171875, + "height": 30.666656494140625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1042183102, + "version": 16, + "versionNonce": 392654114, + "isDeleted": false, + "boundElementIds": null, + "updated": 1639394053746, + "points": [ + [ + 0, + 0 + ], + [ + -140.66668701171875, + -30.666656494140625 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "rp7H2PQFGWvQJIbz1y8IG", + "focus": -0.21600645731035134, + "gap": 8.66668701171875 + }, + "endBinding": { + "elementId": "NzpaVP1cgsvfg6KfdD99G", + "focus": -0.31535312984667163, + "gap": 5.787735184532465 + }, + "startArrowhead": null, + "endArrowhead": null + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/doc/img/overview.png b/doc/img/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..779361da314e00aaabf2f9e3e02fa9021ca103df GIT binary patch literal 155129 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

S8USfpyRC{_J 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 Pc)Ap1RHe%$Uj+US1fI%4 literal 0 HcmV?d00001 diff --git a/doc/img/tcp_bitrate.svg b/doc/img/tcp_bitrate.svg new file mode 100644 index 00000000..6a3065ae --- /dev/null +++ b/doc/img/tcp_bitrate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/doc/img/tcp_latency.svg b/doc/img/tcp_latency.svg new file mode 100644 index 00000000..172e802f --- /dev/null +++ b/doc/img/tcp_latency.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/doc/internals.md b/doc/internals.md new file mode 100644 index 00000000..b0ede5a3 --- /dev/null +++ b/doc/internals.md @@ -0,0 +1,34 @@ +# Internals + +![overview](./img/overview.png) + +## Conceptions +### Service +The entity whose traffic needs to be forwarded + +### Server +The host that runs `rathole` in the server mode + +### Client +The host behind the NAT that runs `rathole` in the client mode. It has some services that need to be forwarded. + +### Visitor +Who visists a *service*, via the *server* + +### Control Channel +A control channel is a TCP connection between the *server* and the *client* that only carries `rathole` control commands for one *service*. + +### Data Channel + +A data channel is a TCP connection between the *server* and the *client* that only carries the encapsulated data that needs forwarding for one *service*. + +## The Process + +*TODO: Add more details about the protocol* + +When `rathole` starts in the client mode, it creates connections to `server.common.bind_addr` for each service. These connection acts as control channels. + +When a control channel starts, the server challenge the client by a nonce, the client is required to authenticate as the service it wants to represent. Then the forwarding of that service is set up. + +When the server accepts a connection on a service's `bind_port`, it sends a control command to the client via the corresponding contorl channel. Then the client connects to the server to create a data channel. In this way, a forwarding is set up. The server also creates a few data channels in advance to improve the latency. + diff --git a/doc/out-of-scope.md b/doc/out-of-scope.md new file mode 100644 index 00000000..4e699c7d --- /dev/null +++ b/doc/out-of-scope.md @@ -0,0 +1,9 @@ +# Out of Scope + +- *domain based forwarding for HTTP* + + Use nginx to do this. + +- *frp's STCP* + + You may want to consider secure tunnels like wireguard or zerotier. diff --git a/example/minimal/client.toml b/example/minimal/client.toml new file mode 100644 index 00000000..bb5f6b8c --- /dev/null +++ b/example/minimal/client.toml @@ -0,0 +1,6 @@ +[client] +remote_addr = "localhost:2333" +default_token = "123" + +[client.services.foo1] +local_addr = "127.0.0.1:80" diff --git a/example/minimal/server.toml b/example/minimal/server.toml new file mode 100644 index 00000000..1eec0331 --- /dev/null +++ b/example/minimal/server.toml @@ -0,0 +1,7 @@ +[server] +bind_addr = "0.0.0.0:2333" +default_token = "123" + +[server.services.foo1] +bind_addr = "0.0.0.0:5202" + diff --git a/src/cli.rs b/src/cli.rs new file mode 100644 index 00000000..13a218e1 --- /dev/null +++ b/src/cli.rs @@ -0,0 +1,20 @@ +use clap::{AppSettings, Parser}; + +#[derive(Parser, Debug)] +#[clap(about, version, setting(AppSettings::DeriveDisplayOrder))] +pub struct Cli { + /// The path to the configuration file + /// + /// Running as a client or a server is automatically determined + /// according to the configuration file. + #[clap(parse(from_os_str), name = "config")] + pub config_path: std::path::PathBuf, + + /// Run as a server + #[clap(long, short)] + pub server: bool, + + /// Run as a client + #[clap(long, short)] + pub client: bool, +} diff --git a/src/client.rs b/src/client.rs new file mode 100644 index 00000000..fbcc56c2 --- /dev/null +++ b/src/client.rs @@ -0,0 +1,242 @@ +use std::collections::HashMap; +use std::sync::Arc; + +use crate::config::{ClientConfig, ClientServiceConfig, Config}; +use crate::protocol::{ + self, read_hello, DataChannelCmd, + Hello::{self, *}, + CURRENT_PROTO_VRESION, HASH_WIDTH_IN_BYTES, +}; +use crate::protocol::{read_data_cmd, Ack, Auth, ControlChannelCmd}; +use anyhow::{anyhow, bail, Context, Result}; +use backoff::ExponentialBackoff; +use tokio::io; +use tokio::sync::oneshot; +use tokio::time::{self, Duration}; +use tokio::{self, io::AsyncWriteExt, net::TcpStream}; +use tracing::{debug, error, info, instrument, Instrument, Span}; + +pub async fn run_client(config: &Config) -> Result<()> { + let mut client = Client::from(config)?; + client.run().await +} + +type ServiceDigest = protocol::Digest; +type Nonce = protocol::Digest; + +struct Client<'a> { + config: &'a ClientConfig, + service_handles: HashMap, +} + +impl<'a> Client<'a> { + fn from(config: &'a Config) -> Result { + if let Some(config) = &config.client { + Ok(Client { + config, + service_handles: HashMap::new(), + }) + } else { + Err(anyhow!("Try to run as a client, but the configuration is missing. Please add the `[client]` block")) + } + } + + async fn run(&mut self) -> Result<()> { + for (name, config) in &self.config.services { + let handle = + ControlChannelHandle::new((*config).clone(), self.config.remote_addr.clone()); + self.service_handles.insert(name.clone(), handle); + } + + loop { + tokio::select! { + val = tokio::signal::ctrl_c() => { + match val { + Ok(()) => {} + Err(err) => { + error!("Unable to listen for shutdown signal: {}", err); + } + } + break; + }, + } + } + + // Shutdown all services + for (_, handle) in self.service_handles.drain() { + handle.shutdown(); + } + + Ok(()) + } +} + +struct RunDataChannelArgs { + session_key: Nonce, + remote_addr: String, + local_addr: String, +} + +async fn run_data_channel(args: Arc) -> Result<()> { + // Retry at least every 100ms, at most for 10 seconds + let backoff = ExponentialBackoff { + max_interval: Duration::from_millis(100), + max_elapsed_time: Some(Duration::from_secs(10)), + ..Default::default() + }; + + // Connect to remote_addr + let mut conn = backoff::future::retry(backoff, || async { + Ok(TcpStream::connect(&args.remote_addr) + .await + .with_context(|| "Failed to connect to remote_addr")?) + }) + .await?; + + // Send nonce + let v: &[u8; HASH_WIDTH_IN_BYTES] = args.session_key[..].try_into().unwrap(); + let hello = Hello::DataChannelHello(CURRENT_PROTO_VRESION, v.to_owned()); + conn.write_all(&bincode::serialize(&hello).unwrap()).await?; + + // Forward + match read_data_cmd(&mut conn).await? { + DataChannelCmd::StartForward => { + let mut local = TcpStream::connect(&args.local_addr) + .await + .with_context(|| "Failed to conenct to local_addr")?; + let _ = io::copy_bidirectional(&mut conn, &mut local).await; + } + } + Ok(()) +} + +struct ControlChannel { + digest: ServiceDigest, + service: ClientServiceConfig, + shutdown_rx: oneshot::Receiver, + remote_addr: String, +} + +struct ControlChannelHandle { + shutdown_tx: oneshot::Sender, +} + +impl ControlChannel { + #[instrument(skip(self), fields(service=%self.service.name))] + async fn run(&mut self) -> Result<()> { + let mut conn = TcpStream::connect(&self.remote_addr) + .await + .with_context(|| format!("Failed to connect to the server: {}", &self.remote_addr))?; + + // Send hello + let hello_send = + Hello::ControlChannelHello(CURRENT_PROTO_VRESION, self.digest[..].try_into().unwrap()); + conn.write_all(&bincode::serialize(&hello_send).unwrap()) + .await?; + + // Read hello + let nonce = match read_hello(&mut conn) + .await + .with_context(|| "Failed to read hello from the server")? + { + ControlChannelHello(_, d) => d, + _ => { + bail!("Unexpected type of hello"); + } + }; + + // Send auth + let mut concat = Vec::from(self.service.token.as_ref().unwrap().as_bytes()); + concat.extend_from_slice(&nonce); + + let session_key = protocol::digest(&concat); + let auth = Auth(session_key); + conn.write_all(&bincode::serialize(&auth).unwrap()).await?; + + // Read ack + match protocol::read_ack(&mut conn).await? { + Ack::Ok => {} + v => { + return Err(anyhow!("{}", v)) + .with_context(|| format!("Authentication failed: {}", self.service.name)); + } + } + + // Channel ready + info!("Control channel established"); + + let remote_addr = self.remote_addr.clone(); + let local_addr = self.service.local_addr.clone(); + let data_ch_args = Arc::new(RunDataChannelArgs { + session_key, + remote_addr, + local_addr, + }); + + loop { + tokio::select! { + val = protocol::read_control_cmd(&mut conn) => { + let val = val?; + debug!( "Received {:?}", val); + match val { + ControlChannelCmd::CreateDataChannel => { + let args = data_ch_args.clone(); + tokio::spawn(async move { + if let Err(e) = run_data_channel(args).await.with_context(|| "Failed to run the data channel") { + error!("{:?}", e); + } + }.instrument(Span::current())); + } + } + }, + _ = &mut self.shutdown_rx => { + info!( "Shutting down gracefully..."); + break; + } + } + } + + Ok(()) + } +} + +impl ControlChannelHandle { + #[instrument(skip_all, fields(service = %service.name))] + fn new(service: ClientServiceConfig, remote_addr: String) -> ControlChannelHandle { + let digest = protocol::digest(service.name.as_bytes()); + let (shutdown_tx, shutdown_rx) = oneshot::channel(); + let mut s = ControlChannel { + digest, + service, + shutdown_rx, + remote_addr, + }; + + tokio::spawn( + async move { + loop { + if let Err(err) = s + .run() + .await + .with_context(|| "Failed to run the control channel") + { + let duration = Duration::from_secs(2); + error!("{:?}\n\nRetry in {:?}...", err, duration); + time::sleep(duration).await; + } else { + // Shutdown + break; + } + } + } + .instrument(Span::current()), + ); + + ControlChannelHandle { shutdown_tx } + } + + fn shutdown(self) { + // A send failure shows that the actor has already shutdown. + let _ = self.shutdown_tx.send(0u8); + } +} diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 00000000..20e3f654 --- /dev/null +++ b/src/config.rs @@ -0,0 +1,124 @@ +use anyhow::{anyhow, bail, Context, Result}; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::path::PathBuf; +use tokio::fs; +use toml; + +#[derive(Debug, Serialize, Deserialize, Copy, Clone)] +pub enum Encryption { + #[serde(rename = "none")] + None, + #[serde(rename = "aes")] + Aes, +} + +fn default_encryption() -> Encryption { + Encryption::None +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct ClientServiceConfig { + #[serde(skip)] + pub name: String, + pub local_addr: String, + pub token: Option, + #[serde(default = "default_encryption")] + pub encryption: Encryption, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct ServerServiceConfig { + #[serde(skip)] + pub name: String, + pub bind_addr: String, + pub token: Option, + #[serde(default = "default_encryption")] + pub encryption: Encryption, +} + +#[derive(Debug, Serialize, Deserialize, Default)] +pub struct ClientConfig { + pub remote_addr: String, + pub default_token: Option, + pub services: HashMap, +} + +#[derive(Debug, Serialize, Deserialize, Default)] +pub struct ServerConfig { + pub bind_addr: String, + pub default_token: Option, + pub services: HashMap, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct Config { + pub server: Option, + pub client: Option, +} + +impl Config { + fn from_str(s: &str) -> Result { + let mut config: Config = + toml::from_str(&s).with_context(|| "Failed to parse the config")?; + if let Some(server) = config.server.as_mut() { + for (name, s) in &mut server.services { + s.name = name.clone(); + if s.token.is_none() { + s.token = server.default_token.clone(); + if s.token.is_none() { + bail!("The token of service {} is not set", name); + } + } + } + } + if let Some(client) = config.client.as_mut() { + for (name, s) in &mut client.services { + s.name = name.clone(); + if s.token.is_none() { + s.token = client.default_token.clone(); + if s.token.is_none() { + bail!("The token of service {} is not set", name); + } + } + } + } + if config.server.is_none() && config.client.is_none() { + Err(anyhow!("Neither of `[server]` or `[client]` is defined")) + } else { + Ok(config) + } + } + + pub async fn from_file(path: &PathBuf) -> Result { + let s: String = fs::read_to_string(path) + .await + .with_context(|| format!("Failed to read the config {:?}", path))?; + Config::from_str(&s).with_context(|| { + "Configuration is invalid. Please refer to the configuration specification." + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::fs; + + use anyhow::Result; + + #[test] + fn test_mimic_client_config() -> Result<()> { + let s = fs::read_to_string("./example/mimic/client.toml").unwrap(); + Config::from_str(&s)?; + Ok(()) + } + + #[test] + fn test_mimic_server_config() -> Result<()> { + let s = fs::read_to_string("./example/mimic/server.toml").unwrap(); + Config::from_str(&s)?; + Ok(()) + } +} diff --git a/src/helper.rs b/src/helper.rs new file mode 100644 index 00000000..ddca7ad7 --- /dev/null +++ b/src/helper.rs @@ -0,0 +1,15 @@ +use std::time::Duration; + +use anyhow::{Context, Result}; +use socket2::{SockRef, TcpKeepalive}; +use tokio::net::TcpStream; + +// Tokio hesitates to expose this option...So we have to do it on our own :( +// The good news is that using socket2 it can be easily done, without losing portablity. +// See https://github.com/tokio-rs/tokio/issues/3082 +pub fn set_tcp_keepalive(conn: &TcpStream) -> Result<()> { + let s = SockRef::from(conn); + let keepalive = TcpKeepalive::new().with_time(Duration::from_secs(60)); + s.set_tcp_keepalive(&keepalive) + .with_context(|| "Failed to set keepalive") +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 00000000..01889b92 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,153 @@ +mod cli; +mod client; +mod config; +mod helper; +mod multi_map; +mod protocol; +mod server; + +pub use cli::Cli; +pub use config::Config; + +use anyhow::{anyhow, Result}; +use tracing::debug; + +use client::run_client; +use server::run_server; + +pub async fn run(args: &Cli) -> Result<()> { + let config = Config::from_file(&args.config_path).await?; + + tracing_subscriber::fmt::init(); + + debug!("{:?}", config); + + // Raise `nofile` limit on linux and mac + fdlimit::raise_fd_limit(); + + match determine_run_mode(&config, &args) { + RunMode::Undetermine => Err(anyhow!("Cannot determine running as a server or a client")), + RunMode::Client => run_client(&config).await, + RunMode::Server => run_server(&config).await, + } +} + +#[derive(PartialEq, Eq, Debug)] +enum RunMode { + Server, + Client, + Undetermine, +} + +fn determine_run_mode(config: &Config, args: &Cli) -> RunMode { + use RunMode::*; + if args.client && args.server { + Undetermine + } else { + if args.client { + Client + } else if args.server { + Server + } else { + if config.server.is_some() && config.client.is_none() { + Server + } else if config.client.is_some() && config.server.is_none() { + Client + } else { + Undetermine + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_determine_run_mode() { + use config::*; + use RunMode::*; + + struct T { + cfg_s: bool, + cfg_c: bool, + arg_s: bool, + arg_c: bool, + run_mode: RunMode, + } + + let tests = [ + T { + cfg_s: false, + cfg_c: false, + arg_s: false, + arg_c: false, + run_mode: Undetermine, + }, + T { + cfg_s: true, + cfg_c: false, + arg_s: false, + arg_c: false, + run_mode: Server, + }, + T { + cfg_s: false, + cfg_c: true, + arg_s: false, + arg_c: false, + run_mode: Client, + }, + T { + cfg_s: true, + cfg_c: true, + arg_s: false, + arg_c: false, + run_mode: Undetermine, + }, + T { + cfg_s: true, + cfg_c: true, + arg_s: true, + arg_c: false, + run_mode: Server, + }, + T { + cfg_s: true, + cfg_c: true, + arg_s: false, + arg_c: true, + run_mode: Client, + }, + T { + cfg_s: true, + cfg_c: true, + arg_s: true, + arg_c: true, + run_mode: Undetermine, + }, + ]; + + for t in tests { + let config = Config { + server: match t.cfg_s { + true => Some(ServerConfig::default()), + false => None, + }, + client: match t.cfg_c { + true => Some(ClientConfig::default()), + false => None, + }, + }; + + let args = Cli { + config_path: std::path::PathBuf::new(), + server: t.arg_s, + client: t.arg_c, + }; + + assert_eq!(determine_run_mode(&config, &args), t.run_mode); + } + } +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 00000000..3a47d30d --- /dev/null +++ b/src/main.rs @@ -0,0 +1,10 @@ +use anyhow::Result; +use clap::Parser; +use rathole::{run, Cli}; +use tokio; + +#[tokio::main] +async fn main() -> Result<()> { + let args = Cli::parse(); + run(&args).await +} diff --git a/src/multi_map.rs b/src/multi_map.rs new file mode 100644 index 00000000..81af8224 --- /dev/null +++ b/src/multi_map.rs @@ -0,0 +1,114 @@ +use std::borrow::Borrow; +use std::collections::HashMap; +use std::hash::{Hash, Hasher}; + +struct RawItem(*mut (K1, K2, V)); +unsafe impl Send for RawItem {} +unsafe impl Sync for RawItem {} + +pub struct MultiMap { + map1: HashMap, RawItem>, + map2: HashMap, RawItem>, +} + +struct Key(*const T); + +unsafe impl Send for Key {} +unsafe impl Sync for Key {} + +impl Borrow for Key { + fn borrow(&self) -> &T { + unsafe { &*self.0 } + } +} + +impl Hash for Key { + fn hash(&self, state: &mut H) { + (self.borrow() as &T).hash(state) + } +} + +impl PartialEq for Key { + fn eq(&self, other: &Self) -> bool { + (self.borrow() as &T).eq(other.borrow()) + } +} + +impl Eq for Key {} + +impl MultiMap { + pub fn new() -> Self { + MultiMap { + map1: HashMap::new(), + map2: HashMap::new(), + } + } +} + +#[allow(dead_code)] +impl MultiMap +where + K1: Hash + Eq + Send, + K2: Hash + Eq + Send, + V: Send, +{ + pub fn insert(&mut self, k1: K1, k2: K2, v: V) -> Result<(), (K1, K2, V)> { + if self.map1.contains_key(&k1) || self.map2.contains_key(&k2) { + return Err((k1, k2, v)); + } + let item = Box::new((k1, k2, v)); + let k1 = Key(&item.0); + let k2 = Key(&item.1); + let item = Box::into_raw(item); + self.map1.insert(k1, RawItem(item)); + self.map2.insert(k2, RawItem(item)); + Ok(()) + } + + pub fn get1(&self, k1: &K1) -> Option<&V> { + let item = self.map1.get(k1)?; + let item = unsafe { &*item.0 }; + Some(&item.2) + } + + pub fn get1_mut(&mut self, k1: &K1) -> Option<&mut V> { + let item = self.map1.get(k1)?; + let item = unsafe { &mut *item.0 }; + Some(&mut item.2) + } + + pub fn get2(&self, k2: &K2) -> Option<&V> { + let item = self.map2.get(k2)?; + let item = unsafe { &*item.0 }; + Some(&item.2) + } + + pub fn get_mut2(&mut self, k2: &K2) -> Option<&mut V> { + let item = self.map2.get(k2)?; + let item = unsafe { &mut *item.0 }; + Some(&mut item.2) + } + + pub fn remove1(&mut self, k1: &K1) -> Option { + let item = self.map1.remove(k1)?; + let item = unsafe { Box::from_raw(item.0) }; + self.map2.remove(&item.1); + Some(item.2) + } + + pub fn remove2(&mut self, k2: &K2) -> Option { + let item = self.map2.remove(k2)?; + let item = unsafe { Box::from_raw(item.0) }; + self.map1.remove(&item.0); + Some(item.2) + } +} + +impl Drop for MultiMap { + fn drop(&mut self) { + self.map1.clear(); + self.map2 + .drain() + .for_each(|(_, item)| drop(unsafe { Box::from_raw(item.0) })); + } +} diff --git a/src/protocol.rs b/src/protocol.rs new file mode 100644 index 00000000..a8801fa0 --- /dev/null +++ b/src/protocol.rs @@ -0,0 +1,137 @@ +pub const HASH_WIDTH_IN_BYTES: usize = 32; +use anyhow::{Context, Result}; +use bincode; + +use lazy_static::lazy_static; + +use serde::{Deserialize, Serialize}; +use tokio::io::AsyncReadExt; +use tokio::net::TcpStream; + +type ProtocolVersion = u8; +const PROTO_V0: u8 = 0u8; + +pub const CURRENT_PROTO_VRESION: ProtocolVersion = PROTO_V0; + +pub type Digest = [u8; HASH_WIDTH_IN_BYTES]; + +#[derive(Deserialize, Serialize, Debug)] +pub enum Hello { + ControlChannelHello(ProtocolVersion, Digest), // sha256sum(service name) or a nonce + DataChannelHello(ProtocolVersion, Digest), // token provided by CreateDataChannel +} + +#[derive(Deserialize, Serialize, Debug)] +pub struct Auth(pub Digest); + +#[derive(Deserialize, Serialize, Debug)] +pub enum Ack { + Ok, + ServiceNotExist, + AuthFailed, +} + +impl std::fmt::Display for Ack { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{}", + match self { + Ack::Ok => "Ok", + Ack::ServiceNotExist => "Service not exist", + Ack::AuthFailed => "Incorrect token", + } + ) + } +} + +#[derive(Deserialize, Serialize, Debug)] +pub enum ControlChannelCmd { + CreateDataChannel, +} + +#[derive(Deserialize, Serialize, Debug)] +pub enum DataChannelCmd { + StartForward, +} + +pub fn digest(data: &[u8]) -> Digest { + let d = ring::digest::digest(&ring::digest::SHA256, data); + d.as_ref().try_into().unwrap() +} + +struct PacketLength { + hello: usize, + ack: usize, + auth: usize, + c_cmd: usize, + d_cmd: usize, +} + +impl PacketLength { + pub fn new() -> PacketLength { + let username = "default"; + let d = digest(username.as_bytes()); + let hello = bincode::serialized_size(&Hello::ControlChannelHello(CURRENT_PROTO_VRESION, d)) + .unwrap() as usize; + let c_cmd = + bincode::serialized_size(&ControlChannelCmd::CreateDataChannel).unwrap() as usize; + let d_cmd = bincode::serialized_size(&DataChannelCmd::StartForward).unwrap() as usize; + let ack = Ack::Ok; + let ack = bincode::serialized_size(&ack).unwrap() as usize; + + let auth = bincode::serialized_size(&Auth(d)).unwrap() as usize; + PacketLength { + hello, + ack, + auth, + c_cmd, + d_cmd, + } + } +} + +lazy_static! { + static ref PACKET_LEN: PacketLength = PacketLength::new(); +} + +pub async fn read_hello(conn: &mut TcpStream) -> Result { + let mut buf = vec![0u8; PACKET_LEN.hello]; + conn.read_exact(&mut buf) + .await + .with_context(|| "Failed to read hello")?; + let hello = bincode::deserialize(&buf).with_context(|| "Failed to deserialize hello")?; + Ok(hello) +} + +pub async fn read_auth(conn: &mut TcpStream) -> Result { + let mut buf = vec![0u8; PACKET_LEN.auth]; + conn.read_exact(&mut buf) + .await + .with_context(|| "Failed to read auth")?; + bincode::deserialize(&buf).with_context(|| "Failed to deserialize auth") +} + +pub async fn read_ack(conn: &mut TcpStream) -> Result { + let mut bytes = vec![0u8; PACKET_LEN.ack]; + conn.read_exact(&mut bytes) + .await + .with_context(|| "Failed to read ack")?; + bincode::deserialize(&bytes).with_context(|| "Failed to deserialize ack") +} + +pub async fn read_control_cmd(conn: &mut TcpStream) -> Result { + let mut bytes = vec![0u8; PACKET_LEN.c_cmd]; + conn.read_exact(&mut bytes) + .await + .with_context(|| "Failed to read control cmd")?; + bincode::deserialize(&bytes).with_context(|| "Failed to deserialize control cmd") +} + +pub async fn read_data_cmd(conn: &mut TcpStream) -> Result { + let mut bytes = vec![0u8; PACKET_LEN.d_cmd]; + conn.read_exact(&mut bytes) + .await + .with_context(|| "Failed to read data cmd")?; + bincode::deserialize(&bytes).with_context(|| "Failed to deserialize data cmd") +} diff --git a/src/server.rs b/src/server.rs new file mode 100644 index 00000000..68abed67 --- /dev/null +++ b/src/server.rs @@ -0,0 +1,389 @@ +use std::collections::HashMap; +use std::net::SocketAddr; +use std::sync::Arc; +use std::time::Duration; + +use crate::config::{Config, ServerConfig, ServerServiceConfig}; +use crate::helper::set_tcp_keepalive; +use crate::multi_map::MultiMap; +use crate::protocol::{ + self, read_hello, Hello, Hello::ControlChannelHello, Hello::DataChannelHello, +}; +use crate::protocol::{read_auth, Ack, ControlChannelCmd, DataChannelCmd, HASH_WIDTH_IN_BYTES}; +use anyhow::{anyhow, bail, Context, Result}; +use rand::RngCore; +use tokio::io::{self, AsyncWriteExt}; +use tokio::sync::mpsc; +use tokio::sync::{oneshot, RwLock}; +use tokio::time; +use tokio::{ + self, + net::{self, TcpListener, TcpStream}, +}; +use tracing::{debug, error, info, info_span, warn, Instrument}; + +use backoff::{backoff::Backoff, ExponentialBackoff}; + +type ServiceDigest = protocol::Digest; +type Nonce = protocol::Digest; + +const POOL_SIZE: usize = 64; +const CHAN_SIZE: usize = 2048; + +pub async fn run_server(config: &Config) -> Result<()> { + let mut server = Server::from(config)?; + + server.run().await +} + +type ControlChannelMap = MultiMap; +struct Server<'a> { + config: &'a ServerConfig, + services: Arc>>, + control_channels: Arc>, +} + +impl<'a> Server<'a> { + pub fn from(config: &'a Config) -> Result { + match &config.server { + Some(config) => Ok(Server { + config, + services: Arc::new(RwLock::new(Server::generate_service_hashmap(config))), + control_channels: Arc::new(RwLock::new(ControlChannelMap::new())), + }), + None => + Err(anyhow!("Try to run as a server, but the configuration is missing. Please add the `[server]` block")) + } + } + + fn generate_service_hashmap( + server_config: &ServerConfig, + ) -> HashMap { + let mut ret = HashMap::new(); + for u in &server_config.services { + ret.insert(protocol::digest(u.0.as_bytes()), (*u.1).clone()); + } + ret + } + + pub async fn run(&mut self) -> Result<()> { + let l = net::TcpListener::bind(&self.config.bind_addr) + .await + .with_context(|| "Failed to listen at `server.bind_addr`")?; + info!("Listening at {}", self.config.bind_addr); + + // Retry at least every 100ms + let mut backoff = ExponentialBackoff { + max_interval: Duration::from_millis(100), + max_elapsed_time: None, + ..Default::default() + }; + + // Listen for incoming control or data channels + loop { + tokio::select! { + ret = l.accept() => { + match ret { + Err(err) => { + // Possibly a EMFILE. So sleep for a while and retry + if let Some(d) = backoff.next_backoff() { + error!("Failed to accept: {}. Retry in {:?}...", err, d); + time::sleep(d).await; + } else { + // This branch will never be executed according to the current retry policy + error!("Too many retries. Aborting..."); + break; + } + } + Ok((conn, addr)) => { + backoff.reset(); + debug!("Incomming connection from {}", addr); + let services = self.services.clone(); + let control_channels = self.control_channels.clone(); + tokio::spawn(async move { + if let Err(err) = handle_connection(conn, addr, services, control_channels).await.with_context(||"Failed to handle a connection to `server.bind_addr`") { + error!("{:?}", err); + } + }.instrument(info_span!("handle_connection", %addr))); + } + } + }, + _ = tokio::signal::ctrl_c() => { + info!("Shuting down gracefully..."); + break; + } + } + } + + Ok(()) + } +} + +async fn handle_connection( + mut conn: TcpStream, + addr: SocketAddr, + services: Arc>>, + control_channels: Arc>, +) -> Result<()> { + // Read hello + let hello = read_hello(&mut conn).await?; + match hello { + ControlChannelHello(_, service_digest) => { + info!("New control channel incomming from {}", addr); + + // Generate a nonce + let mut nonce = vec![0u8; HASH_WIDTH_IN_BYTES]; + rand::thread_rng().fill_bytes(&mut nonce); + + // Send hello + let hello_send = Hello::ControlChannelHello( + protocol::CURRENT_PROTO_VRESION, + nonce.clone().try_into().unwrap(), + ); + conn.write_all(&bincode::serialize(&hello_send).unwrap()) + .await?; + + // Lookup the service + let services_guard = services.read().await; + let service_config = match services_guard.get(&service_digest) { + Some(v) => v, + None => { + conn.write_all(&bincode::serialize(&Ack::ServiceNotExist).unwrap()) + .await?; + bail!("No such a service {}", hex::encode(&service_digest)); + } + }; + let service_name = &service_config.name; + + // Calculate the checksum + let mut concat = Vec::from(service_config.token.as_ref().unwrap().as_bytes()); + concat.append(&mut nonce); + + // Read auth + let d = match read_auth(&mut conn).await? { + protocol::Auth(v) => v, + }; + + // Validate + let session_key = protocol::digest(&concat); + if session_key != d { + conn.write_all(&bincode::serialize(&Ack::AuthFailed).unwrap()) + .await?; + debug!( + "Expect {}, but got {}", + hex::encode(session_key), + hex::encode(d) + ); + bail!("Service {} failed the authentication", service_name); + } else { + let mut h = control_channels.write().await; + + if let Some(_) = h.remove1(&service_digest) { + warn!( + "Dropping previous control channel for digest {}", + hex::encode(service_digest) + ); + } + + let service_config = service_config.clone(); + drop(services_guard); + + // Send ack + conn.write_all(&bincode::serialize(&Ack::Ok).unwrap()) + .await?; + + info!(service = %service_config.name, "Control channel established"); + let handle = ControlChannelHandle::new(conn, service_config); + + // Drop the old handle + let _ = h.insert(service_digest, session_key, handle); + } + } + DataChannelHello(_, nonce) => { + // Validate + let control_channels_guard = control_channels.read().await; + match control_channels_guard.get2(&nonce) { + Some(c_ch) => { + if let Err(e) = set_tcp_keepalive(&conn) { + error!("The connection may be unstable! {:?}", e); + } + + // Send the data channel to the corresponding control channel + c_ch.conn_pool.data_ch_tx.send(conn).await?; + } + None => { + warn!("Data channel has incorrect nonce"); + } + } + } + } + Ok(()) +} + +struct ControlChannel { + conn: TcpStream, + service: ServerServiceConfig, + shutdown_rx: oneshot::Receiver, + visitor_tx: mpsc::Sender, +} + +struct ControlChannelHandle { + shutdown_tx: oneshot::Sender, + conn_pool: ConnectionPoolHandle, +} + +impl ControlChannelHandle { + fn new(conn: TcpStream, service: ServerServiceConfig) -> ControlChannelHandle { + let (shutdown_tx, shutdown_rx) = oneshot::channel::(); + let name = service.name.clone(); + let conn_pool = ConnectionPoolHandle::new(); + let actor = ControlChannel { + conn, + shutdown_rx, + service, + visitor_tx: conn_pool.visitor_tx.clone(), + }; + + tokio::spawn(async move { + if let Err(err) = actor.run().await { + error!(%name, "{}", err); + } + }); + + ControlChannelHandle { + shutdown_tx, + conn_pool, + } + } +} + +impl ControlChannel { + #[tracing::instrument(skip(self), fields(service = %self.service.name))] + async fn run(mut self) -> Result<()> { + if let Err(e) = set_tcp_keepalive(&self.conn) { + error!("The connection may be unstable! {:?}", e); + } + + let l = match TcpListener::bind(&self.service.bind_addr).await { + Ok(v) => v, + Err(e) => { + let duration = Duration::from_secs(1); + error!( + "Failed to listen on service.bind_addr: {}. Retry in {:?}...", + e, duration + ); + time::sleep(duration).await; + TcpListener::bind(&self.service.bind_addr).await? + } + }; + + info!("Listening at {}", &self.service.bind_addr); + + let (data_req_tx, mut data_req_rx) = mpsc::unbounded_channel::(); + tokio::spawn(async move { + let cmd = bincode::serialize(&ControlChannelCmd::CreateDataChannel).unwrap(); + while let Some(_) = data_req_rx.recv().await { + if self.conn.write_all(&cmd).await.is_err() { + break; + } + } + }); + + for _i in 0..POOL_SIZE { + if let Err(e) = data_req_tx.send(0) { + error!("Failed to request data channel {}", e); + }; + } + + let mut backoff = ExponentialBackoff { + max_interval: Duration::from_secs(1), + ..Default::default() + }; + loop { + tokio::select! { + val = l.accept() => { + match val { + Err(e) => { + error!("{}. Sleep for a while", e); + if let Some(d) = backoff.next_backoff() { + time::sleep(d).await; + } else { + error!("Too many retries. Aborting..."); + break; + } + }, + Ok((incoming, addr)) => { + if let Err(e) = data_req_tx.send(0) { + error!("{}", e); + break; + }; + + backoff.reset(); + + debug!("New visitor from {}", addr); + + let _ = self.visitor_tx.send(incoming).await; + } + } + }, + _ = &mut self.shutdown_rx => { + break; + } + } + } + info!("Service shuting down"); + + Ok(()) + } +} + +#[derive(Debug)] +struct ConnectionPool { + visitor_rx: mpsc::Receiver, + data_ch_rx: mpsc::Receiver, +} + +struct ConnectionPoolHandle { + visitor_tx: mpsc::Sender, + data_ch_tx: mpsc::Sender, +} + +impl ConnectionPoolHandle { + fn new() -> ConnectionPoolHandle { + let (data_ch_tx, data_ch_rx) = mpsc::channel(CHAN_SIZE * 2); + let (visitor_tx, visitor_rx) = mpsc::channel(CHAN_SIZE); + let conn_pool = ConnectionPool { + data_ch_rx, + visitor_rx, + }; + + tokio::spawn(async move { conn_pool.run().await }); + + ConnectionPoolHandle { + data_ch_tx, + visitor_tx, + } + } +} + +impl ConnectionPool { + #[tracing::instrument] + async fn run(mut self) { + loop { + if let Some(mut visitor) = self.visitor_rx.recv().await { + if let Some(mut ch) = self.data_ch_rx.recv().await { + tokio::spawn(async move { + let cmd = bincode::serialize(&DataChannelCmd::StartForward).unwrap(); + if ch.write_all(&cmd).await.is_ok() { + let _ = io::copy_bidirectional(&mut ch, &mut visitor).await; + } + }); + } else { + break; + } + } else { + break; + } + } + } +}