在 Linux 和 Windows 系统中实现端口映射(端口转发)的方法有所不同,以下是两种系统的详细实现方案:
iptables
(传统方法)# 开启IP转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 将本地端口 8080 转发到 192.168.1.100:80(本地到远程)
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.100 --dport 80 -j SNAT --to-source 本地IP
# 保存规则(根据发行版选择)
service iptables save # CentOS 6
iptables-save > /etc/iptables.rules # Debian/Ubuntu
firewalld
(CentOS/RHEL 7+)# 启用IP伪装(NAT)
firewall-cmd --add-masquerade --permanent
# 端口转发(将本地8080转到192.168.1.100:80)
firewall-cmd --add-forward-port=port=8080:proto=tcp:toaddr=192.168.1.100:toport=80 --permanent
# 重载配置
firewall-cmd --reload
nftables
(新一代替代工具)nft add table nat
nft add chain nat prerouting { type nat hook prerouting priority 0 \; }
nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
nft add rule nat prerouting tcp dport 8080 dnat to 192.168.1.100:80
nft add rule nat postrouting oif eth0 masquerade
socat
(临时测试)socat TCP-LISTEN:8080,fork TCP:192.168.1.100:80
netsh
(内置工具)# 添加端口转发(需管理员权限)
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=80 connectaddress=192.168.1.100
# 查看现有规则
netsh interface portproxy show all
# 删除规则
netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=0.0.0.0
# 临时端口转发(需管理员权限)
New-NetFirewallRule -DisplayName "Port Forward 8080 to 80" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=80 connectaddress=192.168.1.100
防火墙配置:确保放行转发的端口(如 8080
)。
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
权限要求:
root
权限或 sudo
。持久化配置:
/etc/rc.local
或对应服务配置文件。netsh
规则默认持久化。IPv6支持:
v4tov4
为 v6tov6
或 v4tov6
(Windows)。ip6tables
或 nftables
的 IPv6 规则。Linux:
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
iptables -t nat -A POSTROUTING -j MASQUERADE
Windows:
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=公网IP connectport=80 connectaddress=192.168.1.100
# 将本地3306端口转发到远程MySQL(Linux)
ssh -L 3306:localhost:3306 user@remote_db_server
通过上述方法,可以灵活实现跨网络或本地的端口映射需求。根据实际环境选择工具,并注意安全风险(如暴露敏感端口)。