Untuk mencapai jaringan yang terisolasi saya menggunakan proxy ssh -D
socks .
Untuk menghindari keharusan mengetikkan detail setiap kali saya menambahkannya ke ~/.ssh/config
:
$ awk '/Host socks-proxy/' RS= ~/.ssh/config
Host socks-proxy
Hostname pcit
BatchMode yes
RequestTTY no
Compression yes
DynamicForward localhost:9118
Kemudian saya membuat file definisi unit layanan systemd-pengguna :
$ cat ~/.config/systemd/user/SocksProxy.service
[Unit]
Description=SocksProxy Over Bridge Host
[Service]
ExecStart=/usr/bin/ssh -Nk socks-proxy
[Install]
WantedBy=default.target
Saya membiarkan daemon memuat ulang definisi layanan baru, mengaktifkan layanan baru, memulainya, memeriksa statusnya, dan memverifikasi, bahwa ia mendengarkan:
$ systemctl --user daemon-reload
$ systemctl --user list-unit-files | grep SocksP
SocksProxy.service disabled
$ systemctl --user enable SocksProxy.service
Created symlink from ~/.config/systemd/user/default.target.wants/SocksProxy.service to ~/.config/systemd/user/SocksProxy.service.
$ systemctl --user start SocksProxy.service
$ systemctl --user status SocksProxy.service
● SocksProxy.service - SocksProxy Over Bridge Host
Loaded: loaded (/home/alex/.config/systemd/user/SocksProxy.service; enabled)
Active: active (running) since Thu 2017-08-03 10:45:29 CEST; 2s ago
Main PID: 26490 (ssh)
CGroup: /user.slice/user-1000.slice/[email protected]/SocksProxy.service
└─26490 /usr/bin/ssh -Nk socks-proxy
$ netstat -tnlp | grep 118
tcp 0 0 127.0.0.1:9118 0.0.0.0:* LISTEN
tcp6 0 0 ::1:9118 :::* LISTEN
Ini berfungsi sebagaimana dimaksud. Kemudian saya ingin menghindari keharusan untuk memulai layanan secara manual, atau menjalankannya secara permanen dengan autossh , dengan menggunakan systemd socket-aktivasi untuk pemijahan on-demand (re-). Itu tidak berhasil, saya pikir (versi saya) ssh
tidak dapat menerima deskriptor file socket.
Saya menemukan dokumentasi ( 1 , 2 ), dan contoh untuk menggunakan systemd-socket-proxyd
-tool untuk membuat 2 layanan "wrapper", "service" dan "socket":
$ cat ~/.config/systemd/user/SocksProxyHelper.socket
[Unit]
Description=On Demand Socks proxy into Work
[Socket]
ListenStream=8118
#BindToDevice=lo
#Accept=yes
[Install]
WantedBy=sockets.target
$ cat ~/.config/systemd/user/SocksProxyHelper.service
[Unit]
Description=On demand Work Socks tunnel
After=network.target SocksProxyHelper.socket
Requires=SocksProxyHelper.socket SocksProxy.service
After=SocksProxy.service
[Service]
#Type=simple
#Accept=false
ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:9118
TimeoutStopSec=5
[Install]
WantedBy=multi-user.target
$ systemctl --user daemon-reload
Ini sepertinya berhasil, sampai ssh
mati atau terbunuh. Maka itu tidak akan muncul kembali pada upaya koneksi berikutnya ketika seharusnya.
Pertanyaan:
- Bisakah / usr / bin / ssh benar-benar tidak menerima soket systemd-pass? Atau hanya versi yang lebih baru? Milik saya adalah dari up2date Debian 8.9 .
- Bisakah hanya unit root menggunakan
BindTodevice
opsi? - Mengapa layanan proxy saya tidak respawn dengan benar pada koneksi baru pertama setelah terowongan lama mati?
- Apakah ini cara yang tepat untuk mengatur "proksi ssh socks proxy"? Jika tidak, bagaimana Anda melakukannya?
autossh
harus berhati-hati dalam menyambung kembali jika koneksi gagal (meskipun itu bukan cara sistem).autossh
.Jawaban:
Saya pikir itu tidak terlalu mengejutkan, mengingat:
Instance systemd pengguna umumnya cukup terisolasi, dan misalnya tidak dapat berkomunikasi dengan instance pid-0 utama. Hal-hal seperti bergantung pada unit sistem dari file unit pengguna tidak dimungkinkan.
Dokumentasi untuk
BindToDevice
menyebutkan:Karena pembatasan yang disebutkan di atas, kita dapat menyiratkan bahwa opsi tidak berfungsi dari instance systemd pengguna.
Seperti yang saya mengerti, rantai acara adalah sebagai berikut:
SocksProxyHelper.socket
sudah dimulai.SocksProxyHelper.service
.SocksProxyHelper.service
, systemd juga mulaiSocksProxy.service
.systemd-socket-proxyd
menerima soket systemd, dan meneruskan datanya kessh
.ssh
mati atau terbunuh.SocksProxy.service
ke keadaan tidak aktif, tetapi tidak melakukan apa-apa.SocksProxyHelper.service
terus berjalan dan menerima koneksi, tetapi gagal terhubungssh
, karena tidak lagi berjalan.Cara mengatasinya adalah dengan menambahkan
BindsTo=SocksProxy.service
keSocksProxyHelper.service
. Mengutip dokumentasinya (penekanan ditambahkan):Mungkin tidak ada "jalan yang benar". Metode ini memiliki kelebihan (semuanya "on-demand") dan kerugian (ketergantungan pada systemd, koneksi pertama yang tidak bisa lewat karena ssh belum mulai mendengarkan). Mungkin menerapkan dukungan aktivasi soket systemd di autossh akan menjadi solusi yang lebih baik.
sumber
BindsTo=SocksProxy.service
ke bagian Unit file~/.config/systemd/user/SocksProxyHelper.service
, setelahAfter=SocksProxy.service
baris. Me-restart secara manual Layanan SocksProxy sekarang tidak diperlukan lagi, ketika SSH meninggal / mendapat_killed. Apakah ada cara bagi systemd untuk "menahan" koneksi awal, sehingga tidak mendapatkan reset TCP?$LISTEN_FDS
- parsing tanpa menambahkan ketergantungansd_listen_fds()
, sehingga mungkin masih merupakan penjualan yang sulit, tetapi tidak terlalu sulit.