공유기 등 내부망에 있어서 외부 접속이 어려운 환경에서 접속할 수 있게 할 수 있다.
터널링을 통해 가능하다. ssh 로 접속해 있을 수 있는 호스팅 환경이 있으면 된다.
apt install autossh
설치는 쉽다.
systemd / upstart 방식에 따라 자동 실행 설정이 조금 다르다.
# systemd 방식 (최근 배포판)
# vi /etc/systemd/system/autossh.service
[Unit]
Description=AutoSSH service for a reverse tunnel
After=network-online.target
[Service]
ExecStart=/usr/bin/autossh -M 0 -q -N \
-i /root/.ssh/id_rsa \
-o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" your-externel-server \
-R 5991:127.0.0.1:5901 \
-R 5922:127.0.0.1:22 \
-R 5989:192.168.11.19:5900
[Install]
WantedBy=multi-user.target
위 설정처럼 하면 된다. 자신의 맞는 환경에 따라 수정해서 사용하면 된다.
내부 서비스(5901 , 22) 로 접속가능하고, 또는 동일네트워크 다른 서버로도 접속가능하다.
위 파일 생성 후 다음 명령으로 실행해준다.
systemctl enable autossh
systemctl start autossh
# upstart 방식 (예전 방식)
# vi /etc/init/autossh.conf
description "autossh daemon for ssh tunnel"
start on net-device-up IFACE=eth0
stop on runlevel [01S6]
#setuid autossh
respawn
respawn limit 5 60
script
export AUTOSSH_FIRST_POLL=30
export AUTOSSH_GATETIME=0
export AUTOSSH_POLL=60
/usr/bin/autossh -M 0 -q -N \
-i /root/.ssh/id_rsa \
-o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" your-externel-server \
-R 5991:127.0.0.1:5901 \
-R 5922:127.0.0.1:22 \
-R 5989:192.168.11.19:5900
end script
설정 방식만 조금 다를 뿐 사용법은 동일하다.
그럼, 제 3의 위치에서 터널링으로 뚫어 놓은 내부서버에 접속해본다.
당연히 바로 접속 할 수는 없다.
다음의 ssh 명령으로 {로컬PC} => 외부 서버 => 내부망(터널링) 으로 접속한다.
ssh your-externel-server -L 5991:127.0.0.1:5991 -L 5922:127.0.0.1:5922
위 설정은 로컬PC 의 포트로 터널링한 내부망의 서비스 포트와 연결하는 것이다.
ssh root@localhost -p 5922
내부에서 다음 처럼 접속하면 된다. (위 예시는 내부망의 22번 ssh 포트로 접속하는 명령)
조금 복잡해 보일 수 있지만, 흐름을 이해하면 크게 어렵지는 않다.
내부망에 포트포워딩으로 접근할 수 없는 경우, 보안접속이 필요한 서비스 등에 사용할 수 있다.
기본적으로 ssh 를 이용한 것이라 vpn 처럼 보안접속이 필요한 경우등에 유용할 듯 싶다.
[추가]
systemd 방식 설정 후 재부팅했는데, autossh 가 실행이 안되는 경우
다음과 같은 에러가 날때 (systemctl status autossh 로 확인)
ssh exited prematurely with status 255; autossh exiting
구글링 해보니, After=network-online.target 대신에
After=network.target
After=NetworkManager-wait-online.service
등등 여러개로 바꿔가며 해봐도 안된다. 네트워크가 정상 접속되는 시점이 차이가 있는 듯 하다.
# vi /etc/systemd/system/autossh.service 에 다음 항목을 추가해준다.
[Service]
ExecStartPre=/bin/sh -c 'until ping -c1 google.com; do sleep 1; done;'
위 처럼 네트워크가 동작하는지 체크 후에 실행하도록 한다. ( 완료 후 systemctl daemon-reload 로 설정을 재로딩 해준다)