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