快要放寒假了,爲了在家裏也能訪問到內網服務,特地百度了下反向代理的使用方法。
首先準備一臺擁有公共ip的服務器,設爲A
,剩下的服務器設爲B, C, D...
最簡單的方法是
ssh -fCNR ${target_port}:localhost:${ssh_port} ${public_host_user}@${public_host_ip}
$target_port
: 是A
的一個端口,執行此命令時不能在A
上被佔用$ssh_port
: 是B
的ssh端口,一般爲22
-f
: 放到後臺執行,如果不加是放到前臺。
但這樣有一個問題,ssh如果有一段時間沒有任何操作,那麼就會斷開連接。所以要想辦法讓兩個機器其中一個不斷髮心跳包。
解決方法1
修改sshd的配置。
sshd可以直接配置心跳包和重連次數。
解決方法2
寫一個daemon
腳本解決問題
export public_host_user=root
export public_host_ip=a.b.c.d
export rinne=10668
直接配置私鑰,如果不用私鑰可以自行百度查找後臺輸入密碼的解決方案。
#!/bin/bash
source ./pssh.sh
while :
do
ssh -i psshv.pri -CNR ${rinne}:localhost:22 ${public_host_user}@${public_host_ip}
done
設你的daemon腳本爲psshd.sh
,那麼就
# under bash
nohup ./psshd.sh &
# or under zsh
nohup ./psshd.sh &!
因爲在內網有很多臺服務器,所以最好寫個自動派發的腳本,或者多進行一段跳外網->公網->內網->其他內網
。
貼一個完整的./pssh.sh
#!/bin/bash
function set_env() {
export public_host_user=root
export public_host_ip=a.b.c.d
export kamauth0=10667
export kammaster0=10666
export rinne=10668
export kamnode0=10669
}
function print_help() {
echo kammaster0=10666
echo kamauth0=10667
echo rinne=10668
echo kamnode0=10669
echo e.g. ssh -p $rinne [email protected]
echo usage pssh [cmd]
echo "help : just print help of pssh"
echo "login host-name user-name: login with host-name"
echo " host-name:"
echo " kammaster0"
echo " kamauth0"
echo " kamnode0"
echo " rinne"
}
function help_login() {
echo pssh help ---- to get usage info
exit 1
}
function login() {
if [ $# -lt 2 ] ; then
help_login
fi
host_name=`eval echo '$'$1`
if [ ! -n $host_name ] ; then
help_login
fi
echo ssh -p $1'('$host_name')' $2@127.0.0.1
ssh -p $host_name $2@127.0.0.1
}
set_env
if [ $# -ge 1 ] ; then
case "$1" in
# help) print_help; exit 0 ; break;;
login) shift 1; login $1 $2; break ;;
*) print_help; exit 0 ; break;;
esac
fi