Autostart przekierowanych portów w Linux

Autostart przekierowanych portów w Linux
CA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 177
0

Witam,

w RPi chciałem przekierować porty z LAN na ZeroTier za pomocą SSH:

Kopiuj
ssh -fNT 127.0.0.1 -p 22 -L 0.0.0.0:8080:192.168.0.2:8080 -L 0.0.0.0:8081:192.168.0.3:8080

Ale po restarcie RPi to przekierowanie nie będzie już aktywne.
Jak zrobić, aby to przekierowanie aktywowało się po każdy włączeniu Pi ?

CA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 177
0

Zrobiłem to tak:

Kopiuj
#crontab -e
@reboot  /home/dietpi/portForward.sh

ale niestety nie działa.

Czy trzeba ustawiać jakieś prawa pliku lub gdzieś nadać uprawnienia admina ?

VT
  • Rejestracja: dni
  • Ostatnio: dni
1

@Caporeira: Nie wiem dokładnie jakiego masz tam Linuxa na tym RPi ale jeśli wspiera systemd to możesz utworzyć nowy serwis dla systemd i tam wrzucić wywołanie twojego skryptu. Zobacz sobie co zwróci coś takiego:

Kopiuj
systemctl list-unit-files

jeśli dostaniesz listę serwisów systemd to znaczy, że możesz dopisać swój własny serwis. Jeśli dostaniesz "Command not found" to znaczy, że możesz się podpiąć z tym wywołaniem skryptu pod jakiś skrypt systemowy typu /etc/rc.d/rc.local.
Odnośnie systemd - zobacz sobie przykładowo plik /usr/lib/systemd/system/sshd.service jak jest zrobiony, zrób może jego kopię pod własną jakąś nazwą i stamtąd uruchom twój skrypt.

CA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 177
0

@vtx: po wpisaniu komendy, lista serwisów się pojawia.
Mój system to DietPi.

Pliku sshd.service nie znajduje, za to jest ssh.service i wygląda następująco:

Kopiuj
[Unit]
Description=OpenBSD Secure Shell server
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run

[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target
Alias=sshd.service

A co do folderów rc.d to są tylko od rc0.d do rc6.d

VT
  • Rejestracja: dni
  • Ostatnio: dni
0

Ok, to spróbuj może tak:

Utwórz plik np. o nazwie "tunnel.service" w katalogu usera ~/.config/systemd/user/ z prawami tego usera. Tam możesz wrzucić coś takiego:

Kopiuj
[Unit]
Description=ssh tunnel
After=network.target

[Service]
ExecStart=/usr/bin/ssh user@127.0.0.1 -L 0:8080:217.74.64.235:80 -f sleep 10000
KillMode=process

a potem tak:

Kopiuj
systemctl --user daemon-reload
systemctl --user start tunnel
systemctl --user status tunnel

Oczywiście zamiast mojego przykładu wywołania ssh wrzucasz swój dodając "-f sleep 10000". Albo pokombinuj jak zastąpić tego sleep-a czymś innym.
W sumie to ten plik "tunnel.service" powinien być linkiem do pliku, bo tak działa systemd - jak robisz enable to on tworzy linka do pliku w /usr/lib/systemd/system/.

.andy
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1524
0

Może przez https://github.com/troglobit/redir ? Takie proste narzędzie do przekierowania portów.

hauleth
  • Rejestracja: dni
  • Ostatnio: dni
0

Ja bym poszedł drogą @vtx, ale jak proces systemowy, a nie użytkownika, by startowało razem z systemem, a nie z użytkownikiem (bo nie zawsze sesja użytkownika będzie aktywna).

A jeśli chcesz zrobić sam forwarding bez SSH, co ma więcej sensu tutaj, skoro łączysz się do localhost, to możesz zamiast tego użyć systemd-socket-proxyd w połączeniu z socket activation.

Robisz to w taki sposób. Tworzysz sobie pliki:

/etc/systemd/system/proxy-1.socket:

Kopiuj
[Socket]
ListenStream=8080

[Install]
WantedBy=sockets.target

/etc/systemd/system/proxy-1.service:

Kopiuj
[Unit]
Requires=proxy-1.socket
After=proxy-1.socket

[Service]
ExecStart=/usr/lib/systemd/systemd-socket-proxyd 192.168.0.2:8080
PrivateTmp=yes
PrivateNetwork=yes

/etc/systemd/system/proxy-2.socket:

Kopiuj
[Socket]
ListenStream=8081

[Install]
WantedBy=sockets.target

/etc/systemd/system/proxy-2.service:

Kopiuj
[Unit]
Requires=proxy-2.socket
After=proxy-2.socket

[Service]
ExecStart=/usr/lib/systemd/systemd-socket-proxyd 192.168.0.3:8080
PrivateTmp=yes
PrivateNetwork=yes

Jak już to masz to odpalasz:

Kopiuj
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now proxy-1.socket proxy-2.socket

Teraz systemd będzie nasłuchiwał na portach 8080 oraz 8081 i aktywuje połączenie dopiero wtedy kiedy zajdzie taka potrzeba (aka będzie ktoś chciał się połączyć).

CA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 177
0

@hauleth: Niestety, ale coś to nie działa u mnie.
Czy można to zdiagnozować/monitorować ... gdzie leży przyczyna ?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.