나는 노트북을 가지고 있습니다. 집에서 일할 때 일부 서버에 SSH 터널을 설정합니다. 터널은 자동으로 시작되고 오류가 발생할 경우 다시 시작되는 시스템 서비스로 구현됩니다.
현재는 노트북을 사무실에 가져오면 터널도 설치되어 있습니다. 내 위치를 기반으로 터널 서비스의 시작을 결정하는 방법이 있나요? 위치는 내 IP 주소를 기반으로 하거나 서버를 ping할 수 있는지 여부를 기반으로 할 수 있습니다.
사무실이 아닌 집에 있을 때만 터널을 설정하는 가장 좋은 방법은 무엇입니까?
답변1
man systemd.unit
수많은 조건과 주장이 정의되어 있습니다.
두 개의 장치를 실행할 수 있습니다 systemd
.
- A는
Type=oneshot
스크립트를 실행한 다음 결과에 따라 파일을 생성합니다. 스크립트는 SSID, 기본 경로, IP 주소 또는 기타 의미 있는 모든 항목을 확인할 수 있습니다. - 기본 터널 서비스는
Condition...=
이 파일과After=
관계를 기반으로 합니다.
예를 들어:
[Unit]
Description=Checking for ssid
[Service]
Type=oneshot
ExecStart=-/bin/bash -c "touch %t/$(/usr/sbin/iwgetid -r).ssid"
그 다음에
[Unit]
Description=VPN Tunnel
After=ssid.service
ConditionPathExists=%t/AtHome.ssid
[Service]
...
검사 는 Condition...=
시작 시에만 실행됩니다. 따라서 컴퓨터가 해당 위치에서 시작되는 경우에만 작동합니다. %t
재부팅하면 항상 지워지기 때문에 파일을 넣어두었습니다 .
다시 시작하지 않고 작동하려면 첫 번째 조건을 폴링하고 파일이 없으면 충돌하는 서비스를 시작하기 위한 일종의 타이머가 필요합니다. 그러면 터널 서비스가 중지됩니다.
더 간단한 솔루션은 다음을 사용하는 것과 같을 수도 있습니다 ExecStartPre=
.Restart=on-failure
[Unit]
Description=VPN Tunnel
[Service]
ExecStartPre=/bin/bash -c "test $(/usr/sbin/iwgetid -r) = MyHome"
Restart=on-failure
RestartSec=2m
...
SSID가 "MyHome"과 일치하는지 확인합니다. 성공하면 나머지 서비스가 실행됩니다. 실패하면 잠시 후 다시 시도합니다 RestartSec=
(기본값은 100ms인데 너무 빨라서 여기서는 5m로 설정했습니다).
현재 솔루션이 실패 시 이미 다시 시작되므로 이로 인해 솔루션이 손상될 수 있으며 이는 첫 번째 솔루션이 더 나을 수 있음을 의미합니다. 또한 systemctl status
가정용 WiFi를 사용하지 않는 경우 시스템이 다운그레이드된 것으로 표시됩니다.