目的

  • 监听本机 7777 端口,将数据转发到 192.168.7.8 的 8888 端口,实现 TCP 数据转发。

方法一 ncat

  • ncat端口转发,Linux/Windows 通用
ncat --sh-exec "ncat 192.168.7.8 8888" -l 7777 --keep-open

方法二 netsh(Windows)

#将本机 7777 端口收到的内容转发到 192.168.7.8 的 8888 端口
netsh interface portproxy add v4tov4 listenport=7777 listenaddress=0.0.0.0 connectport=8888 connectaddress=192.168.7.8
  • 查看
netsh interface portproxy show all
  • 移除
netsh interface portproxy delete v4tov4 listenport=7777 listenaddress=0.0.0.0

方法三 iptables(Linux)

sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
  • 开启端口转发(/etc/sysctl.conf)
# 开启端口转发
sudo sysctl net.ipv4.ip_forward=1
# 查看
sudo sysctl -a | grep ip_forward
  • 配置端口转发
# 转发规则配置(可添加详细的限制规则)
sudo iptables -t nat -A PREROUTING -p tcp --dport 7777 -j DNAT --to-destination 192.168.7.8:8888
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
# 查看
sudo iptables -t nat -nL
# tap0 为转发出口网卡代号
# 本例为 tap 虚拟网卡
iptables -t nat -A POSTROUTING -o tap0 -j MASQUERADE
# OR (192.168.7.1 为虚拟网卡地址)
iptables -t nat -A POSTROUTING -o enp4s0 -j SNAT --to-source 192.168.7.1
  • 移除示例
# 查看
sudo iptables -t nat -nL --line-numbers
# 移除。最后的数字为加 --line-numbers 参数后 num 显示的序号
sudo iptables -t nat -D POSTROUTING 1
  • 端口查看
sudo netstat -anpt | grep 7777

可以看到 iptables 端口转发的连接并不能用 netstat 查看,因为 NAPT 并不需要占用端口,7777 端口仍然可以被其它程序使用。若需查看,可使用 netstat-natconntrack 命令。

conntrack -L -p tcp --src-nat
# OR
conntrack -L -n
  • NAPT 为啥不占用端口:iptables 工作在 OSI 模型的2/3/4层,做端口转发时,只需要查看和转换运输层的端口号,并不需要占用。以下摘自《计算机网络(第5版)》(谢希仁)175页。
应当指出,从层次的角度看,NAPT 的机制有些特殊。
普通路由器在转发 IP 数据报时,对于源 IP 地址或目的 IP 地址都是不改变的。但 NAT 路由器在转发 IP 数据报时,一定要更换其 IP 地址(转换源 IP 地址或目的 IP 地址)。
其次,普通路由器在转发分组是,是工作在网络层。但 NAPT 路由器还要查看和转换运输层的端口号,而这本来应当属于运输层的范畴。也正因为这样,NAPT 曾遭受一些人的批评,认为 NAPT 的操作没有严格按照层次的关系。
本文出自 qbit snap

qbit
268 声望279 粉丝

引用和评论

0 条评论