DAEMON_OPTS="-p 0.0.0.0:443 --ssl 127.0.0.1:8443 --ssh 127.0.0.1:22 --user nobody"
Bergantung pada jenis koneksi, koneksi ke port 443 akan diteruskan ke port lokal:
- 8433 dalam kasus https (nginx berjalan pada port ini)
- 22 dalam kasus ssh
Tetapi ketika saya mencoba membuat koneksi ssh ke server, saya kembali gagal. Ternyata, penyaringan dilakukan tidak hanya dengan port, tetapi investigasi paket yang dalam juga digunakan. Ini membuat tugas menjadi lebih sulit. Lalu lintas ssh harus digabungkan dalam https. Untungnya, ini tidak sulit berkat proyek websocat . Di halaman proyek, Anda dapat menemukan banyak binari terkompilasi. Jika karena alasan tertentu Anda ingin mengkompilasi sendiri biner dari sumbernya, ini juga tidak terlalu sulit. Saya melakukan ini dengan pengemas hashicorp dengan konfigurasi berikut:
{
"min_packer_version": "1.6.5",
"builders": [
{
"type": "docker",
"image": "ubuntu:20.04",
"privileged": true,
"discard": true,
"volumes": {
"{{pwd}}": "/output"
}
}
],
"provisioners": [
{
"type": "shell",
"skip_clean": true,
"environment_vars": [
"DEBIAN_FRONTEND=noninteractive"
],
"inline": [
"apt-get update && apt-get install -y git curl gcc libssl-dev pkg-config gcc-arm-linux-gnueabihf",
"curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs >/tmp/rustup.sh && chmod +x /tmp/rustup.sh && /tmp/rustup.sh -y",
"git clone https://github.com/vi/websocat.git && cd websocat/",
". $HOME/.cargo/env && cargo build --release --features=ssl",
"printf '[target.armv7-unknown-linux-gnueabihf]\nlinker = \"arm-linux-gnueabihf-gcc\"\n' >$HOME/.cargo/config",
"rustup target add armv7-unknown-linux-gnueabihf",
"cargo build --target=armv7-unknown-linux-gnueabihf --release",
"strip target/release/websocat",
"tar czf /output/websocat.tgz target/armv7-unknown-linux-gnueabihf/release/websocat target/release/websocat",
"chown --reference=/output /output/websocat.tgz"
]
}
]
}
Sisi klien ada di ubuntu 20.04, server berjalan di nvidia tegra jetson tk1, jadi untuk itu saya melakukan perakitan silang untuk platform armv7. Harap dicatat bahwa pembangunan server dilakukan tanpa dukungan ssl, karena penghentian ssl dilakukan oleh nginx, yang menangani koneksi masuk. Konfigurasi nginx terlihat seperti ini:
http {
server {
listen 0.0.0.0:8443 ssl;
server_name your.host.com;
ssl_certificate /etc/letsencrypt/live/your.host.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your.host.com/privkey.pem;
location /wstunnel/ {
proxy_pass http://127.0.0.1:8022;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
}
Saya menjalankan Websocat dari mahkota pengguna saya:
* * * * * netstat -lnt|grep -q :8022 || $HOME/bin/websocat -E --binary ws-l:127.0.0.1:8022 tcp:127.0.0.1:22|logger -t websocat &
Sekarang Anda dapat terhubung ke server Anda seperti ini:
ssh -o ProxyCommand='websocat --binary wss://your.host.com/wstunnel/' your.host.com
Seberapa banyak pembungkus dalam https mengurangi bandwidth? Untuk memeriksa ini, saya menggunakan perintah berikut:
ssh -o ProxyCommand='websocat --binary wss://your.host.com/wstunnel/' your.host.com 'dd if=/dev/zero count=32768 bs=8192' >/dev/null
Dalam percobaan saya, saya mendapatkan pengurangan bandwidth 2x. Saat menggunakan protokol ws: //, mis. http, bandwidth koneksi identik dengan ssh yang tidak dibungkus.
Inilah cara Anda menyiapkan sesi sshuttle:
sshuttle -e 'ssh -o ProxyCommand="websocat --binary wss://your.host.com/wstunnel/"' -r your.host.com 0/0 -x $(dig +short your.host.com)/32
Pada kunjungan berikutnya ke layanan mobil, saya memastikan bahwa semuanya berfungsi sebagaimana mestinya. Sebagai bonus bagus, jumlah upaya untuk masuk ke server melalui ssh dari alamat kiri turun tajam.