目的
- 监听本机 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
- MASQUERADE 在 Ubuntu 18.04 下可能引起 dns 服务异常,参见 How to allow DNS lookup with iptables on Ubuntu 18.04 server,可改成如下配置:
# 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-nat 或 conntrack
命令。
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。