前置问题:

    A 内网服务器 (无法访问外网,可以访问B,无法访问C)

    B 外网服务器   (可以访问外网,无法访问A,可以访问C)

    C 第三方mysql数据库(外网)

需求:

    A 连接 C

跳板机一般用于异构网络间的中转站,比如对方在防火墙上只给你开放了一台服务器的权限,你无法访问对方局域网的其它主机,但你能访问的这台服务器则有权限访问其它主机。那么这台服务器就可以作为对方网络的跳板机,有时又被称为前置机。

python 跳板机代码中的本地ip是 window跳板机_服务器

Windows 系统自带的 IP Helper 服务具有端口转发的功能,这个功能可以用来作为跳板,通过跳板机来访问其它主机的服务。

在 cmd 中运行 services.msc 检查 IP Helper 服务是否启动,Windows 的端口转发是由该服务提供的。在 “IP Helper” 服务的属性中可以查看服务描述:

“ IP Helper 服务:使用 IPv6 转换技术(6to4、ISATAP、端口代理和 Teredo)和 IP-HTTPS 提供隧道连接。如果停止该服务,则计算机将不具备这些技术提供的增强连接优势。”

当停用此服务时,端口转发将不生效。可以使用 netstat -an -p tcp 检查本地监听状态。

netstat -an -p tcp| findstr LISTENING

命令行启动 'IP Helper'服务:

C:\> net start 'IP Helper'
IP Helper 服务正在启动 .
IP Helper 服务已经启动成功。

设置端口转发规则,示例:将远程主机 192.168.23.18 的 65530 端口映射到本地的 1111 端口

netsh interface portproxy add v4tov4 listenport=1111 connectaddress=192.168.23.18 connectport=65530

命令行说明:

netsh interface portproxy add v4tov4 /?
用法: add v4tov4 [listenport=]<integer>|<servicename>
            [connectaddress=]<IPv4 address>|<hostname>
            [[connectport=]<integer>|<servicename>]
            [[listenaddress=]<IPv4 address>|<hostname>]
            [[protocol=]tcp]
参数:
        标记            值
        listenport      - IPv4 侦听端口。
        connectaddress  - IPv4 连接地址。
        connectport     - IPv4 连接端口。
        listenaddress   - IPv4 侦听地址。
        protocol        - 使用的协议。现在只支持 TCP。

命令执行后,检查是否生效:

C:\> netsh interface portproxy show all

侦听 ipv4: 连接到 ipv4:地址 端口 地址 端口--------------- ---------- --------------- ----------* 1111 192.168.23.18 65530

可以看到远程主机的端口已经映射到了本地的1111端口,即可以直接访问跳板机的1111端口来间接访问目标主机。

此时配置已生效,具体是否已经在本地开启对应端口的监听,需要通过netstat 命令进行查看:

C:\> netstat -an -p tcp | findstr 1111
  TCP    0.0.0.0:1111           0.0.0.0:0              LISTENING

如果想导出配置,可以执行以下命令:

netsh interface portproxy dump > port.con

如果配置错误,想删掉重新配,可以执行以下命令:

netsh interface portproxy reset

可以执行 add 命令重新配,也可以修改导出的配置文件,通过还原命令导入之前的配置:

netsh -f port.conf

如果有多个端口需要映射,可以直接在配置文件中修改,然后重新导入配置即可:

C:\> netsh interface portproxy dump
#========================
# 端口代理配置
#========================
pushd interface portproxy
reset
add v4tov4 listenport=1111 connectaddress=192.168.23.18 connectport=65530
popd
# 端口代理配置结束

比如上面 dump 出来的配置,直接重定向到文本文件,在其中 add 命令处复制多行,把端口改掉然后重新导入。

python 跳板机代码中的本地ip是 window跳板机_网络_02

导入修改后的配置,效果如下:

python 跳板机代码中的本地ip是 window跳板机_python 跳板机代码中的本地ip是_03

从本地监听可以看到,本地的多个端口映射到了远程主机的同一个端口。这种将远程主机端口映射本地端口的**机制也被叫做正向代理,反之将本地端口映射到远程主机的模式叫反向代理。

正向代理一般用于做跳板机,而反向代理则常用于在防火墙上打洞。