隧道协议(英语:Tunneling Protocol)是一种网络协议,在其中,使用一种网络协议(发送协议),将另一个不同的网络协议,封装在负载部分。使用隧道的原因是在不兼容的网络上传输数据,或在不安全网络上提供一个安全路径。
隧道则是对比分层式的模型,如OSI模型或TCP/IP。隧道协议通常(但并非总是)在一个比负载协议还高的层级,或同一层。要了解协议堆栈,负载和发送协议都须了解。传统的分层式协议,如OSI模型或TCP/IP模型,HTTP协议 ,并不被认为是隧道协议。隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。
通用路由封装是一种跑在 IP (IP 号码为 47)的协议,身为网络层上的网络层的例子,通常是用带有公开地址的 IP 数据包来携带带有 RFC 1918 私用地址的 IP 数据包来穿越互联网。在此例上,发送和负载协议是兼容的,但负载地址和发送网络是不兼容的。
隧道协议可能使用数据加密来发送不安全的负载协议。
SSH隧道可以通过加密频道将明文流量导入隧道中。为了创建SSH隧道, SSH客户端要设置并转交一个特定本地端口号到远程机器上。一旦SSH隧道创建,用户可以连到指定的本地端口号以访问网络服务。本地端口号不用与远地端口号一样。
SSH隧道提供一个绕过防火墙,从而连到某些被禁止的互联网服务的的方法。例如,一个组织可能会禁止用户不通过组织的代理服务器过滤器,而直接访问网页(端口号 80 ),用于监视或控视用户浏览网页。用户可能不希望让他们的网页流量被组织的代理服务器过滤器所监控或阻挡。如果用户能连到一个外部的 SSH 服务器,就有可能创建 SSH 通道,将某个本地端端口号连到远程网页服务器的端口号:80。要连到远程网页服务器,用户可以将他们的网页浏览器指到http://localhost/。
SSH支持动态端口发送,允许用户创建SOCKS代理服务器。用户可以设置他的应用程序去使用他们的区域SOCKS代理服务器。这比创建一个连到单一端口号的SSH隧道更有弹性。使用SOCKS,用户可以不被限制只能连到事先定义的端口号和服务器。
一个被防火墙阻挡的协议可被包在另一个没被防火墙阻挡的协议里,如HTTP。如果防火墙并没有排除此种包装,这技巧可用来逃避防火墙政策。隧道可按要求创建起一条与其他服务器的通信线路,届时使用 SSL 等加密手段进行通信。
另一种基于 HTTP 的穿隧方法使用超文本传输协议的 CONNECT 方法:
客户端提交 HTTP 的 CONNECT 命令给代理服务器,代理服务器会建一个 TCP 连线到特定的 服务器端口,并转送服务器端口和客户端连线之间的数据。因为这会制造安全漏洞,HTTP 代理服务器通常会限制 CONNECT 命令。通常只允许基于 TLS/SSL 的 HTTPS 服务。隧道本身不会去解析 HTTP 请求。也就是说,请求保持原样中转给之后的服务器。隧道本身是透明的,客户端不用在意隧道的存在。
将明文网络流量加密以在互联网上安全地传输。
本条目部分或全部内容出自以GFDL授权发布的《自由在线电脑词典》(FOLDOC)。