本文教程需要有一臺(tái)公網(wǎng)服務(wù)器
【本文參考鏈接】
利用SSH 反向代理 ,實(shí)現(xiàn)跨局域網(wǎng)連接家里的linux 主機(jī) (樹莓派)
centos7查看端口是否開放
最近新入了一臺(tái)樹莓派4,順便把我的2b出了。以前只是拿來當(dāng)作3D打印服務(wù)器,雖然公司的網(wǎng)絡(luò)有公網(wǎng)IP,但是這個(gè)IP也不固定,每次重新?lián)芴?hào)或者停電之類的操作都會(huì)使得公網(wǎng)IP改變。
以前試過花生殼等內(nèi)網(wǎng)穿透軟件,最近想試試新的方法,公司剛好也有公網(wǎng)服務(wù)器(阿里云),所以才有了這篇文章。
關(guān)于反向代理的介紹,可以查看百度百科:反向代理
注:本文中的公網(wǎng)服務(wù)器地址為
11.22.33.44,公網(wǎng)服務(wù)器端口為8022,樹莓派端口為22,一定要根據(jù)你自己的實(shí)際情況修改為你的配置。
一、修改公網(wǎng)服務(wù)器ssh配置文件
#vi /etc/ssh/sshd_config
找到GatewayPorts,默認(rèn)設(shè)置為no,將其修改為yes
GatewayPorts yes
然后重啟ssh服務(wù):
# centos 7
systemctl reload sshd.service
# centos 7以下
service sshd reload
二、將局域網(wǎng)中的樹莓派連接到公網(wǎng)服務(wù)器反向代理端口
# ssh -CqTfnN -R 0.0.0.0:8022:127.0.0.1:22 root@11.22.33.44
其中,8022為公網(wǎng)反向代理端口,22為樹莓派的ssh端口,11.22.33.44為公網(wǎng)服務(wù)器的IP地址。
上述代碼即:將樹莓派的22端口反向代理到IP地址11.22.33.44的8022端口
三、檢查公網(wǎng)服務(wù)器反向代理是否成功
公網(wǎng)服務(wù)器執(zhí)行netstat -anp | grep 8022,如果出現(xiàn)類似下面的結(jié)果,則表示SSH反向代理成功。
tcp 0 0 0.0.0.0:8022 0.0.0.0:* LISTEN 6520/sshd: root
四、測(cè)試反向代理是否成功
完成上面的步驟以后,就可以通過其他電腦的ssh客戶端,連接公網(wǎng)服務(wù)器的8022端口了。
# ssh -p 8022 root@11.22.33.44
如果連接失敗,繼續(xù)往下看~
五、開放公網(wǎng)服務(wù)器端口
如果按照前面的步驟操作以后,發(fā)現(xiàn)第四步連接不上,可能是公網(wǎng)服務(wù)器需要開放端口。
- 首先需要在服務(wù)器管理面板開放
8022端口,每個(gè)供應(yīng)商可能操作不同,這里不再贅述。 - 我用的服務(wù)器系統(tǒng)是
centos 7,輸入命令netstat -tlunp | grep 8022,得到以下結(jié)果:
tcp 0 0 0.0.0.0:8022 0.0.0.0:* LISTEN 6520/sshd: root
可以看到系統(tǒng)開放了8022端口。然后檢查防火墻端口,輸入iptables-save | grep 8022,發(fā)現(xiàn)什么也沒有輸出。說明防火墻將8022端口攔截了,需要開放防火墻的端口:
firewall-cmd --zone=public --add-port=8022/tcp --permanent
firewall-cmd --reload
第一條命令是添加端口,第二條命令是重載防火墻??吹?code>success字樣后,再次輸入iptables-save | grep 8022可以看到如下字樣,則表示防火墻配置成功。這時(shí)候再回到第四步測(cè)試就可以連接了。
-A IN_public_allow -p tcp -m tcp --dport 8022 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
以下內(nèi)容為復(fù)制參考鏈接一中的原文,并做了注釋,已經(jīng)測(cè)試正常
六、編寫腳本守護(hù)反向代理
1. 設(shè)置樹莓派免密碼登錄公網(wǎng)服務(wù)器
在內(nèi)網(wǎng)樹莓派中切換到root賬戶:sudo su,然后執(zhí)行以下命令生成ssh公鑰
ssh-keygen -t rsa -P ''
在/root/.ssh/中 會(huì)生成兩個(gè)文件id_rsa與id_rsa.pub,然后將id_rsa.pub復(fù)制到公網(wǎng)服務(wù)器中
scp /root/.ssh/id_rsa.pub root@11.22.33.44:~
切換到公網(wǎng)服務(wù)器中執(zhí)行如下代碼
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
修改文件權(quán)限,這一步很必要
chmod 600 /root/.ssh/authorized_keys
chmod 700 /root/.ssh/
2. 在公網(wǎng)服務(wù)器總新建關(guān)閉代理的腳本
從樹莓派上調(diào)用此腳本,可以從公網(wǎng)服務(wù)器關(guān)閉反向代理進(jìn)程。
執(zhí)行sudo vi /root/kill_ssh_agent.sh,并輸入以下內(nèi)容:
#!/bin/sh
if [ -n "$1" ] && [ "$1" -gt "0" ];then
PID=$(netstat -anp | grep $1 | awk '/sshd/ && !/awk/{print $7}')
PID=${PID%%/*}
if [ -n "${PID}" ];then
kill -9 $PID && exit 0
fi
fi
exit 1
將此腳本保存為kill_ssh_agent.sh,并記住路徑,我的是保存在了/root/kill_ssh_agent.sh,然后添加可執(zhí)行權(quán)限:
sudo chmod +x /root/kill_ssh_agent.sh
3. 在樹莓派上創(chuàng)建反向代理進(jìn)程守護(hù)腳本
在樹莓派上執(zhí)行sudo vi /root/ssh_agent_daemon.sh,并輸入以下內(nèi)容:
#!/bin/bash
REMOTE_USERNAME=root
REMOTE_SERVER_IP="11.22.33.44"
REMOTE_PORT=8022
#原文中用此命令獲取IP
#LOCALHOST_IP=`/sbin/ifconfig -a | grep inet | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}' | tr -d "addr:"`
#其實(shí)用下面的代碼就可以獲取到
#LOCALHOTST_IP=$(hostname -I)
#但是經(jīng)測(cè)試,這么寫可能會(huì)連接不上的,所以按照之前的寫法,直接如下寫成本機(jī)地址即可
LOCALHOTST_IP="127.0.0.1"
LOCALHOST_PORT=22
while true ;
do
PID=$(ssh -l root ${REMOTE_SERVER_IP} netstat -anp | grep ${REMOTE_PORT} | awk '/sshd/ && !/awk/{print $7}')
PID=${PID%%/*}
if [ -n "$PID" ] && [ "$PID" -gt "0" ];then
sleep 30s
else
/usr/bin/ssh -l root ${REMOTE_SERVER_IP} /bin/sh /root/kill_ssh_agent.sh ${REMOTE_PORT}
/usr/bin/ssh -CqTfnN -R 0.0.0.0:${REMOTE_PORT}:${LOCALHOST_IP}:${LOCALHOST_PORT} ${REMOTE_USERNAME}@${REMOTE_SERVER_IP}
fi
done
exit 0
保存,并添加可執(zhí)行權(quán)限:
sudo chmod +x /root/ssh_agent_daemon.sh
這個(gè)路徑也要用到。
4. 在公網(wǎng)服務(wù)器中,設(shè)置 SSH 連接為長(zhǎng)連接
sudo vi /etc/ssh/sshd_config
找到ClientAliveInterval和ClientAliveCountMax,并按照下面修改:
#每1分鐘發(fā)送一個(gè)心跳信號(hào)給客戶端
ClientAliveInterval 60
#最大超時(shí)次數(shù),客戶端不響應(yīng)則關(guān)閉連接
ClientAliveCountMax 3
5. 在樹莓派中將守護(hù)進(jìn)程腳本設(shè)置為開機(jī)啟動(dòng)
sudo vi /etc/rc.local
將下面這一行添加到exit 0之前
/bin/sh /root/ssh_agent_daemon.sh &
注意腳本路徑,這里必須寫完整路徑
/root/ssh_agent_daemon.sh,一定不要寫成~/ssh_agent_daemon.sh,否則會(huì)啟動(dòng)失敗