jumpServer特殊案例之用nginx代理实现异地内网访问

warning: 这篇文章距离上次修改已过196天,其中的内容可能已经有所变动。

jumpServer奇葩案例之用nginx反向代理实现异地内网访问

一、背景

本来处理完 [jumpServer windwos RDP网络不可达、安全策略错误]: https://www.qipanet.com/itClass/284.html 之后,应该算完事了。但是刚想走人,甲方爸爸又说要在子公司内网能访问,并且出于保密需要,不希望给下属公司知道上级公司的公网IP以及相关端口信息。了解完需求后,给我的第一反应是这个需求真的奇葩啊。不管了,反正给加$就好办:smile:。

环境大概这样:总公司、子公司出口都有防火墙,总公司jumpServer和子公司的linux系统都部署在esxi上,子公司人员只能先访问linux,由linux做跳转到jumpServer上。

二、构思及实践

话说上述提到的需求,不就很普通的反向代理就能实现吗,对我来说好像没啥难度!用caddy、nginx等都可以做到。为啥不在子公司上再装个jumpServer再连接到总公司的jms呢?理论上可以做,但是这样做效率太低了,体验应该比较差。

aaa

首先要将jumpServer端口映射到公网。这里有个小坑,虽然用的是专线,但是某地的运营商连8080端口都给封禁的,导至做端口映射时怎么搞都连接不上。display firewall session table verbose ...查到的会话都是0!后来换个端口就成功了。

还遇到过连ping都被禁的,搞不懂运营商为啥要这么做,这是要墙墙联合啊!

端口映射做完并测试没问题后,需要做security-policy策略,确保只能从子公司的公网IP访问。接下来就需要在子公司的linux上做反向代理服务了。一开始想用caddy的,但是安装到80%的时候就卡住了。查了下netstat,发现有80端口在占用,毕竟是别人的服务,不好动。好消息时,偶然看到了80端口的服务是在docker里跑的,而且docker ps看到服务用的正是nginx。那还装啥docker,直接docker run nginx另起一个容器就是。

简单配置完后,配置内容和启动命令大概如下:

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
   
        proxy_pass http:/xxx:9000/;
        # root   /usr/share/nginx/html;
        # index  index.html index.htm;
    }
.....
docker run --name nginx -p 8080:80 -d --restart=always  -v /home/xx/docker/nginx/html:/usr/share/nginx/html -v /home/xx/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf  -v /home/xx/docker/nginx/conf/conf.d/default.conf:/etc/nginx/conf.d/default.conf  -v /home/xx/docker/nginx/log:/var/log/nginx  nginx

运行后发现子公司能正常打开jumpServer页面,但是登录却报错如下:

bbb

这提示很明白了,就是要到/opt/jumpserver/config里的config.txt找到domains,加上你的domain就可以了。不过我却在这浪费了些时间。由于手抖,端口9000写成了900,导致上述报错迟迟没有解决。后来还到gihtub上找了源码,打算硬改python代码来处理,当看到jumpserver/apps/jumpserver/settings/base.py里的某一块代码如下:

print("ALLOWED_HOSTS: ", )
for host in ALLOWED_DOMAINS:
    print('  - ' + host.lstrip('.'))

顿时眼前一亮,直接到docker logs 查看ALLOWED_HOSTS部分信息,果然看到了端口900:cry:,改完就能正常访问了。

这nginx代理放在子公司,子公司人员不就知道所有连接信息了?别急,总公司负责人跟我说下面的人是没权访问这台虚拟机的。而且子公司网络出口设备归总公司统一管理,他们想分析也分析不了。

还没完,登录后又收到提示什么websocket不可用(connect websocket failed),浏览器F12看到有报错:

The Cross-Origin-Opener-Policy header has been ignored, because the URL's origin was untrustworthy. It was defined either in the final response or a redirect. Please deliver the response using the HTTPS protocol. You can also use the 'localhost' origin instead

大概是跨域了,得治!试着加 proxy_set_header Access-Control-Allow-Origin '*';,没起作用,这里也折腾了些时间,最后直接到jumServer里复制他的配置文件(jms也是用的nginx组件做web代理)。nginx组件配置文件路径为:/opt/jumpserver/config/nginxlb_http_server.conf就是配置文件。

复制完过来,docker restart nginx,再访问,竟然成功了,这回可以了吧!

最后配置长这样:

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
           proxy_buffering off;
    proxy_request_buffering off;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection;
    proxy_set_header X-Forwarded-For $remote_addr;
    # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 如果上层还有其他 slb 需要使用 $proxy_add_x_forwarded_for 获取真实 ip

    proxy_ignore_client_abort on;
    proxy_connect_timeout 600;
    proxy_send_timeout 600;
    proxy_read_timeout 600;
    send_timeout 6000;
    proxy_set_header Access-Control-Allow-Origin '*';
        proxy_pass http://xxxx:9000/;
        # root   /usr/share/nginx/html;
        # index  index.html index.htm;
    }

三、后记

这只是其中一小部分内容,还有jumServer连接双网卡、划分vlan,配置虚拟机资源等小问题要处理,有空的话再分享吧!

顺便提下,目前接触到的==jumpServer windwos RDP网络不可达、安全策略错误==问题,主要有以下几个原因:

  • 系统版本,这个上回说了。
  • 使用网络级别身份验证(这个只在网上看到,我的案例中勾选了也能正常访问)
  • 普通用户没有远程桌面权限访问,至少需要将用户加到Remote Desktop Users组里。
  • 其它未知,等你来踩坑。。。

评论已关闭