基于linux端口转发

自带工具

前置条件:root权限
优点:基于内核转发,不同于ssh转发,无需新建链路
1. 开启iptables端口转发:

### 1.以下两种方法都可
echo /proc/sys/net/ipv4/ip_forward > 1
sysctl -w net.ipv4.ip_forward
### 2.修改net.ipv4.ip_forward = 1 此操作主要是设置开启启动 跳过也可
vim /etc/sysctl.conf

2. 添加转发规则

0x01 转发本地

#将7777端口流量以tcp形式转发到6666端口
iptables -t nat -A PREROUTING -p tcp --dport 7777 -j REDIRECT --to-port 6666
#下面这种也可以
iptables -t nat -A PREROUTING -p tcp --dport 7777 -j DNAT --to-destination [nat_ip]:6666
#打开iptables的NAT功能
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
查看转发规则

本地未开启链路监听
本地未监听端口

同样未开启

开启转发的机器使用ncat监听6666流量并将转发bash命令,在另一台机器上使用nc请求7777端口,成功建立连接并执行命令
7777转发给6666成功

建立连接的端口有所区别
远程
其他机器连接端口为7777

本地
本地连接端口为6666

0x02 作为路由转发其他

转发示意图

本地添加两条转发规则

iptables -t nat -A PREROUTING -p tcp --dport 6666 -j DNAT --to-destination 10.211.55.4:7777
iptables -t nat -A POSTROUTING -p tcp --d 10.211.55.4 --dport 7777 -j SNAT --to-source 10.211.55.3
规则表 配置表 转发成功

实测填写本地ip转发失败,可能是因为使用的不是一个网络出口?

0.0.0.0和127.0.0.1转发失败

由于是内核转发,使用ss看不到任何链接

没有转发链路

未填写转发端口的情况:
慎用!将转发对应端口的流量,来什么转什么,也就是说,退出了ssh后就连不上了…

全流量转发 连不上,怎么想都连不上吧

0x03 端口复用

自定义一条链路,添加匹配规则,将匹配到的流量转移到链路中

### 创建端口复用链路
iptables -t nat -N MYROUTING
### 创建端口复用规则,将任意来源端口流量转移至22端口
iptables -t nat -A MYROUTING -p tcp -j REDIRECT --to-port 22
### 设置开启开关,当接受到包含"helloworld"的tcp包时,将来源ip添加到复用链路中
iptables -A INPUT -p tcp -m string --string "helloworld" --algo bm -m recent --set --name MYROUTING --rsource -j ACCEPT
### 设置关闭开关,当接受到包含"byebyeworld"的tcp包时,将来源ip移除到复用链路中
iptables -A INPUT -p tcp -m string --string "byebyeworld" --algo bm -m recent --name MYROUTING --remove -j ACCEPT
### 当SYN包的来源ip处于复用链路列表中时,将跳转至复用列表进行处理,有效果时间为3600秒
iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name MYROUTING --rsource -j MYROUTING

实际效果:

效果图

3. 其他命令

#删除指定类型序号规则
iptables -t nat -D PREROUTING 1
#查看现有规则表
iptables -t nat -nL --line
#转发本机到aaaa端口的流量到bbbb端口
iptables -t nat -A PREROUTING -p tcp --dport aaaa -j REDIRECT --to-port bbbb

0x00 本地端口转发

ssh –fgN –L lport:localhost:rprot locahhost
本地端口转发

0x01 远程端口转发

ssh –fgN –R lport:rhost:rprot locahhost
远程端口转发

0x02 动态转发,本地开启socks5端口转发流量

ssh –fgN –D lport root@rhost
动态转发

其他工具

其他的太多了,只列举部分

本地监听端口并转发请求目标端口流量

ncat --sh-exec "ncat rhost rport" -l lport --keep-open
ncat转发22端口流量

本地监听端口并转发请求目标端口流量

socat TCP4-LISTEN:lport.reuseaddr,fork TCP4:rhost:rport
socat端口转发

基于windows端口转发

自带工具

前置条件:administrator权限

0x00 转发远程

#将远程服务8081端口流量转发至本地8888端口
netsh interface portproxy add v4tov4 listenaddress=localhost listenport=lport connectaddress=rhost connectport=rport
netsh端口转发

0x01 正向代理 转发内网其他ip

# 监听本地2222端口并将流量转发到远程22端口,本地ip为内网地址
netsh interface portproxy add v4tov4 listenaddress=lhost listenport=lport connectaddress=rhost connectport=rport
55.3添加netsh 55.4监听2222端口并将流量转发到55.3的22端口 通过本机请求55.4的2222端口从而链接55.3的22服务

注:由于与iptables机制不同,使用netsh interface portproxy reset清空代理时建立的链接也会断开

其他工具

同样很多,懒得总结,暂时挖坑