Iptables - 使用Iptables创建跳板服务器

需求简介

现在有一个资源服务器,出于安全考虑,想对外提供服务的同时又不暴露本机的地址和其他端口,也就是对于用户而言,他们只能看到在和跳板机服务器(类似于反向代理)进行通讯,这个跳板机服务器使用云服务器,不开放任何其他端口,通过云服务器的Web页面进行管理。

此场景中,后端数据中心防火墙仅放行跳板服务器,用户通过中间服务器进行访问,用户策略也在中间服务器进行管理。

img

先说结论

#1. 需要使用root/sudo用户配置跳板服务器
sudo -i
#2. 开启服务器IP转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
#3. 在nat表配置PREROUTING规则,将用户访问的端口映射到资源服务器的端口
# 这里假设跳板服务器192.168.1.88的8080映射到资源服务器192.168.1.100的80端口的TCP服务
iptables -t nat -A PREROUTING -p tcp -d 192.168.1.88 --dport 8080 -j DNAT --to-destination 192.168.1.100:80
#4. 对目标为资源服务器端口的请求进行地址转换(SNAT或者MASQUERADE都可以)
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.100 --dport 80 -j MASQUERADE
#5. 查看iptables规则
iptables -t nat -L -n

img

原理分析

Iptables基于四表五链进行工作,其中四表为raw表、mangle表、filter表、nat表,五链为PREROUTING链、INPUT链、OUTPUT链、FORWARD链、POSTROUTING链;四表是对数据包不同操作来区分,五链是在数据包不同处理阶段来区分。

img

首先因为实际的服务是在资源服务器上,代理服务器不真实处理包数据,因此在流量入口出的PREROUTING链中添加规则。

在PREROUTING将原本发往本机的地址和端口改为了资源服务器的地址和端口,随后按照流程进入转发判断,此时如果内核中没有开启包转发,则会被丢弃。

最后在POSTROUTING中添加NAT规则,将源地址改为客户地址,这里如果添加的是SNAT,则可以保证仅由某个源地址发出,更加精确,如果是MASQUERADE,则是当前与资源服务器通信的地址发出,更加灵活。

实验验证

创建3台虚拟机(本次实验中系统版本为 Debian 12,均为最小化安装后的虚拟机克隆生成),分别作为客户(Client)、资源服务器(Server)和跳板服务器(Middle)。

img

虚拟机名称 IP地址 安装组件
Client 192.168.10.12 curl
Server 192.168.10.13
Middle 192.168.10.14

在Server上Shell中用python起一个web服务,监听8080端口,在client中用curl访问,可以看到此时server中显示的是client的地址

# server
python3 -m http.server 8080
# client
curl http://192.168.10.13:8080

img

在Middle创建一个iptables规则,将client的请求转发到server,此时进行直接端口转换,也就是8080-->8080,仅仅更改目的地址

# middle
echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -t nat -A PREROUTING -p tcp -d 192.168.10.14 --dport 8080 -j DNAT --to-destination 192.168.10.13

iptables -t nat -A POSTROUTING -p tcp -d 192.168.10.13 --dport 8080 -j MASQUERADE

此时在client中分别执行curl 192.168.10.13:8080和curl 192.168.10.14:8080,查看server,可以看到前者server中是client地址,后者server中是middle的地址

img

这里把PREROUTING中本机加上18080端口,实现地址和端口同时改变

# middle

echo 1 > /proc/sys/net/ipv4/ip_forward

# 清空前个实验的nat规则:
# iptalbes -t nat -F

iptables -t nat -A PREROUTING -p tcp -d 192.168.10.14 --dport 18080 -j DNAT --to-destination 192.168.10.13:8080

iptables -t nat -A POSTROUTING -p tcp -d 192.168.10.13 --dport 8080 -j MASQUERADE

在client中curl 192.168.10.14:18080,可以看到成功结果

img

iptables规则的备份和恢复

# 备份
iptables-save > ~/iptables.rules
# 恢复
iptables-restore < ~/iptables.rules

img

posted @ 2025-07-06 12:39  Gaoniaofei  阅读(30)  评论(0)    收藏  举报