规划
显示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:6677Chain INPUT (policy ACCEPT)
target prot opt source destinationChain OUTPUT (policy ACCEPT)
target prot opt source destinationChain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 192.168.200.0/24 0.0.0.0/0
通过防火墙服务器的DNAT功能连接jumpserver服务器
堡垒机脚本(模拟登陆菜单)
#!/bin/bashwhile true; doecho "========= 堡垒机登录系统 ========="echo "1. 连接 Redis 服务器"echo "2. 连接 MySQL 服务器"echo "3. 连接 nginx 服务器"echo "4. 退出"echo "================================="read -p "请输入你的选择 [1-4]:" numcase $num in1)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
测试结果