電腦A
是一台在防火牆後面內網的Linux主機(甚至連DHCP都會變),而防火牆則是沒有固定IP的。如果我們想要控制電腦A
,就需要一台具有固定IP的Linux主機(我用的是GOOGLE雲端主機,電腦B
),然後從電腦A建立一條反向通道到電腦B
,以後要從任何地方(電腦C
)連入電腦A
,就透過電腦B
,然後從這條反向通道連回電腦A
。
sudo apt-get install openssh-server)
sudo apt-get install autossh)
ssh-copy-id -i <要放上電腦B的公鑰.pub> <電腦B IP>)
。~/.ssh/autohorized_keys
中把公鑰直接寫入,因此就算兩台不同電腦的public key檔案都叫id_rsa.pub
也沒關係,和檔名無關。ssh -NfR 12345:localhost:22 joshhu@電腦B
/etc/ssh/sshd_config
中的GatewayPorts
要放yes
,改完後重新啟動sshd
服務。~/.ssh/config
的設定來建立反向通道~/.ssh/config
的設定如下圖
Host toComputerB
Hostname <你的公網ip位址>
port 22 #連入電腦B的22 port
user <你的使用者名稱>
IdentityFile /home/<使用者名稱>/.ssh/<你的key file>
RemoteForward 12346 localhost:22 #任何連入電腦B 12346的ssh都連入電腦A的22
# RemoteForward 12346 localhost:5900 # 這是挖vnc用的
ServerAliveInterval 30
ServerAliveCountMax 3
autossh -M 0 -TN toComputerB
就會建立連線至電腦B的反向通道了。12346
。這個動作要在電腦A上輸入autossh
之前就要做好。sudo ufw allow 12346
如果你的電腦B沒有開防火牆,可以先開好,但要記得放行ssh
。
sudo ufw allow ssh
sudo ufw enable
如果要從電腦C連至電腦A,只要在電腦C上輸入ssh <電腦B的IP> -p 12346
即可。可以建立在~/.ssh/config
中。
systemd
的service完成cd /etc/systemd/system
sudo vi create_reverse_tunnel.service
內容如下
[Unit]
Description=AutoSSH tunnel service to deepmind ssh
After=network-online.target ssh.service
[Service]
Restart=always
RestartSec=20
User=<使用者名稱>
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -M 0 -TN toComputerB
[Install]
WantedBy=multi-user.target
之後出來,輸入
cd /etc/systemd/system
sudo systemctl enable create_reverse_tunnel.service
sudo systemctl start create_reverse_tunnel.service
sudo systemctl status create_reverse_tunnel.service
ssh
反向通道