专题: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
HADEX_ FROM HELL.