
本实验使用 VMware 搭建 Router、跳板机和 Web 服务器并使用 Windows 上的 Xshell 作为测试客户端实现以下访问流程Windows 测试机 ↓ 访问 192.168.1.10:2288 Router 进行 DNAT 转发 ↓ 转发到 192.168.243.99:6677 以普通用户登录跳板机 ↓ SSH 到 192.168.243.100:22 登录 Web 服务器整个实验采用用户名和密码认证不配置 SSH 免密登录。这里实现的是 SSH 跳板访问不包含专用堡垒机平台的操作审计和录像功能。一、实验环境与地址规划设备网卡或网络IP 地址用途Windows 测试机WLAN192.168.1.7/24使用 Xshell 测试外网入口Windows 测试机VMnet1192.168.243.1/24内网管理Router外网ens224桥接模式192.168.1.10/24接收外网侧连接Router内网ens160Host-only192.168.243.250/24内网网关跳板机node001ens160Host-only192.168.243.99/24SSH 跳板入口Web 服务器web-serverens160Host-only192.168.243.100/24被管理服务器跳板机和 Web 的默认网关均为192.168.243.250“外网”指相对于虚拟机内网的外部网络。192.168.1.0/24仍属于私有局域网不是互联网公网。二、配置 VMware 网络Router 配置两张网卡内网网卡连接Host-onlyVMnet1。外网网卡连接桥接网络VMnet0。跳板机和 Web 的网卡连接到相同的 VMnet1。在 VMware 中打开编辑 → 虚拟网络编辑器 → 更改设置选择 VMnet0将“桥接到”明确设置为 Windows 正在使用的 WLAN 无线网卡。网卡需勾选“启动时连接”虚拟机关机时“已连接”选项变灰属于正常现象。三、配置静态 IP先在各虚拟机上查看连接名称nmcli connection show --active本实验连接名称为ens160其他环境需替换为实际名称。1. 跳板机nmcli connection modify ens160 \ ipv4.method manual \ ipv4.addresses 192.168.243.99/24 \ ipv4.gateway 192.168.243.250 \ ipv4.dns 223.5.5.5 119.29.29.29 \ connection.autoconnect yes nmcli connection up ens1602. Web 服务器nmcli connection modify ens160 \ ipv4.method manual \ ipv4.addresses 192.168.243.100/24 \ ipv4.gateway 192.168.243.250 \ ipv4.dns 223.5.5.5 119.29.29.29 \ connection.autoconnect yes nmcli connection up ens1603. 验证内网两台机器分别执行ip -4 addr show ens160 ip route ping -c 3 192.168.243.250确认地址正确并能够访问 Router 内网网关。Router 外网地址在本次实验中由 DHCP 获取为192.168.1.10后续若发生变化需要同步调整端口映射和测试会话。四、配置跳板机 SSH以下操作在跳板机node001上执行。1. 创建普通用户useradd -m liuminjuan passwd liuminjuan根据提示设置密码。外部测试连接使用这个普通用户不使用 root 登录跳板机。2. 将 SSH 端口改为 6677编辑vi /etc/ssh/sshd_config设置Port 6677 PermitRootLogin no3. 检查配置片段中的 root 登录选项本实验中主配置文件会先加载Include /etc/ssh/sshd_config.d/*.conf其中安装程序生成的文件包含PermitRootLogin yes导致仅修改主文件还没有达到预期效果。编辑vi /etc/ssh/sshd_config.d/01-permitrootlogin.conf改为PermitRootLogin no4. 配置 SELinux 端口授权SELinux 开启时需要允许 SSH 使用 TCP 6677semanage port -a -t ssh_port_t -p tcp 6677如果提示端口已定义先查看semanage port -l | grep -E ssh_port_t|66775. 启动并验证 SSHsshd -t systemctl enable sshd systemctl restart sshd查看最终生效的配置sshd -T | grep -E ^(port|permitrootlogin)预期输出port 6677 permitrootlogin no查看监听端口ss -lntp | grep :6677按本实验的练习配置停止跳板机的 firewalldsystemctl stop firewalld该命令停止当前服务不等于禁止开机启动。五、配置 Router 端口转发以下操作在 Router 上执行。1. 确认外网和内网地址ip -4 addr show ens224 ip -4 addr show ens160本实验分别为ens224192.168.1.10/24 ens160192.168.243.250/242. 开启 IP 转发检查sysctl net.ipv4.ip_forward若值为0执行sysctl -w net.ipv4.ip_forward13. 发布跳板机的 SSH 服务将 Router 外网的 TCP 2288 映射到跳板机的 TCP 6677iptables -t nat -A PREROUTING \ -d 192.168.1.10 -i ens224 \ -p tcp --dport 2288 \ -j DNAT --to-destination 192.168.243.99:6677映射关系192.168.1.10:2288 → 192.168.243.99:66774. 放行对应的转发流量本实验 Router 的 FORWARD 默认策略为 DROP需要允许请求和返回流量iptables -I FORWARD 1 \ -i ens224 -o ens160 \ -d 192.168.243.99 \ -p tcp --dport 6677 \ -m conntrack --ctstate NEW,ESTABLISHED \ -j ACCEPTiptables -I FORWARD 1 \ -i ens160 -o ens224 \ -s 192.168.243.99 \ -p tcp --sport 6677 \ -m conntrack --ctstate ESTABLISHED \ -j ACCEPT跳板机默认网关已指向 Router因此这条访问路径不需要额外添加 SNAT。5. 查看规则iptables -t nat -L PREROUTING -nv iptables -L FORWARD -nv连接测试时可以观察对应规则的报文计数是否增加。以上命令修改运行规则。将命令写进snat_dnat.sh后还需要执行脚本开机自动恢复应单独验证。不要反复添加已存在的规则。六、配置 Web 的 SSH 来源限制Web 使用默认 SSH 端口 22保留 firewalld。本实验最终允许跳板机192.168.243.99Windows 内网管理地址192.168.243.1在 Web 上执行firewall-cmd --permanent --zonepublic \ --add-rich-rulerule familyipv4 priority-100 source address192.168.243.99/32 port port22 protocoltcp acceptfirewall-cmd --permanent --zonepublic \ --add-rich-rulerule familyipv4 priority-100 source address192.168.243.1/32 port port22 protocoltcp accept拒绝该区域其他来源访问 SSHfirewall-cmd --permanent --zonepublic \ --add-rich-rulerule priority-90 port port22 protocoltcp reject移除原先对所有来源开放的 SSH 服务firewall-cmd --permanent --zonepublic --remove-servicessh检查并加载firewall-cmd --check-config firewall-cmd --reload firewall-cmd --zonepublic --list-rich-rules由于本实验保留了 Windows 直连 Web 的管理权限不能将实验描述为“Web 只允许跳板机访问”。七、使用测试机验证完整流程Windows 作为测试机在 Xshell 中新建名为“测试”的会话。1. 测试外网入口端口在 Windows PowerShell 中执行Test-NetConnection 192.168.1.10 -Port 2288成功时显示TcpTestSucceeded : True这一步仅证明 TCP 端口连通还需要继续验证用户登录。2. 配置 Xshell 测试会话项目配置会话名称测试协议SSH主机192.168.1.10端口2288用户名liuminjuan密码跳板机上该用户的密码连接成功后出现[liuminjuannode001 ~]$虽然连接地址是 Router 的外网 IP但 Router 会将连接转发给跳板机因此输入的是跳板机账号。3. 从跳板机连接 Web在跳板机中执行ssh root192.168.243.100首次连接时确认主机指纹随后输入 Web 服务器 root 用户的密码。成功后提示符变为[rootweb-server ~]#这说明测试机已经通过 Router 和跳板机进入 Web 服务器。4. 确认当前主机和连接来源在 Web 中执行hostname whoami echo $SSH_CONNECTION预期主机名为web-server。当前用户为root。SSH 客户端来源地址为跳板机192.168.243.99。截图中的Last login ... from 192.168.243.1表示上一次登录记录不代表本次连接来源。5. 实验成功截图截图中可以看到它验证了以下完整访问路径Windows 测试机 → Router192.168.1.10:2288 → 跳板机192.168.243.99:6677 → Web192.168.243.100:22发布博客时需要将图片上传到博客平台替换本文中的本地图片路径。八、实验故障与处理现象原因与处理SSH 修改到 6677 后启动失败日志显示端口绑定权限不足给 SELinux 添加 SSH 端口授权主配置写了禁止 root但仍显示允许检查并修改01-permitrootlogin.conf使用sshd -T验证DNAT 命令写进脚本运行规则却没有脚本需要执行还要检查是否被其他任务清空转发规则每分钟消失注释每分钟清空 iptables 的 cron 任务DNAT 存在连接仍被拦截FORWARD 默认为 DROP需要放行对应请求和返回流量从跳板机登录 Web 时密码失败未指定用户名时会沿用liuminjuan应使用 Web 上实际存在的账号Xshell 提示 X11 转发被拒绝不影响本实验的普通终端登录Windows 间歇性连接失败排查 WLAN 桥接和 ARP 邻居状态不能只检查 SSH 密码清空规则的定时任务通过crontab -e注释保留原行和脚本# */1 * * * * bash /iptables/clear_iptables_rules.sh针对 Windows 邻居记录不可达的问题本实验还在管理员 PowerShell 中尝试添加临时记录netsh interface ipv4 add neighbors WLAN 192.168.1.10 00-0c-29-42-eb-bd storeactive其中 MAC 地址必须使用 Router 外网网卡的实际地址。该操作是本次环境的排障尝试并不能单凭一次连接成功就认定长期稳定性问题已解决。九、实验结果本实验成功实现了使用 Router 将外网 TCP 2288 转发到跳板机 TCP 6677。使用普通用户登录跳板机并禁止 root 直接 SSH 登录跳板机。从跳板机使用密码认证登录 Web 服务器。使用 Windows 的 Xshell 测试会话验证完整访问路径。提供以下图纸方便理解