-
端口转发
2020-02-02 18:24:11端口转发是服务器A(地址:端口)将接收到的通信客户端C(地址:端口)完全转发给另一个服务器B(地址:端口),实现客户端C与服务器B的通信。可用于对服务器B隐藏客户端C的真实地址。端口转发也可应用于访问内网服务器(相当...简介
端口转发是服务器A(地址:端口)将接收到的通信客户端C(地址:端口)完全转发给另一个服务器B(地址:端口),实现客户端C与服务器B的通信。可用于对服务器B隐藏客户端C的真实地址。端口转发也可应用于访问内网服务器(相当于服务器B)。
实现端口转发
可以应用于以下两种情况:
- 当客户端C可以正向连接服务器A。
- 当客户端C无法正向连接服务器A,但服务器A可以反向连接客户端C。
情况1:正向连接
- 服务器A为windows系统
实验环境:
主机 ip 端口 Client(Kali) 192.168.246.136 \ ServerA(Win10) 192.168.246.130 8888 ServerB(win7) 192.168.246.131 6666 方法:使用netsh(windows自带),需要管理员权限进行配置。
步骤:- 在ServerA上以管理员身份运行cmd.exe
- 添加转发规则:
netsh interface portproxy add v4tov4 listenaddress=192.168.246.130 listenport=8888 connectaddress=192.168.246.131 connectport=6666
- 由于防火墙默认阻挡了入站通信,因此需要添加防火墙规则:
netsh advfirewall firewall add rule name="transmit" protocol=TCP dir=in localport=8888 action=allow
- 在ServerB上开启监听6666端口:
nc.exe -lvp 6666
- 在Client上连接ServerA的8888端口
nc 192.168.246.130 8888
ServerB监听到的是来自ServerA的连接
此处netsh可能常用到的命令:
查看端口转发规则:netsh interface portproxy show all 删除端口转发规则:netsh interface portproxy delete v4tov4 listenaddress=192.168.246.130 listenport=8888 查看防火墙规则:netsh advfirewall firewall name="transmit" 删除防火墙规则:netsh advfirewall firewall delete rule name="transmit"
更多命令可以使用
netsh -h
查看- 服务器A为Linux系统
实验环境:(交换Client和ServerA角色)
主机 ip 端口 Client(Win10) 192.168.246.130 \ ServerA(Kali) 192.168.246.136 8888 ServerB(win7) 192.168.246.131 6666 方法:使用iptables(Linux自带),也需要管理员权限。
步骤:- 切换root权限(su root)
- 添加转发规则,分别如下
目的地址转换规则:
iptables -t nat -A PREROUTING -p tcp -d 192.168.246.136 --dport 8888 -j DNAT --to-destination 192.168.246.131:6666
源地址转换规则:
powershell iptables -t nat -A POSTROUTING -p tcp -d 192.168.246.131 --dport 6666 -j SNAT --to-source 192.168.246.136
- 开启转发功能(将1写入到/proc/sys/net/ipv4目录下的ip_forward文件中,不修改的情况下是0):
echo 1 >/proc/sys/net/ipv4/ip_forward
- 在ServerB上开启监听6666端口:
nc.exe -lvp 6666
- 在Client上连接ServerA的8888端口
nc.exe 192.168.246.130 8888
ServerB监听到的是来自ServerA的连接
注:使用iptables配置的端口转发规则,在重启后都会失效,包括开启转发功能也会恢复到默认的0。
可以使用下面命令保存和恢复转发规则保存规则:iptables-save > xxxxx 恢复规则:iptables-restore < xxxx 注:保存和回复-之间没有空格; xxxx为保存的文件路径,例如/root/Desktop/rule,指的是/root/Desktop下的rule文件。
此处iptables可能常用到的命令:
查看转发规则:iptables -L -t nat --line-numbers 删除所有规则:iptables -F -t nat 删除指定规则:iptables -t nat -D PREROUTING 1(删除nat表的PREROUTING链的第一条规则)
更多命令可以使用
iptables -h
查看,或者参考这篇文章。情况2:反向连接
方法:使用EarthWorm,Linux和Windows使用方法相同。
实验环境:主机 ip 端口 Client(Win10) 192.168.246.130 6868 ServerA(Kali) 192.168.246.136 8888 ServerB(win7) 192.168.246.131 6666 步骤:
- 在Client上,监听6868端口,6868端口接收到的是反弹在8888端口上的:
ew_for_Win.exe -s lcx_listen -l 6868 -e 8888
- 在ServerA上,反弹给Client的8888端口的是ServerA连接在ServerB的6666端口的连接:
ew_for_linux64 -s lcx_slave -d 192.168.246.130 -e 8888 -f 192.168.246.131 -g 6666
Client上显示OK!
- 在ServerB上,监听6666端口:
nc64.exe -lvp 6666
- 在Client上,连接本地的6868端口:
nc.exe 127.0.0.1 6868
同样,ServerB监听到的是来自ServerA的连接
此处EarthWorm一些参数可以使用
-h
查看。 -
SSH端口转发,本地端口转发,远程端口转发,动态端口转发详解
2020-09-30 01:24:34本文为大家详细介绍了SSH端口转发,本地端口转发,远程端口转发,动态端口转发等相关知识 -
linux下用iptables做本机端口转发方法
2015-01-15 11:06:02一 :从一台机到另一台机端口转发 启用网卡转发功能 #echo 1 > /proc/sys/net/ipv4/ip_forward 举例:从192.168.0.132:21521(新端口)访问192.168.0.211:1521端口 a.同一端口转发 (192.168.0.132上开通1521端口...本文根据众多互联网博客内容整理后形成,引用内容的版权归原始作者所有,仅限于学习研究使用
拓扑图
下来一个一般情况下公司内网和外网的拓扑图
一、概要
1、防火墙分类
①包过滤防火墙(pack filtering)在网络层对数据包进行选择过滤,采用访问控制列表(Access control table-ACL)检查数据流的源地址,目的地址,源和目的端口,IP等信息。
②代理服务器型防火墙2、iptables基础
①规则(rules):网络管理员预定义的条件
②链(chains): 是数据包传播的路径
③表(tables):内置3个表filter表,nat表,mangle表分别用于实现包过滤网络地址转换和包重构的功能
④filter表是系统默认的,INPUT表(进入的包),FORWORD(转发的包),OUTPUT(处理本地生成的包),filter表只能对包进行授受和丢弃的操作。
⑤nat表(网络地址转换),PREROUTING(修改即将到来的数据包),OUTPUT(修改在路由之前本地生成的数据包),POSTROUTING(修改即将出去的数据包)
⑥mangle表,PREROUTING,OUTPUT,FORWORD,POSTROUTING,INPUT3、其它
iptables是按照顺序读取规则
防火墙规则的配置建议
Ⅰ 规则力求简单
Ⅱ 规则的顺序很重要
Ⅲ 尽量优化规则
Ⅳ 做好笔记二、配置
1、iptables命令格式
iptables [-t 表] -命令 匹配 操作 (大小写敏感)
动作选项
ACCEPT 接收数据包
DROP 丢弃数据包
REDIRECT 将数据包重新转向到本机或另一台主机的某一个端口,通常功能实现透明代理或对外开放内网的某些服务
SNAT 源地址转换
DNAT 目的地址转换
MASQUERADE IP伪装
LOG 日志功能2、定义规则
①先拒绝所有的数据包,然后再允许需要的数据包
iptalbes -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
②查看nat表所有链的规则列表
iptables -t nat -L
③增加,插入,删除和替换规则
iptables [-t 表名] <-A|I|D|R> 链名 [规则编号] [-i|o 网卡名称] [-p 协议类型] [-s 源ip|源子网] [--sport 源端口号] [-d 目的IP|目标子网] [--dport 目标端口号] [-j 动作]
参数:-A 增加
-I 插入
-D 删除
-R 替换
三、例子
①iptables -t filter -A INPUT -s 192.168.1.5 -i eth0 -j DROP
禁止IP为192.168.1.5的主机从eth0访问本机②iptables -t filter -I INPUT 2 -s 192.168.5.0/24 -p tcp --dport 80 -j DROP
禁止子网192.168.5.0访问web服务③iptables -t filter -I INPUT 2 -s 192.168.7.9 -p tcp --dport ftp -j DROP
禁止IP为192.168.7.9访问FTP服务
④iptables -t filter -L INPUT
查看filter表中INPUT链的规则
⑤iptables -t nat -F
删除nat表中的所有规则
⑥iptables -I FORWARD -d wwww.playboy.com -j DROP
禁止访问www.playboy.com网站
⑦iptables -I FORWARD -s 192.168.5.23 -j DROP
禁止192.168.5.23上网下面详细介绍一下iptables的配置
一 :从一台机到另一台机端口转发
启用网卡转发功能
#echo 1 > /proc/sys/net/ipv4/ip_forward
举例:从192.168.0.132:21521(新端口)访问192.168.0.211:1521端口
a.同一端口转发(192.168.0.132上开通1521端口访问 iptables -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 1521 -j ACCEPT)
iptables -t nat -I PREROUTING -p tcp --dport 1521 -j DNAT --to 192.168.0.211
iptables -t nat -I POSTROUTING -p tcp --dport 1521 -j MASQUERADE
b.不同端口转发(192.168.0.132上开通21521端口访问 iptables -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21521 -j ACCEPT)
iptables -t nat -A PREROUTING -p tcp -m tcp --dport21521 -j DNAT --to-destination192.168.0.211:1521
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -d 192.168.0.211 -p tcp -m tcp --dport 1521 -j SNAT --to-source 192.168.0.132
以上两条等价配置(更简单[指定网卡]):
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 31521 -j DNAT --to 192.168.0.211:1521
iptables -t nat -A POSTROUTING -j MASQUERADE
保存iptables
#service iptables save
#service iptables restart
二 用iptables做本机端口转发
代码如下:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
估计适当增加其它的参数也可以做不同IP的端口转发。
如果需要本机也可以访问,则需要配置OUTPUT链(********特别注意:本机访问外网的端口会转发到本地,导致访不到外网,如访问yown.com,实际上是访问到本地,建议不做80端口的转发或者指定目的 -d localhost):
iptables -t nat -A OUTPUT -d localhost -p tcp --dport 80 -j REDIRECT --to-ports 8080
原因:
外网访问需要经过PREROUTING链,但是localhost不经过该链,因此需要用OUTPUT。例子1:
概述:
有一些核心MYSQL服务器位于核心机房的内网段,经常需要去连接这些服务器,因无法直接通过外网访问,给管理造成了不便。
思路:虽然解决此问题的方法及思路有很多,但当下想使用IPTABLES的端口重定向功能解决此问题,比较简单易用,而且扩展性也比较好,依次类推,可以运用到其他的端口转发方面的应用。
网络环境:
公网服务器 :eth0:公网IP eth1:内网IP - 192.168.1.1
MYSQL服务器:eth1:内网IP - 192.168.1.2
实现方法:通过访问公网IP的63306端口来实现到内网MYSQL服务器的3306端口的访问
在公网服务器上:
配置脚本:
iptables -t nat -A PREROUTING -p tcp --dport 63306 -j DNAT --to-destination 192.168.1.2:3306
iptables -t nat -A POSTROUTING -d 192.168.1.2 -p tcp --dport 3306 -j SNAT --to 192.168.1.1允许服务器的IP转发功能:
echo 1 > /proc/sys/net/ipv4/ip_forward
使用方法:
mysql -h 公网IP -p 63306 -uroot -p例子2:
由于业务需要,服务器越来越多,内网服务器无外网环境管理甚是不便,所以折腾了一下外网到内网的端口转发以达到轻松管理的目的,贴一下心得。
S1:
eth0 10.0.0.1
eth1 x.x.x.x
S2:
eth0 10.0.0.2
S1 8082端口转发到内网机器22端口
iptables规则配置如下:
iptables -t nat -A PREROUTING -d x.x.x.x -p tcp --dport 8082 -j DNAT --to-destination 10.0.0.2:22
iptables -t nat -A POSTROUTING -d 10.0.0.2 -p tcp --dport 22 -j SNAT --to-source x.x.x.x说明:
iptables -t nat -A PREROUTING -d "对外公网ip" -p tcp --dport "对外端口" -j DNAT --to "内部实际提供服务的ip":"实际提供服务的端口"
iptables -t nat -A POSTROUTING -d "内部实际提供服务的ip"-p tcp --dport "实际提供服务的端口" -j SNAT --to-source "运行iptables机器的内网ip"另外,网上看到一篇很好的文章,这里转发一下:https://icewing.cc/post/25-iptables-policy.html
25个最常用的iptables策略
1、清空存在的策略
当你开始创建新的策略,你可能想清除所有的默认策略,和存在的策略,可以这么做:
iptables -F 或者iptables –flush
2、设置默认策略
默认链策略是ACCEPT,改变所有的链策略为DROP:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
3、阻止一个指定的ip
BLOCK_THIS_IP=“x.x.x.x"
iptables -A INPUT -s ”$BLOCK_THIS_IP“ -j DROP
iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP
iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP
4、允许SSH
允许所有通过eth0接口使用ssh协议连接本机:
iptables -A INPUT -i eth0 -p tcp -dport 22 -m state -state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -sport 22 -m state -state ESTABLISHED -j ACCEPT
5、允许某个网段通过ssh连接
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 –dport 22 -m state -state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -sport 22 -m state –state ESTABLISHED -j ACCEPT
6、允许SSH连接指定的网段
iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 -dport 22 -m state -state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -sport 22 -m state -state ESTABLISHED -j ACCEPT
7、允许http和https
允许所有进来的web流量:http协议80端口,https协议是443端口
iptables -A INPUT -i eth0 -p tcp -dport 80 -m state -state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -sport 80 -m state -state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -dport 443 -m state -state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -sport 443 -m state -state ESTABLISHED -j ACCEPT
8、多个策略联合一起
允许ssh,http,https:
iptables -A INPUT -i eth0 -p tcp -m multiport -dports 22,80,443 -m state -state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport -sports 22,80,443 -m state -state ESTABLISHED -j ACCEPT
9、允许SSH连接其他主机
iptables -A OUTPUT -o eth0 -p tcp -dport 22 -m state -state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -sport 22 -m state -state ESTABLISHED -j ACCEPT
10、允许https出去
iptables -A OUTPUT -o eth0 -p tcp -dport 443 -m state -state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -sport 443 -m state -state ESTABLISHED -j ACCEPT
11、对web请求做负载均衡(每三个包,均衡到指定服务器,需要扩展iptables)
iptables -A PREROUTING -i eth0 -p tcp –dport 443 -m state -state NEW -m nth -counter 0 -every 3 -packet 0 -j DNAT -to-destination 192.168.1.101:443
iptables -A PREROUTING -i eth0 -p tcp –dport 443 -m state -state NEW -m nth -counter 0 -every 3 -packet 1 -j DNAT -to-destination 192.168.1.102:443
iptables -A PREROUTING -i eth0 -p tcp –dport 443 -m state -state NEW -m nth -counter 0 -every 3 -packet 2 -j DNAT -to-destination 192.168.1.103:443
12、允许ping
iptables -A INPUT -p icmp -icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp -icmp-type echo-reply -j ACCEPT
13、允许ping远程
iptables -A OUTPUT -p icmp -icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp -icmp-type echo-reply -j ACCEPT
14、允许本地回环
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
15、允许内网访问外部网络
这个例子eth1 连接外部网络,eth0连接内部网络
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
16、允许DNS出去
iptables -A OUTPUT -p udp -o eth0 -dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 -sport 53 -j ACCEPT
17、允许NIS连接
NIS端口是动态的,当ypbind启动时它分配端口。
首先运行 rpcinfo -p 显示得到端口号,这个例子使用端口850,853。
iptables -A INPUT -p tcp -dport 111 -j ACCEPT
iptables -A INPUT -p udp -dport 111 -j ACCEPT
iptables -A INPUT -p tcp -dport 853 -j ACCEPT
iptables -A INPUT -p udp -dport 853 -j ACCEPT
iptables -A INPUT -p tcp -dport 850 -j ACCEPT
iptables -A INPUT -p udp -dport 850 -j ACCEPT
上面的例子当ypbind重新启动时将失效,有2种解决方案:
(1) 分配nis服务静态ip
(2) 使用精妙的脚本
18、允许指定网段连接Rsync
iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 -dport 873 -m state -state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -sport 873 -m state -state ESTABLISHED -j ACCEPT
19、允许mysql从指定的网段连接
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 -dport 3306 -m state -state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -sport 3306 -m state -state ESTABLISHED -j ACCEPT
20、允许sendmail或者postfix
iptables -A INPUT -i eth0 -p tcp -dport 25 -m state -state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -sport 25 -m state -state ESTABLISHED -j ACCEPT
21、允许IMAP和IMAPS
iptables -A INPUT -i eth0 -p tcp -dport 143 -m state -state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -sport 143 -m state -state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -dport 993 -m state -state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -sport 993 -m state -state ESTABLISHED -j ACCEPT
22、允许POP3和POP3S
iptables -A INPUT -i eth0 -p tcp -dport 110 -m state -state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -sport 110 -m state -state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -dport 995 -m state -state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -sport 995 -m state -state ESTABLISHED -j ACCEPT
23、预防DDOS攻击
iptables -A INPUT -p tcp -dport 80 -m limit -limit 25/minute -limit-burst 100 -j ACCEPT
-m :使用iptables扩展
–limit 25/minute : 限制分钟连接请求数
–limit-burst:触发阀值,一次涌入数据包数量
24、端口转发
来自442的都转到22端口
iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 -dport 422 -j DNAT -to 192.168.102.37:22
你还必须明确允许442端口
iptables -A INPUT -i eth0 -p tcp -dport 422 -m state -state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -sport 422 -m state -state ESTABLISHED -j ACCEPT
25、包丢弃日志
你也许想查看所有丢弃包的日志。首先创建一个新链叫 LOGGING
iptables -N LOGGING
确保所有的连接跳到LOGGING
iptables -A INPUT -j LOGGING
记录这些包通过自定义名字 "log-prefix"
iptables -A LOGGING -m limit -limit 2/min -j LOG -log-prefix "IPTables Packet Dropped:" -log-level 7
最后丢弃这些数据包
iptables -A LOGGING -j DROP
参考
https://icewing.cc/post/25-iptables-policy.html
https://www.jianshu.com/p/fd0e5ce233a7
请我喝咖啡
如果觉得文章写得不错,能对你有帮助,可以扫描我的微信二维码请我喝咖啡哦~~哈哈~~
-
c++端口转发工具,c++端口转发工具
2020-11-14 16:43:34c++端口转发工具,vs2010编写,可以实现自定义端口转发至另一个自定义端口。 c++端口转发工具,vs2010编写,可以实现自定义端口转发至另一个自定义端口。 -
nginx实现ip端口转发_window端口转发端口映射nginx实现端口转发
2020-12-28 23:50:56Windows下端口转发,以实现远程端口3389为例场景如下先说明一下场景,服务器A处于局域网环境内,IP为192.168.1.200(同时作为虚拟机B的网关192.168.137.1),服务器A中安装有不同网段的虚拟机B,IP为192.168.137.2。...Windows下端口转发,以实现远程端口3389为例
场景如下
先说明一下场景,服务器A处于局域网环境内,IP为192.168.1.200(同时作为虚拟机B的网关192.168.137.1),服务器A中安装有不同网段的虚拟机B,IP为192.168.137.2。A可实现对B的远程,但A同网段的其他机器无法ping通B
开始实现
方式一:CMD Windows端口转发
在服务器A执行如下CMD命令,建立端口转发规则192.168.1.200:13389 ==> 192.168.137.2:3389
netsh interface portproxy add v4tov4 listenaddress=192.168.1.200 listenport=13389 connectaddress=192.168.137.2 connectport=3389
执行完毕,可通过远程访问192.168.1.200:13389实现对192.168.137.2的远程访问。
与此同时
查看本机添加的所有规则
netsh interface portproxy show all
删除指定规则
netsh interface portproxy delete v4tov4 listenaddress=192.168.1.200 listenport=13389
方式二:NGINX实现端口转发
在服务器配置NGINX,配置文件添加如下配置项:
stream {
upstream mstsc {
server 192.168.137.2:3389;
}
server {
listen 33389;
proxy_pass mstsc;
}
}
启动NGINX后,可通过远程访问192.168.1.200:33389实现对192.168.137.2的远程访问。
-
[精]详解SSH端口转发,本地端口转发、远程端口转发、动态端口转发
2016-03-19 00:23:04通过本文的介绍,读者可以从中了解到如何应用 SSH 端口转发机制来解决日常工作 / 生活中的一些问题。学会在非安全环境下使用端口转发来加密网络应用,保护个人隐私以及重要商业信息。同时也能够用此技术解决工作中...第一部分 概述
当你在咖啡馆享受免费 WiFi 的时候,有没有想到可能有人正在窃取你的密码及隐私信息?当你发现实验室的防火墙阻止了你的网络应用端口,是不是有苦难言?来看看 SSH 的端口转发功能能给我们带来什么好处吧!
端口转发概述
让我们先来了解一下端口转发的概念吧。我们知道,SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还同时提供了一个非常有用的功能,这就是端口转发。它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程有时也被叫做“隧道”(tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果您工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,那么也是能够通过将 TCP 端口转发来使用 SSH 进行通讯。总的来说 SSH 端口转发能够提供两大功能:
- 加密 SSH Client 端至 SSH Server 端之间的通讯数据。
- 突破防火墙的限制完成一些之前无法建立的 TCP 连接。
图 1. SSH 端口转发
如上图所示,使用了端口转发之后,TCP 端口 A 与 B 之间现在并不直接通讯,而是转发到了 SSH 客户端及服务端来通讯,从而自动实现了数据加密并同时绕过了防火墙的限制。
第二部分 本地转发与远程转发
本地转发实例分析
我们先来看第一个例子,在实验室里有一台 LDAP 服务器(LdapServerHost),但是限制了只有本机上部署的应用才能直接连接此 LDAP 服务器。如果我们由于调试或者测试的需要想临时从远程机器(LdapClientHost)直接连接到这个 LDAP 服务器 , 有什么方法能够实现呢?
答案无疑是本地端口转发了,它的命令格式是:
ssh -L <local port>:<remote host>:<remote port> <SSH hostname>
在 LdapClientHost 上执行如下命令即可建立一个 SSH 的本地端口转发,例如:
$ ssh -L 7001:localhost:389 LdapServerHost
图 2. 本地端口转发
这里需要注意的是本例中我们选择了 7001 端口作为本地的监听端口,在选择端口号时要注意非管理员帐号是无权绑定 1-1023 端口的,所以一般是选用一个 1024-65535 之间的并且尚未使用的端口号即可。
然后我们可以将远程机器(LdapClientHost)上的应用直接配置到本机的 7001 端口上(而不是 LDAP 服务器的 389 端口上)。之后的数据流将会是下面这个样子:
- 我们在 LdapClientHost 上的应用将数据发送到本机的 7001 端口上,
- 而本机的 SSH Client 会将 7001 端口收到的数据加密并转发到 LdapServertHost 的 SSH Server 上。
- SSH Server 会解密收到的数据并将之转发到监听的 LDAP 389 端口上,
- 最后再将从 LDAP 返回的数据原路返回以完成整个流程。
我们可以看到,这整个流程应用并没有直接连接 LDAP 服务器,而是连接到了本地的一个监听端口,但是 SSH 端口转发完成了剩下的所有事情,加密,转发,解密,通讯。
这里有几个地方需要注意:
- SSH 端口转发是通过 SSH 连接建立起来的,我们必须保持这个 SSH 连接以使端口转发保持生效。一旦关闭了此连接,相应的端口转发也会随之关闭。
- 我们只能在建立 SSH 连接的同时创建端口转发,而不能给一个已经存在的 SSH 连接增加端口转发。
- 你可能会疑惑上面命令中的 <remote host> 为什么用 localhost,它指向的是哪台机器呢?在本例中,它指向 LdapServertHost 。我们为什么用 localhost 而不是 IP 地址或者主机名呢?其实这个取决于我们之前是如何限制 LDAP 只有本机才能访问。如果只允许 lookback 接口访问的话,那么自然就只有 localhost 或者 IP 为 127.0.0.1 才能访问了,而不能用真实 IP 或者主机名。
- 命令中的 <remote host> 和 <SSH hostname> 必须是同一台机器么?其实是不一定的,它们可以是两台不同的机器。我们在后面的例子里会详细阐述这点。
- 好了,我们已经在 LdapClientHost 建立了端口转发,那么这个端口转发可以被其他机器使用么?比如能否新增加一台 LdapClientHost2 来直接连接 LdapClientHost 的 7001 端口?答案是不行的,在主流 SSH 实现中,本地端口转发绑定的是 lookback 接口,这意味着只有 localhost 或者 127.0.0.1 才能使用本机的端口转发 , 其他机器发起的连接只会得到“ connection refused. ”。好在 SSH 同时提供了 GatewayPorts 关键字,我们可以通过指定它与其他机器共享这个本地端口转发。
ssh -g -L <local port>:<remote host>:<remote port> <SSH hostname>
远程转发实例分析
我们来看第二个例子,这次假设由于网络或防火墙的原因我们不能用 SSH 直接从 LdapClientHost 连接到 LDAP 服务器(LdapServertHost),但是反向连接却是被允许的。那此时我们的选择自然就是远程端口转发了。
它的命令格式是:
ssh -R <local port>:<remote host>:<remote port> <SSH hostname>
例如在 LDAP 服务器(LdapServertHost)端执行如下命令:
$ ssh -R 7001:localhost:389 LdapClientHost
图 3. 远程端口转发
和本地端口转发相比,这次的图里,SSH Server 和 SSH Client 的位置对调了一下,但是数据流依然是一样的。我们在 LdapClientHost 上的应用将数据发送到本机的 7001 端口上,而本机的 SSH Server 会将 7001 端口收到的数据加密并转发到 LdapServertHost 的 SSH Client 上。 SSH Client 会解密收到的数据并将之转发到监听的 LDAP 389 端口上,最后再将从 LDAP 返回的数据原路返回以完成整个流程。
看到这里,你是不是会有点糊涂了么?为什么叫本地转发,而有时又叫远程转发?这两者有什么区别?
本地转发与远程转发的对比与分析
不错,SSH Server,SSH Client,LdapServertHost,LdapClientHost,本地转发,远程转发,这么多的名词的确容易让人糊涂。让我们来分析一下其中的结构吧。首先,SSH 端口转发自然需要 SSH 连接,而 SSH 连接是有方向的,从 SSH Client 到 SSH Server 。而我们的应用也是有方向的,比如需要连接 LDAP Server 时,LDAP Server 自然就是 Server 端,我们应用连接的方向也是从应用的 Client 端连接到应用的 Server 端。如果这两个连接的方向一致,那我们就说它是本地转发。而如果两个方向不一致,我们就说它是远程转发。
我们可以回忆上面的两个例子来做个对照。
本地转发时:
LdapClientHost 同时是应用的客户端,也是 SSH Client,这两个连接都从它指向 LdapServertHost(既是 LDAP 服务端,也是 SSH Server)。
远程转发时:
LdapClientHost 是应用的客户端,但却是 SSH Server ;而 LdapServertHost 是 LDAP 的服务端,但却是 SSH Client 。这样两个连接的方向刚好相反。
另一个方便记忆的方法是,Server 端的端口都是预定义的固定端口(SSH Server 的端口 22,LDAP 的端口 389),而 Client 端的端口都是动态可供我们选择的端口(如上述例子中选用的 7001 端口)。如果 Server 端的两个端口都在同一台机器,Client 端的两个端口都在另一台机器上,那么这就是本地连接;如果这四个端口交叉分布在两个机器上,每台机器各有一个 Server 端端口,一个 Client 端端口,那就是远程连接。
弄清楚了两者的区别之后,再来看看两者的相同之处。如果你所在的环境下,既允许 LdapClientHost 发起 SSH 连接到 LdapServerHost,也允许 LdapServerHost 发起 SSH 连接到 LdapClientHost 。那么这时我们选择本地转发或远程转发都是可以的,能完成一样的功能。
接着让我们来看个进阶版的端口转发。我们之前涉及到的各种连接 / 转发都只涉及到了两台机器,还记得我们在本地转发中提到的一个问题么?本地转发命令中的 <remote host> 和 <SSH hostname> 可以是不同的机器么?
ssh -L <local port>:<remote host>:<remote port> <SSH hostname>
答案是可以的!让我们来看一个涉及到四台机器 (A,B,C,D) 的例子。
图 4. 多主机转发应用
在 SSH Client(C) 执行下列命令来建立 SSH 连接以及端口转发:
$ ssh -g -L 7001:<B>:389 <D>
然后在我们的应用客户端(A)上配置连接机器(C )的 7001 端口即可。注意我们在命令中指定了“ -g ”参数以保证机器(A)能够使用机器(C)建立的本地端口转发。而另一个值得注意的地方是,在上述连接中,(A)<-> (C) 以及 (B)<->(D) 之间的连接并不是安全连接,它们之间没有经过 SSH 的加密及解密。如果他们之间的网络并不是值得信赖的网络连接,我们就需要谨慎使用这种连接方式了。
第三部分 其他类型的转发
动态转发实例分析
恩,动态转发,听上去很酷。当你看到这里时,有没有想过我们已经讨论过了本地转发,远程转发,但是前提都是要求有一个固定的应用服务端的端口号,例如前面例子中的 LDAP 服务端的 389 端口。那如果没有这个端口号怎么办?等等,什么样的应用会没有这个端口号呢?嗯,比如说用浏览器进行 Web 浏览,比如说 MSN 等等。
当我们在一个不安全的 WiFi 环境下上网,用 SSH 动态转发来保护我们的网页浏览及 MSN 信息无疑是十分必要的。让我们先来看一下动态转发的命令格式:
$ ssh -D <local port> <SSH Server>
例如:
$ ssh -D 7001 <SSH Server>
图 5. 动态端口转发
似乎很简单,我们依然选择了 7001 作为本地的端口号,其实在这里 SSH 是创建了一个 SOCKS 代理服务。来看看帮助文档中对 -D 参数的描述:
-D port This works by allocating a socket to listen to port on the local side, and whenever a connection is made to this port, the con- nection is forwarded over the secure channel, and the applica- tion protocol is then used to determine where to connect to from the remote machine. Currently the SOCKS4 and SOCKS5 protocols are supported, and ssh will act as a SOCKS server. Only root can forward privileged ports. Dynamic port forwardings can also be specified in the configuration file.
之后的使用就简单了,我们可以直接使用 localhost:7001 来作为正常的 SOCKS 代理来使用,直接在浏览器或 MSN 上设置即可。在 SSH Client 端无法访问的网站现在也都可以正常浏览。而这里需要值得注意的是,此时 SSH 所包护的范围只包括从浏览器端(SSH Client 端)到 SSH Server 端的连接,并不包含从 SSH Server 端 到目标网站的连接。如果后半截连接的安全不能得到充分的保证的话,这种方式仍不是合适的解决方案。
X 协议转发实例分析
好了,让我们来看最后一个例子 - X 协议转发。
我们日常工作当中,可能会经常会远程登录到 Linux/Unix/Solaris/HP 等机器上去做一些开发或者维护,也经常需要以 GUI 方式运行一些程序,比如要求图形化界面来安装 DB2/WebSphere 等等。这时候通常有两种选择来实现:VNC 或者 X 窗口,让我们来看看后者。
使用 X 窗口通常需要分别安装:X Client 和 X Server 。在本例中我们的 X Client 就是所访问的远程 Linux/Unix/Solaris/HP,而我们的 X Server 则是发起访问的本地机器(例如你面前正在使用的笔记本或台式机)。把 X Client 端的 X 窗口显示在 X Server 端需要先行在 X Client 端指定 X Server 的位置,命令格式如下:
export DISPLAY=<X Server IP>:<display #>.<virtual #>
例如:
export DISPLAY=myDesktop:1.0
然后直接运行 X 应用即可,X 窗口就会自动在我们的本地端打开。
一切运行正常,但是,这时候 IT 部门突然在远程 Linux/Unix/Solaris/HP 前面加了一道防火墙。非常不幸的是,X 协议并不在允许通过的列表之内。怎么办?只能使用 VNC 了么?不,其实只要使用了 SSH 端口转发即可通过,同时也对 X 通讯数据做了加密,真是一举两得。(当然,使用此方法前最好先咨询相关 IT 部门是否符合相应的安全条例,以免造成违规操作。)
建立命令也很简单,直接从本地机器(X Server 端)发起一个如下的 SSH 连接即可:
$ ssh -X <SSH Server>
图 5. X 转发
建立连接之后就可以直接运行远程的 X 应用。注意建立 X 转发之后会自动设置 DISPLAY 环境变量,通常会被设置成
localhost:10.0
,我们无需也不应该在连接之后再进行修改此环境变量。一个比较常见的场景是,我们的本地机器是 Windows 操作系统,这时可以选择开源的 XMing 来作为我们的 XServer,而 SSH Client 则可以任意选择了,例如 PuTTY,Cygwin 均可以配置 访问 SSH 的同时建立 X 转发。
第四部分 总结
至此,我们已经完成了本地端口转发,远程端口转发,动态端口转发以及 X 转发的介绍。回顾起来,总的思路是通过将 TCP 连接转发到 SSH 通道上以解决数据加密以及突破防火墙的种种限制。对一些已知端口号的应用,例如 Telnet/LDAP/SMTP,我们可以使用本地端口转发或者远程端口转发来达到目的。动态端口转发则可以实现 SOCKS 代理从而加密以及突破防火墙对 Web 浏览的限制。对于 X 应用,无疑是 X 转发最为适用了。虽然每一部分我们都只是简单的介绍了一下,但如果能灵活应用这些技巧,相信对我们的日常生活 / 工作也是会有所帮助的。
-
iptables 端口转发
2018-08-22 17:32:24ssh 也能实现本机的端口转发,只不过原来的 1 条连接会变成 3 条。详情见前一篇 ssh 端口转发博文。而 iptables 的端口转发则是在内核进行。 1、将本地的端口转发到本机端口 将本机的 7777 端口转发到 6666 端口。... -
端口转发和端口映射
2018-11-27 08:27:16端口转发和端口映射 两者的区别 端口转发和端口映射 介绍端口转发和端口映射之前先了解两个概念:正向连接和反向连接 正向连接:你的机器连接目标机器 反向连接:目标机器反连你的机器 端口映射:端口映射就是... -
端口转发工具_Lcx 简单端口转发
2020-12-14 11:42:03端口转发(Port forwarding),有时被叫做隧道,是安全壳(SSH) 为网络安全通信使用的一种方法。端口转发是转发一个网络端口从一个网络节点到另一个网络节点的行为,其使一个外部用户从外部经过一个被激活的NAT路由器... -
mysql端口转发_SSH做MySQL端口转发
2021-01-18 22:57:53linux下的ssh连结命令实现的端口转发功能,在讲解端口转发前我们先了解下ssh命令的参数:-f 后台认证用户/密码,通常和-N连用,不用登录到远程主机;-p 被登录的ssd服务器的sshd服务端口;-L 本地机(客户机)的某个端口... -
mysql 端口转发_SSH做MySQL端口转发
2021-01-20 20:37:59linux下的ssh连结命令实现的端口转发功能,在讲解端口转发前我们先了解下ssh命令的参数:-f 后台认证用户/密码,通常和-N连用,不用登录到远程主机;-p 被登录的ssd服务器的sshd服务端口;-L 本地机(客户机)的某个端口... -
图解端口映射、本地端口转发、远程端口转发
2016-11-28 19:40:14http://letus.cc/archives/138 端口映射 本地端口转发 远程端口转发 -
portfwd端口转发,listen端口转发
2018-05-22 20:31:37连接上meterpreter后,利用portfwd进行端口转发portfwd add -l 7891 -p 3389 -r 192.168.43.41-l 7891 转发到本地的1234端口-p 3389 转发目标机的3389-r 192.68.43.41 目标机ip输入portfwd,查看是否转发成功... -
端口转发 kali端口转发到物理机
2018-08-05 22:52:06工作中遇到kali只能nat,进而尝试kali端口映射到物理机获取shell ...端口转发的设置也可以通过命令行还进行查看 netsh interface portproxy dump netsh interface portproxy show all 转发本地的555... -
Nginx 实现端口转发
2019-06-02 15:53:06什么是端口转发 当我们在服务器上搭建一个图书以及一个电影的应用,其中图书应用启动了 8001 端口,电影应用启动了 8002 端口。此时如果我们可以通过 localhost:8001 //图书 localhost:8002 //电影 访问,但我们... -
Linux系列——VMware虚拟机配置端口转发(端口映射),实现远程访问
2018-02-01 19:45:57前言 本文所写的远程为各个电脑在同一个网段内 本文主要详细介绍如何远程访问虚拟机里面的项目! 机器:虚拟机(装在电脑1里)、电脑1(宿...step3:添加一个端口转发 主机端口:随便选取一个宿主机没有被占用... -
端口映射与端口转发
2020-03-04 10:31:46端口转发&端口映射 01 什么是端口转发 端口转发(Port forwarding),有时被叫做隧道,是安全壳(SSH)为网络安全通信使用的一种方法。端口转发是转发一个网络端口从一个网络节点到另一个网络节点的行为,其使一... -
python基于socket进行端口转发实现后门隐藏
2018-10-09 20:29:33python基于socket进行端口转发实现后门隐藏 思想: 用户正常浏览器访问请求通过8080端口,请求若为http请求,则正常转发到80端口保证网站正常运行。否则转发到8888端口执行系统命令。 8888端口监听代码: #!/usr/bin... -
ssh 端口转发
2020-12-21 14:14:53SSH 端口转发 ssh 常用命令参数 ssh root@192.168.1.1 -C:压缩传输,提高传输速度 -f:将ssh 传输转入后台执行,不占用当前的Shell -N:建立静默链接(建立了链接,但是看不到具体会话) -g:允许远程主机链接... -
kali端口转发实现渗透互联网安卓设备(端口转发和端口映射的区别)
2020-02-14 13:28:05这时候就需要进行端口转发了 一,端口转发和端口映射的区别 端口转发: 将本机被访问的端口转为访问另外一个机器的端口,即访问公网端口->访问内网端口 端口映射: 将内网某个端口隐射到公网,即访问公网的这个... -
nginx实现ip端口转发_Nginx 实现端口转发
2020-12-28 23:50:56什么是端口转发当我们在服务器上搭建一个图书以及一个电影的应用,其中图书应用启动了 8001 端口,电影应用启动了 8002 端口。此时如果我们可以通过localhost:8001 //图书localhost:8002 //电影但我们一般访问应用的... -
Linux 端口转发 端口映射
2017-06-13 11:13:10摘要:端口转发也称端口映射,基本使用的有两种方式,本机端口转发,跨IP端口转发。 本机端口转发 应用场景:我要搭建一台Linux server,使用tomcat作为web容器,让别人维护web项目的发布,这时候会给他们一个...
-
2021-02-26
-
java单链表的基础知识
-
CsLiB
-
高中地理湘教版必修二人口迁移.docx
-
盖茨比博客-源码
-
python format格式化输出
-
2021-02-26
-
ajax跨域问题
-
井字游戏-源码
-
想去大厂吗? 跟我一起刷题吧!
-
MySQL NDB Cluster 负载均衡和高可用集群
-
MySQL 高可用工具 heartbeat 实战部署详解
-
JMETER 性能测试基础课程
-
LeetCode:实现最大堆
-
高中地理湘教版必修一水循环.docx
-
分享一个自己做的简易敏捷开发管理工具——AgileLite
-
MySQL 管理利器 mysql-utilities
-
激光熔敷PdCuSi合金非晶涂层的研究
-
Steam-Dataset-Data-Science:对从Steam网站抓取的包含视频游戏信息的数据集进行分析,数据清理,功能工程和统计测试。 创建了多个线性回归,SVM和随机森林机器学习模型,以尝试预测游戏的评分-源码
-
MySQL你该了解的那些事【服务端篇】