专题:OpenSSH tunneling

SSH tunneling 相关


参考資料:http://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/

 本地端口转发:

  • 适用场景:发起端可以连接 SSH_server_host 端的 ssh 服务,但无法与最终目标 goal_host 的程序直接通信,而 SSH_server_host 可以
  • 命令格式:ssh [-g] -L <local_port>:<goal_host>:<goal_port> username@<SSH_server_host>
  • local_port:最初发起连接的主机端口号
  • goal_host:最终目标主机的 IP 或 主机名,可以与 SSH_server_host 为同一台机器(此时 goal_host 通常设置为 localhost 或 127.0.0.1)
  • goal_port:最终目标主机的端口号
  • SSH_server_host:负責 SSH 转发的中间主机
  • -g:此选项允许其它主机远程连接至第一台主机的 local_port 端口上,相当于进一步増加通信节点

远程端口转发:

  • 适用场景:发起端无法连接 SSH_server_host 端的 ssh 服务(如:发起端是外网主机,但 SSH_server_host 是 nat 之后的内网主机),但反向连接是允许的,而且 SSH_server_host 可以与最终目标 goal_host 上的程序直接通信
  • 命令格式:ssh [-g] -R <remote_port>:<goal_host>:<goal_port> username@<SSH_server_host>
  • remote_host:最初发起连接的主机端口号,此处的 remote 是相对 SSH_server_host 而言的,因为这个操作需要在 SSH_server_host 上完成
  • goal_host:最终目标主机的 IP 或 主机名,可以是操作此命令的本机
  • goal_port:最终目标主机的端口号
  • SSH_server_host:此处指 最初发起连接的主机 IP 或 主机名,因为此时的 ssh 连接是由中间主机发出的,最初的主机允当 ssh 服务器的角色

目标主机:

/*C 语言版*/
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h> int main(void) {
daemon(0, 0);
char *Argv[] = {"ssh", "-2", "-N", "-R", "9527:localhost:22", "fh@fanhui.f3322.net", NULL}; pid_t Pid; Label:Pid = fork(); if (Pid == 0) { execvp("ssh", Argv); } else if(Pid > 0) { waitpid(Pid, NULL, 0); goto Label; } else { exit(1); } }
#!/bin/bash
#dynamic domain name: fanhui.f3322.net
#URL: http://www.pubyun.com http://www.3322.net

Keep_Alive() {
    Ops="ssh -2 -N -f -R 9527:localhost:22 fh@fanhui.f3322.net"
#仅使用第二版 ssh 协议(-2),建立转发遂道但不登陆控制台(-N),强制后台运行从而取消占用控制台(-f)
while : do count=$(ps ax | grep -c $Ops) if [[ $count -lt 2 ]] then su fh -c $Ops fi sleep 300s done } Keep_Alive

云端( SSH 中转站):

#!/bin/bash
GetIp="http://members.3322.org/dyndns/getip"
while :
do
    lynx -mime_header -auth=kitex:aibbigql "http://members.3322.net/dyndns/update?system=dyndns&hostname=fanhui.f3322.net" 2>/dev/null
    Ip_0=$(curl $GetIp)
    sleep 600s
    Ip_1=$(curl $GetIp)
    
    while [[ $Ip_1 -eq $Ip_0 ]]
    do
        sleep 600s
        Ip_1=$(curl $GetIp)
    done

done
posted @ 2015-12-01 11:16  范辉  阅读(400)  评论(0编辑  收藏  举报