【Linux】TCP_Wrappers+iptables实现堡垒机功能

发布于:2025-04-11 ⋅ 阅读:(29) ⋅ 点赞:(0)

规划

显示jumpserver的简单功能,大致的网络拓扑图如下
在这里插入图片描述


功能规划 & 拓扑结构

JumpServer(堡垒机)主要功能:

  • 对访问目标服务器进行统一入口控制(例如 nginx、mysql、redis)。
  • 使用 iptables 做 NAT 转发,控制从外部进入内部服务器的流量。
  • 使用 /etc/hosts.allow/etc/hosts.deny 做基于主机的简单访问控制。
  • 提供脚本化的登录菜单,方便用户连接目标服务。

网络拓扑图

正式的图结构如下:

┌──────────────┐        ┌─────────────┐       ┌──────────────┐
│ NAT客户端     │        │ NAT路由器     │       │ 目标内网服务器们 │
│ 192.168.100.x │ <───►  │ 192.168.100.202 │────►│ 192.168.200.201等 │
└──────────────┘        │ 192.168.200.250 │       └──────────────┘
                        └─────────────┘

主机访问控制(hosts.allow / deny)

在客户端启用访问控制(防止非法 IP 直接访问内网服务器):

# /etc/hosts.allow
sshd:192.168.200.200
# 仅允许堡垒机 IP 登录 sshd 服务

# /etc/hosts.deny
sshd:ALL
# 拒绝所有其他 IP

这样就实现了“只有堡垒机能登录这些服务器”。

加固堡垒机ssh

vim /etc/ssh/sshd_config
PermitRootLogin no
Port 6677

NAT 转发规则

配置在 nat-router 上:

#开启路由功能
echo  1  >/proc/sys/net/ipv4/ip_forward
#SNAT
# 源地址伪装,使内网服务器返回包能正常出去
iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -o ens32 -j MASQUERADE
#iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -o ens32 -j SNAT --to-source 192.168.100.202

# 将外网访问堡垒机端口 2233 的请求,转发到内网堡垒机的 6677 端口
iptables -t nat -A PREROUTING -i ens32 -d 192.168.100.202 -p tcp --dport 2233 -j DNAT --to-destination 192.168.200.200:6677


[root@nat-router ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  0.0.0.0/0            192.168.100.202      tcp dpt:2233 to:192.168.200.200:6677

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  192.168.200.0/24     0.0.0.0/0

通过防火墙服务器的DNAT功能连接jumpserver服务器
在这里插入图片描述


堡垒机脚本(模拟登陆菜单)

#!/bin/bash

while true; do
  echo "========= 堡垒机登录系统 ========="
  echo "1. 连接 Redis 服务器"
  echo "2. 连接 MySQL 服务器"
  echo "3. 连接 nginx 服务器"
  echo "4. 退出"
  echo "================================="

  read -p "请输入你的选择 [1-4]:" num

  case $num in
    1)
      ssh root@192.168.200.201 -p 22
      ;;
    2)
      ssh root@192.168.200.202 -p 22
      ;;
    3)
      ssh root@192.168.200.203 -p 22
      ;;
    4)
      echo "已退出。"
      exit 0
      ;;
    *)
      echo "无效选择,请重新输入!"
      ;;
  esac
done

测试结果
在这里插入图片描述



网站公告

今日签到

点亮在社区的每一天
去签到