linux端口转发两种方式:iptables,ssh
windows端口转发一种方式:netsh
Iptables
关键字:iptables(L3)
编辑/etc/sysctl.conf文件,将net.ipv4.ip_forward=1前面的#注释去掉,保存文件,然后执行sudo sysctl -p使其生效
法则:iptables -t 表名 指令 链名 描述 -j 动作
表名有filter;nat;mangle,默认为filter(可省略);
指令有-A(追加),-I(插入),-D(删除),-R(替换),-F,-N,-X,-E,-P,-Z,-L等;
链名有input(数据进入)、output(数据发出)、forward(数据转发);PREROUTING(目的地址转换)、POSTROUTING(原地址转换)、OUTPUT等;
描述有-s(原址),-d(目的址),-i(进口网卡),-o(出口网卡),-p(网络协议)。扩展匹配(调用iptables的模块,以便扩展iptables的匹配功能, -m);
动作有accept、drop、reject等;
示例:
iptables -P INPUT DROP;
iptables -A INPUT -d 192.168.0.100/32 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT;
iptables -A INPUT -m iprange --src-range 192.168.0.100-192.168.0.200 -p tcp --dport 23 -m state --state NEW -j ACCEPT;
iptables -A INPUT -s 192.168.0.100 -p tcp --dport 80 -m state --state NEW -m limit --limit 3/minute --limit-burst 5 -j ACCAPT;
iptables -I OUTPUT 1 -m string --algo kmp --string "magedu" -j REJECT;
把公网A机器端口P1映射为内网B机器端口P2:
iptables -P FORWARD ACCEPT
iptables -t nat -A PREROUTING -d [A公网地址] -p tcp -m tcp --dport [公网端口] -j DNAT --to-destination [B内网IP]:[B内网端口];
iptables -t nat -A POSTROUTING -d [B内网IP] -p tcp -m tcp --dport [B内网端口] -j SNAT --to-source [A内网地址];
iptables -A FORWARD -o [A内网网卡] -d [B内网IP] -p tcp --dport [B内网端口] -j ACCEPT;
iptables -A FORWARD -i [A内网网卡] -s [B内网IP] -p tcp –sport [B内网端口] -j ACCEPT;
SSH端口转发:
SSH端口转发的好处:
1. 利用SSH通道天然的加密特性
2. 通过具备访问权限的第三者,突破防火墙对自己的限制,或者隐身
角色定义:
A. 本地服务器,想通过中间服务器B间接访问目标服务器C
B. 中间服务器,类似于代理,A以B的名义去访问C
C. 目标服务器,C看到的都是中间服务器B在访问自己
1. 本地端口转发
命令ssh -Nf -L [local_A_address]:local_A_port:target_C_server:target_C_port via_B_server
参数:
-N,不执行命令
-f,后台执行
-L,local本地端口转发
local_A_address,127.0.0.1 - 默认,只能本机使用这个端口转发,也可以是本机的IP地址,同时其他人可以使用这个IP来使用这个端口转发
via_B_server,中间服务器
target_C_server,如果为 localhost 或127.0.0.1,则指向via_B_server
应用:
A---能访问------>B-------能访问------>C
A---不能访问----------------------------->C
A---通过本机端口,以B的名义访问-->C
关闭:
直接kill -9 建立的SSH连接,下同
2. 远程端口转发
命令ssh -Nf -R [local_A_address]:local_A_port:target_C_server:target_C_port local_A_address
参数:
-R,remote,远程端口转发
local_A_address,这个地址为A的IP
应用:
环境和目的与本地端口转发是一样的,这里只是不在本地服务器A上执行命令,而是在中间服务器B上执行;
为什么不直接在服务器A自己身上执行命令呢?这个场景有别于本地端口转发的地方在于A不能主动连接B但反之可以,比如A在外网,B在内网;
而A去访问的时候,同样都是通过自己的IP和端口,同样首先建立AB之间的SSH通道,以服务器B的名义来访问目标服务器C。
3. 动态端口转发
命令ssh -Nf -D [local_A_address]:local_A_port via_B_server
参数:
-D,dynamic,动态端口转发
应用:
本地和远程端口转发,都限定了目标服务器以及目标服务器的端口;
而动态端口转发,A把B作为了自己的全权代理,不限定目标服务器及其端口;
这里要求在A上,做下代理设置,比如浏览器的代理设定为自己的IP:PORT;
本地端口转发和远程端口转发,其实都可看着是动态端口转发(代理)的子集;
三者和一般代理的目的和场景都一致,区别在于这里自己A和代理服务器B之前的所有连接都是基于加密的SSH
状态(state):
NEW(第一次请求连接syn=1,ack=0)ESTABLISHED(已建立的连接syn=0,ack=1)INVALID(非法的连接)RELATED(相关连的连接)
Netsh端口转发(windows):
目前只支持tcp协议的端口转发,前提需要作为portproxy的主机需要安装IPV6,安装可以不启用IPV6。可以随时根据需要添加或删除端口转发条目,并且重启操作系统仍能自动保存之前的配置并自动启用。
配置方法
假定需要通过192.168.1.8的14941端口连接192.168.1.118的1494端口,则需要在192.168.1.8主机的命令行输入如下语句
---如果已经安装IPV6,该条语可以不需要
netsh interface ipv6 install
---可不用指定本地监听地址,这样可以通过操作系统提供浮动地址来实现,如果操作系统开启了主机防火墙,需要放行TCP 14941的入站连接
netsh interface portproxy add v4tov4 listenaddress=192.168.1.8 listenport=14941 connectaddress=192.168.1.118 connectport=1494
netsh interface portproxy add v4tov4 listenport=14941 connectaddress=192.168.1.118 connectport=1494
---取消上面配置的端口转发,可以用如下语句:
netsh interface portproxy delete v4tov4 listenaddress=192.168.1.8 listenport=33891
---如果想查看已经配置了哪些端口转发,可以用如下语句:
netsh interface portproxy show v4tov4