Linux iptables 端口转发:让外部访问内网 SQL Server
📅 2026/7/2 13:04:29
👁️ 阅读次数
📝 编程学习
📌 为什么需要端口转发?
业务场景
在企业内网中,数据库服务器通常位于核心网络区域,不直接对外暴露。而应用服务器或堡垒机位于接入层网络,可以同时访问外网和内网。
外网/本地 → 堡垒机(接入层)→ 数据库服务器(核心层)
具体场景:
数据库服务器(172.21.1.***)只能被内网特定机器访问
堡垒机(172.21.1.***)可以访问数据库,也能被外部访问
需要让外部开发人员通过堡垒机连接到内网数据库进行调试
为什么不用其他方案?
| 方案 | 问题 |
|---|---|
| 直接开放数据库端口 | 安全风险高,违反企业安全策略 |
| VPN | 配置复杂,需要额外设备或软件 |
| SSH隧道 | 需要SSH权限,且不稳定 |
| 应用层代理 | 需要额外软件,配置复杂 |
| iptables转发 | ✅ 系统自带,无需安装,性能好,稳定可靠 |
适用场景
开发调试:开发人员需要连接内网数据库
临时开放:运维人员需要临时开放数据库访问
端口映射:需要将一个端口映射到另一个地址
资源受限:内网环境无法安装额外软件
🛠 环境说明
| 角色 | IP地址 | 说明 |
|---|---|---|
| 堡垒机(转发服务器) | 172.21.1.*** | 可同时访问外网和内网 |
| 数据库服务器 | 172.21.1.*** | 内网SQL Server,不对外暴露 |
| 数据库端口 | 1433 | SQL 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
编程学习
技术分享
实战经验