端口转发概念
端口转发或隧道,是一种通过SSH转发本来不安全的TCP通信的安全保护罩。您可以保护例如POP3,SMTP和HTTP连接,否则可能是不安全的。网络上什么人都有!
有两种类型的端口转发:本地和远程转发。它们也分别被称作传出和传入隧道。
本地端口转发转发流量来本地端口到指定的远程端口。例如,所有流向客户机端口1234的流量可能被转发到服务器(主机)端口23上。
注:localhost的值是在ssh连接建立之后才确定——所以本地端口转发(传出隧道)时,localhost指您所连接的服务器(远程主机的电脑)。
远程端口转发则正好相反:其转发流向远程端口的流量到指定的本地端口。例如,所有的流量流向服务器(主机)上的1234端口可以被转发到客户端(本地主机)的端口23上。
端口转发实现
ssh的三个强大的端口转发命令:
转发到远端:ssh -C -f -N -g -L 本地端口:目标IP:目标端口 用户名@目标IP
转发到本地:ssh -C -f -N -g –R 本地端口:目标IP:目标端口 用户名@目标IP
动态转发:ssh -C -f -N -g -D listen_port user@Tunnel_Host
-C:压缩数据传输。
-f :后台认证用户/密码,通常和-N连用,不用登录到远程主机。
-N :不执行脚本或命令,通常与-f连用。
-g :在-L/-R/-D参数中,允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接。
-L 本地端口:目标IP:目标端口: 将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
-R 本地端口:目标IP:目标端口: 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
-p :被登录的ssd服务器的sshd服务端口。
-D port: 指定一个本地机器 “动态的’’ 应用程序端口转发. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接. 目前支持 SOCKS4 协议, 将充当 SOCKS4 服务器. 只有 root 才能转发特权端口. 可以在配置文件中指定动态端口的转发.
应用举例
1.将发往本机的80端口访问转发到174.139.9.66的8080端口
ssh -C -f -N -g -L 80:174.139.9.66:8080 master@174.139.9.66
2.将发往174.139.9.66的8080访问转发到本机的80端口
ssh -C -f -N -g -R 80:174.139.9.66:8080 master@174.139.9.66
任何人在你的本地子网中应该能够这样做是为了连接到本机的工作:
$ ssh root@192.168.10.10 -p 10000
补充
让远程端口转发可以让任何人使用
如果你想让每个在子网的人都能够SSH到自己家里的电脑,没有-g选项可以让远程端口转发能够让其他人使用,所以你需要改变远程主机的SSH配置,编辑/etc/ssh/sshd_config 增加以下这行:
GatewayPorts yes
就像以前一样连接:
home $ SSH user@work.example.org -R 10000:192.168.1.10:22
现在,它是监听的服务器在工作的所有接口:
work.example.org$ netstat -tunelp | grep 10000
tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN 0 73721060 4426/1
1
2
3
4
work.example.org$netstat-tunelp|grep10000
tcp000.0.0.0:100000.0.0.0:*LISTEN0737210604426/1
现在任何人可以通过服务器连接到自己家里的电脑:
anyone.example.org $ SSH anyone@work.example.org -p 10000
1
2
anyone.example.org$SSHanyone@work.example.org-p10000
ipv6 示例
基本上与ipv4相同,只是因为ipv6地址的形式中有冒号,所以为了清晰,需要在ipv6地址两端加[和] 例如:
ssh -g -L 8922:[2001:…:…:…:…:…:fe23:93e4]:22 id@2001:…:…:…:…:…:…:93e4
1
2
ssh-g-L8922:[2001:…:…:…:…:…:fe23:93e4]:22id@2001:…:…:…:…:…:…:93e4
注意
如果你想映射的端口<1024,您将需要root身份。
不要忘记,如果需要对端口进行映射,需要在相应防火墙中打开所需的端口。
然而,转发的端口只能运行TCP协议,但有另一种方法,通过SSH使用netcat可以用来转发UDP协议的内容。