利用SSH 反向代理 ,实现跨局域网连接家里的linux 主机 (树莓派)
最近我買了一臺樹莓派主機 ,并且裝上了官方系統(Raspbian )。打算用它來跑跑腳本之類的。但是遇到一個問題,我在外的時候,怎么遠程連接家里的在局域網中的主機呢?
我已經成功的解決了這個問題,期間也遇到了各種坑,我在這里也會詳細的說一下這些坑。如果您還有任何其他問題,可以在下面評論留言給我。
軟硬件環境:
1.樹莓派 3b+ 1個,安裝于我租住的房間中。聯網經過多層NAT(網絡地址轉換),故無公網IP
2.一個有公網IP的VPS(虛擬主機),我使用的是國外的vultr,您也可以選擇阿里云,亞馬遜等各種廠商產品。這臺機器的操作系統為 centos 7.0 ,IP 為 A.A.A.A
3.一臺普通的電腦
操作步驟:
局域網中的樹莓派連接公網服務器反向代理端口:
這段代碼在本地樹莓派中執行,這段代碼是將本地機器的22端口綁定公網服務器的7233端口
在公網服務器中執行如下代碼,如果出現相同結果則表明 SSH反向代理成功
這時,你可以通過普通電腦的ssh客戶端 連接 公網服務器的7233端口。測試連接是否成功
編寫腳本守護反向代理
1.設置樹莓派免密碼登錄公網服務器:
2.編寫公網服務器關閉代理腳本
#!/bin/shif [ -n "$1" ] && [ "$1" -gt "0" ];thenPID=$(netstat -anp | grep $1 | awk '/sshd/ && !/awk/{print $7}')PID=${PID%%/*}if [ -n "${PID}" ];thenkill -9 $PID && exit 0fi fiexit 13.編寫客戶端代理守護腳本 (注意配置服務器端口及IP)
#!/bin/bashROMOTE_USERNAME=root ROMOTE_SERVER_IP="A.A.A.A" ROMOTE_PORT=7233 ###[ /sbin/ifconfig|sed -n '/inet addr/s/^[^:]*:\([0-9.]\{7,15\}\) .*/\1/p'|grep -v 127.0.0.1 ] LOCALHOST_IP=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"` LOCALHOST_PORT=22while true ; doPID=$(ssh -l root ${ROMOTE_SERVER_IP} netstat -anp | grep ${ROMOTE_PORT} | awk '/sshd/ && !/awk/{print $7}')PID=${PID%%/*}if [ -n "$PID" ] && [ "$PID" -gt "0" ];thensleep 30selse/usr/bin/ssh -l root ${ROMOTE_SERVER_IP} /bin/sh /data/kill_ssh_agent.sh ${ROMOTE_PORT}/usr/bin/ssh -CqTfnN -R 0.0.0.0:${ROMOTE_PORT}:${LOCALHOST_IP}:${LOCALHOST_PORT} ${ROMOTE_USERNAME}@${ROMOTE_SERVER_IP}fi doneexit 04.設置 SSH 連接為長連接 (在公網服務器操作)
vi /etc/ssh/sshd_config#每1分鐘發送一個心跳信號給客戶端 ClientAliveInterval 60 #最大超時次數,客戶端不響應則關閉連接 ClientAliveCountMax 3遇到的問題:
理論上按照上面的步驟操作,反向代理就能成功了。但是操作中我還是遇到了不少問題。我這里把他們列出來
1.防火墻
防火墻會阻止未經許可端口的數據通過,所以允許端口的防火墻通過是很有必要的。您需要確認每臺機器是否有防火墻,如果有防火墻,是否正確的配置了防火墻。
另外,在公網服務器中,很多服務商提供了額外的防火墻服務。在他們的網頁控制臺可以看到。我的公網服務器就有服務商提供的額外防火墻。我的做法是將centos自帶的防火墻關掉,并禁止開機啟動。然后配置服務商提供的防火墻,允許反向代理的端口通過。當然您也可以兩個防火墻都開著,但要確保他們都通過了您需要的端口。
2.ssh自動登錄失敗:
自動登錄失敗,可能因為你的秘鑰文件權限不對。ssh秘鑰登錄對文件權限很敏感。還有我犯了一個錯誤,我在公網服務器生成秘鑰,然后放到本地。導致一度登錄失敗。正確的做法應是在內網生成秘鑰,放到外網服務器中
3.守護腳本不能成功設置反向代理問題:
守護代理是通過 /etc/rc.local 開機啟動的,其默認用戶為root。我在生成秘鑰的時候一直用的普通用戶,于是導致在開啟自動啟動時運行失敗。解決辦法是,切換到內網機器的root用戶,再生成一次秘鑰,將秘鑰追加到公網服務器的authorized_keys文件中。如果新買的機器不知道root用戶的密碼是什么,可以看一下參考文章的第4個連接
參考的文章:
https://www.cnblogs.com/phpdragon/p/5314650.html
https://blog.csdn.net/Post_Yuan/article/details/78603212
http://www.mamicode.com/info-detail-2128504.html
https://blog.csdn.net/faryang/article/details/50779767
如果有幫到您,打個賞唄
總結
以上是生活随笔為你收集整理的利用SSH 反向代理 ,实现跨局域网连接家里的linux 主机 (树莓派)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字典数组根据某key排序
- 下一篇: 自制CSDN博客评论邮件提醒