通过 JumpServer 实现物理隔离内网的访问与限制

基础需求与环境

办公网网络是 172.16.*.* ,内网网络是 192.168.*.*,两个网络物理隔离。

需要在一台有两个网卡,两个网卡分别连接办公网和内网的宿主服务器上,搭建一个跳板服务器 JumpServer,通过它连接访问内网电脑,并且通过对资产的授权限制防止文件从内网传出以及剪贴板内容从内网传出。

这里假定你已经安装完成了 JumpServer。

修改 JumpServer 配置

在服务器上创建一个容器网络 macvlan192,网络界面选择连接内网网络的 ens192 网卡:

docker network create -d macvlan --subnet=192.168.101.0/24 --gateway=192.168.101.254 -o parent=ens192 macvlan192

需要让 JumpServer 的两个容器能够连通内网:

  • jms_celery :用于执行 Ansible 检测脚本,如果不能连通内网网段就无法标记资产的可连通性。
  • jms_lion:使用 Golang 和 Vue 重构了 JumpServer 的 Guacamole 组件,负责 RDP 和 VNC 的连接。 主要基于 Apache Guacamole 开发。如果不能连通内网网段就无法实现 Web 终端的连接。

修改 docker compose 文件

修改 compose/celery.yml,添加 inner 网络,这里 192.168.101.78 为内网未占用 IP:

services:
  celery:
    image: ${REGISTRY:-docker.io}/jumpserver/core:${VERSION}
    container_name: jms_celery
    hostname: jms_celery
    ulimits:
      core: 0
    restart: always
    privileged: true
    command: start task
    env_file:
      - ${CONFIG_FILE}
    environment:
      LC_ALL: C.UTF-8
    volumes:
      - ${CONFIG_DIR}/certs:/opt/jumpserver/data/certs
      - ${VOLUME_DIR}/core/data:/opt/jumpserver/data
    healthcheck:
      test: "bash /opt/jumpserver/utils/check_celery.sh"
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 30s
    networks:
      inner:
        ipv4_address: 192.168.101.78
        priority: 100
      net:

networks:
  inner:
    external: true
    name: macvlan192

修改 compose/lion.yml,添加 inner 网络,这里 192.168.101.79 为内网未占用 IP:

services:
  lion:
    image: ${REGISTRY:-docker.io}/jumpserver/lion:${VERSION}
    container_name: jms_lion
    hostname: jms_lion
    ulimits:
      core: 0
    restart: always
    env_file:
      - ${CONFIG_FILE}
    volumes:
      - ${CONFIG_DIR}/certs:/opt/lion/data/certs
      - ${VOLUME_DIR}/lion/data:/opt/lion/data
    healthcheck:
      test: "check http://localhost:8081/lion/health/"
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 10s
    networks:
      inner: 
        ipv4_address: 192.168.101.79
        priority: 100
      net:
    privileged: true

networks:
  inner:
    external: true
    name: macvlan192

修改 .env 文件

修改 .env 文件,把 DOCKER_SUBNET=192.168.250.0/24 改成 DOCKER_SUBNET=10.10.250.0/24,防止网段与内网冲突。

修改路由

然后给容器 jms_celeryjms_lion 都添加软件包并设置一条静态路由,让所有向内网 IP (192.168.*.* 网段)的访问请求流量都使用 eth1 网卡(在容器内这个网卡与内网网络绑定):

apt update
apt install -y iputils-ping net-tools traceroute procps
route add -net 192.168.0.0/16 dev eth1

把上面的命令放到 jmsctl.sh 里,这样启动时就自动执行了:

function start() {
  ${EXE} up -d
  docker exec -i jms_lion bash -c "apt update && apt install -y iputils-ping net-tools traceroute procps && route add -net 192.168.0.0/16 dev eth1"
  docker exec -i jms_celery bash -c "apt update && apt install -y iputils-ping net-tools traceroute procps && route add -net 192.168.0.0/16 dev eth1"
}

启动 JumpServer

./jmpctl.sh start

修改授权

对内网资产授权进行修改,禁止文件传输与剪贴板:
在这里插入图片描述

附录

在容器里安装 freerdptelnet

apt install -y freerdp2-x11 xvfb telnet

在容器里测试 RDP 连通性,这里 192.168.7.159 是我的内网电脑,开启了远程桌面:

xvfb-run -a xfreerdp /cert:ignore +auth-only /u:"NW\tangramor" /p:"Pass.w0rd" /v:"192.168.7.159"

[16:22:38:371] [6910:6911] [INFO][com.freerdp.client.x11] - Authentication only. Don't connect to X.
[16:22:38:373] [6910:6911] [INFO][com.freerdp.client.x11] - Property 242 does not exist
[16:22:38:548] [6910:6911] [INFO][com.freerdp.crypto] - creating directory /root/.config/freerdp
[16:22:38:549] [6910:6911] [INFO][com.freerdp.crypto] - creating directory [/root/.config/freerdp/certs]
[16:22:38:549] [6910:6911] [INFO][com.freerdp.crypto] - created directory [/root/.config/freerdp/server]
[16:22:39:854] [6910:6911] [ERROR][com.freerdp.core] - Authentication only, exit status 0
[16:22:39:854] [6910:6911] [ERROR][com.freerdp.client.x11] - Authentication only, exit status 0

这里 exit status 0 说明已经连接上了。

如果密码或者用户名不对,返回就是这样的了:

xvfb-run -a xfreerdp /cert:ignore +auth-only /u:"NW\tangramor" /p:"Pass.1" /v:"192.168.7.159"

[16:26:46:758] [7286:7287] [INFO][com.freerdp.client.x11] - Authentication only. Don't connect to X.
[16:26:46:759] [7286:7287] [INFO][com.freerdp.client.x11] - Property 242 does not exist
[16:26:46:127] [7286:7287] [WARN][com.freerdp.core.nla] - SPNEGO received NTSTATUS: STATUS_LOGON_FAILURE [0xC000006D] from server
[16:26:46:127] [7286:7287] [ERROR][com.freerdp.core] - nla_recv_pdu:freerdp_set_last_error_ex ERRCONNECT_LOGON_FAILURE [0x00020014]
[16:26:46:127] [7286:7287] [ERROR][com.freerdp.core.rdp] - rdp_recv_callback: CONNECTION_STATE_NLA - nla_recv_pdu() fail
[16:26:46:127] [7286:7287] [ERROR][com.freerdp.core.transport] - transport_check_fds: transport->ReceiveCallback() - -1
[16:26:46:127] [7286:7287] [ERROR][com.freerdp.core] - Authentication only, exit status 1

当然更简单的方式是 telnet,可以探测 3389 端口是否开放:

telnet 192.168.10.106 3389
Trying 192.168.10.106...
Connected to 192.168.10.106.
Escape character is '^]'.
^]
telnet> quit
Connection closed.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值