环境描述
服务器 192.168.0.1 的公共网络地址是 218.92.5.110,由 NAT 映射了 22 端口,即内网用户可访问 192.168.0.1:22,公网用户可访问 218.92.5.110:22。
功能需求
1. 公网地址只能登录用户 jack。
2. 内网地址可以登录任意用户。
实现原理
利用 OpenSSH 的 ForceCommand 参数强制用户登录后执行指定程序 shield,此程序验证环境变量 SSH_CLIENT 中的地址是否在白名单。如果为允许地址即运行环境变量 SHELL 中指定的程序;否则输出访问禁止信息后退出。
shield 程序源代码
#!/bin/bash
# Heiher
ALLOWED_NETWORKS=(192.168.0.)
for NETWORK in ${ALLOWED_NETWORKS[@]}; do
if [ "${SSH_CLIENT:0:${#NETWORK}}" = "${NETWORK}" ]; then
if [ -n "${SSH_ORIGINAL_COMMAND}" ]; then
exec ${SSH_ORIGINAL_COMMAND}
else
exec ${SHELL}
fi
fi
done
echo 'Access denied!'
exit 1
Over!