规划
显示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
测试结果