Linux iptables 端口转发:让外部访问内网 SQL Server

📅 2026/7/2 13:04:29 👁️ 阅读次数 📝 编程学习
Linux iptables 端口转发:让外部访问内网 SQL Server

📌 为什么需要端口转发?

业务场景

在企业内网中,数据库服务器通常位于核心网络区域,不直接对外暴露。而应用服务器或堡垒机位于接入层网络,可以同时访问外网和内网。

外网/本地 → 堡垒机(接入层)→ 数据库服务器(核心层)

具体场景

  • 数据库服务器(172.21.1.***)只能被内网特定机器访问

  • 堡垒机(172.21.1.***)可以访问数据库,也能被外部访问

  • 需要让外部开发人员通过堡垒机连接到内网数据库进行调试

为什么不用其他方案?

方案问题
直接开放数据库端口安全风险高,违反企业安全策略
VPN配置复杂,需要额外设备或软件
SSH隧道需要SSH权限,且不稳定
应用层代理需要额外软件,配置复杂
iptables转发✅ 系统自带,无需安装,性能好,稳定可靠

适用场景

  1. 开发调试:开发人员需要连接内网数据库

  2. 临时开放:运维人员需要临时开放数据库访问

  3. 端口映射:需要将一个端口映射到另一个地址

  4. 资源受限:内网环境无法安装额外软件


🛠 环境说明

角色IP地址说明
堡垒机(转发服务器)172.21.1.***可同时访问外网和内网
数据库服务器172.21.1.***内网SQL Server,不对外暴露
数据库端口1433SQL Server默认端口
本地客户端外网IP开发人员本地电脑

📋 操作步骤

第一步:开启IP转发

Linux默认未开启IP转发,需要手动开启:

# 临时开启(立即生效) echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward # 验证是否开启 cat /proc/sys/net/ipv4/ip_forward # 输出应为 1

⚠️ 这个配置重启后会失效,如需永久生效,编辑/etc/sysctl.conf添加:

text

net.ipv4.ip_forward = 1

然后执行sudo sysctl -p生效。


第二步:配置iptables转发规则

2.1 添加NAT转发规则

bash

# PREROUTING:处理从外部进入的请求 sudo iptables -t nat -I PREROUTING 1 -p tcp --dport 1433 -j DNAT --to-destination 数据库服务器IP:1433 # OUTPUT:处理本机访问本机的请求 sudo iptables -t nat -I OUTPUT 1 -p tcp --dport 1433 -j DNAT --to-destination 数据库服务器IP:1433 # POSTROUTING:让返回包能正确路由 sudo iptables -t nat -A POSTROUTING -p tcp -d 数据库服务器IP --dport 1433 -j MASQUERADE
2.2 开放防火墙端口

bash

# INPUT:允许外部访问本机1433端口 sudo iptables -I INPUT 1 -p tcp --dport 1433 -j ACCEPT # FORWARD:允许转发数据包到数据库 sudo iptables -I FORWARD 1 -p tcp -d 数据库服务器IP --dport 1433 -j ACCEPT sudo iptables -I FORWARD 1 -p tcp -s 数据库服务器IP --sport 1433 -j ACCEPT

第三步:验证配置

3.1 查看规则是否生效

bash

# 查看NAT表规则 sudo iptables -t nat -L -n -v --line-numbers # 查看INPUT链 sudo iptables -L INPUT -n -v # 查看FORWARD链 sudo iptables -L FORWARD -n -v
3.2 测试端口连通性

bash

# 在堡垒机上测试本机端口 nc -vz 127.0.0.1 1433 # 或 nc -vz 172.21.1.*** 1433 # 期望输出:Connected
3.3 从远程客户端测试

在本地电脑上:

bash

telnet 堡垒机IP 1433 # 或 nc -vz 堡垒机IP 1433

📝 快速恢复命令(重启后执行)

如果重启后规则丢失,执行以下命令快速恢复:

# 设置变量(替换为实际IP) DB_IP="172.21.1.***" # 开启IP转发 echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward # 添加转发规则 sudo iptables -t nat -I PREROUTING 1 -p tcp --dport 1433 -j DNAT --to-destination $DB_IP:1433 sudo iptables -t nat -I OUTPUT 1 -p tcp --dport 1433 -j DNAT --to-destination $DB_IP:1433 sudo iptables -t nat -A POSTROUTING -p tcp -d $DB_IP --dport 1433 -j MASQUERADE # 开放端口 sudo iptables -I INPUT 1 -p tcp --dport 1433 -j ACCEPT sudo iptables -I FORWARD 1 -p tcp -d $DB_IP --dport 1433 -j ACCEPT sudo iptables -I FORWARD 1 -p tcp -s $DB_IP --sport 1433 -j ACCEPT # 验证 nc -vz 127.0.0.1 1433