前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊如何玩转spring-boot-admin

聊聊如何玩转spring-boot-admin

作者头像
lyb-geek
发布于 2023-09-20 07:55:12
发布于 2023-09-20 07:55:12
1.6K00
代码可运行
举报
文章被收录于专栏:Linyb极客之路Linyb极客之路
运行总次数:0
代码可运行
11

前言

1、何为spring-boot-admin?

Spring Boot Admin 是一个监控工具,旨在以良好且易于访问的方式可视化 Spring Boot Actuators 提供的信息

2

快速开始

如何搭建spring-boot-admin-server

01

在服务端项目的POM引入相应的GAV

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
            <version>${spring-boot-admin.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

02

新建springboot启动类并加上@EnableAdminServer

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@SpringBootApplication
@EnableAdminServer
public class MonitorApplication {
    public static void main(String[] args) {
        SpringApplication.run(MonitorApplication.class);
    }
}

配置完,访问一下页面

虽然可以访问,但是这样不安全,接下来我们和spring security做个整合

03

整合spring security

a、 在服务端项目的pom引入security GAV

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

b、 在服务端项目的application.yml配置相关用户名和密码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  security:
    user:
      name: ${MONITOR_USER:admin}
      password: ${MONITOR_PWD:admin}

c、 定制security config

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityMonitorConfig extends WebSecurityConfigurerAdapter {



    private final AdminServerProperties adminServer;

    private final WebEndpointProperties webEndpointProperties;


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");
        successHandler.setDefaultTargetUrl(this.adminServer.path("/"));


        http.authorizeRequests()
                .requestMatchers(new AntPathRequestMatcher(this.adminServer.path("/assets/**"))).permitAll()
                .requestMatchers(new AntPathRequestMatcher(this.adminServer.path(webEndpointProperties.getBasePath() + "/info")))
                .permitAll()
                .requestMatchers(new AntPathRequestMatcher(adminServer.path(webEndpointProperties.getBasePath() + "/health")))
                .permitAll()
                .requestMatchers(new AntPathRequestMatcher(this.adminServer.path("/login")))
                .permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin().loginPage(this.adminServer.path("/login")).successHandler(successHandler).and()
                .logout().logoutUrl(this.adminServer.path("/logout")).and()
                .httpBasic().and()
                .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
                .ignoringRequestMatchers(
                        new AntPathRequestMatcher(this.adminServer.path("/instances"), POST.toString()),
        new AntPathRequestMatcher(this.adminServer.path("/instances/*"), DELETE.toString()),
        new AntPathRequestMatcher(this.adminServer.path(webEndpointProperties.getBasePath() + "/**")));

        http.rememberMe((rememberMe) -> rememberMe.key(UUID.randomUUID().toString()).tokenValiditySeconds(1209600));


    }

}

配置完访问一下页面

输入用户名和密码 admin/admin

如果对整合安全认证还有疑问,可以直接参考官网

https://docs.spring-boot-admin.com/current/security.html

04

页面定制

如果我们觉得登录的springboot admin logo个性化不强,我们可以简单定制一下

在application.yml做如下配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  boot:
    admin:
      ui:
        title: ${UI_TITLE:LYB-GEEK Monitor}
        brand: <img src="assets/img/icon-spring-boot-admin.svg"><span>${spring.boot.admin.ui.title}</span>

配置好访问一下

如果有些导航栏,我们觉得不需要,比如去掉关于我们

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  boot:
    admin:
      ui:
        view-settings:
          - name: "about"
            enabled: false

注: view-settings这个配置需要是2.3.1以上版本才有的属性

配置好访问一下

发现关于我们已经去掉了,以上只是简单定制,更多定制可以参考如下链接

https://docs.spring-boot-admin.com/current/customize_ui.html

05

注册中心集成

a、 在服务端项目中pom引入eureka-client GAV

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

b、 在application.yml文件引入eureka 客户端相关配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
eureka:
  instance:
    instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${spring.application.instance_id:${server.port}}
    prefer-ip-address: ${PREFER_IP:true}  #是否选择IP注册
    # ip-address: ${IP_ADDRESS:localhost} #指定IP地址注册
    lease-renewal-interval-in-seconds: 5 #续约更新时间间隔(默认30秒),使得eureka及时剔除无效服务
    lease-expiration-duration-in-seconds: 10 #续约到期时间(默认90秒)
    hostname: ${HOSTNAME:${spring.application.name}}
  client:
    service-url:
      defaultZone: ${EUREKA_CLIENT_SERVICEURL_DEFAULTZONE:http://localhost:8761/eureka/}
      #缩短延迟向服务端注册的时间、默认40s
    initial-instance-info-replication-interval-seconds: 10
    #提高Eureka-Client端拉取Server注册信息的频率,默认30s
    registry-fetch-interval-seconds: 5

访问eureka控制面板

服务端的配置暂且说到这边,接下来我们说下客户端集成

如何搭建spring-boot-admin-client

01

在客户端项目的POM配置相关GAV

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
            <version>${spring-boot-admin-client.version}</version>
        </dependency>

       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

02

客户端暴露actuator相关端点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
management:
  endpoints:
    web:
      exposure:
        include: "*" 
  endpoint:
    health:
      show-details: ALWAYS

03

配置spring-boot-admin服务端地址

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  boot:
    admin:
      client:
        url: http://localhost:8080

启动观察控制台,会发现有如下信息

原因是因为我们服务端配置了鉴权,因此我们客户端还需做如下配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  boot:
    admin:
      client:
        url: http://localhost:8080
        username: admin
        password: admin

配置好,观察控制台,发现没异常信息,此时我们访问服务端监控面板

如图说明客户端搭建成功

04

配置应用信息

默认我们查看服务端监控面板--应用列表详情,会发现

这个信息是空的,我们可以在yml配置形如下内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
info:
  groupId: @project.groupId@
  artifactId: @project.artifactId@
  version: @project.version@
  describe: 这是一个微服务应用

再次访问服务端监控面板

其实这个采的就是actuator/info端点。当然可以像官方介绍的示例,在项目的POM引入springboot插件,并指定goal为build-info

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>build-info</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

05

在服务端监控面板集成客户端日志

默认是没集成客户端日志,如图

通过官网

我们知道要配置logging.file.path或者logging.file.name

示例配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
logging:
  file:
    path: ${LOG_FILE_PATH:/data/logs/cloud-mini-comsumer}

logback-spring相关配置如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <property name="serviceName" value="cloud-mini-comsumer"/>
    <property name="logHome" value="/data/logs/${serviceName}"/>
    <contextName>${serviceName}</contextName>

    <!--输出到控制台-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!--按天生成日志-->
    <appender name="logFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <Prudent>true</Prudent>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>
                ${logHome}/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.log
            </FileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %d{yyyy-MM-dd HH:mm:ss} -%msg%n
            </Pattern>
        </layout>
    </appender>

    <root level="info">
        <appender-ref ref="console"/>
        <appender-ref ref="logFile"/>
    </root>

</configuration>

我们配置后,出现日志文件按钮,点击后出现

那就很诡异,明明按官网配置了,后面排查发现,其他服务可以出现日志,他们配置日志目录底下,都会生成一个spring.log日志,那意味着只要能生成spring.log即可。于是我们调整一下logback-spring,将

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>

调整为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<include resource="org/springframework/boot/logging/logback/base.xml" />

然后重新访问服务端监控面板

发现有日志出来了。那为毛加了这个base.xml就有用,那是因为这个日志采集的端点是actuator/logfile。因为本文不是讲解源码,我就把相关核心源码,贴在下面,感兴趣的朋友可以根据下面提供的源码,进行debug调试

核心源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@WebEndpoint(id = "logfile")
public class LogFileWebEndpoint {

  private static final Log logger = LogFactory.getLog(LogFileWebEndpoint.class);

  private File externalFile;

  private final LogFile logFile;

  public LogFileWebEndpoint(LogFile logFile, File externalFile) {
    this.externalFile = externalFile;
    this.logFile = logFile;
  }

  @ReadOperation(produces = "text/plain; charset=UTF-8")
  public Resource logFile() {
    Resource logFileResource = getLogFileResource();
    if (logFileResource == null || !logFileResource.isReadable()) {
      return null;
    }
    return logFileResource;
  }

  private Resource getLogFileResource() {
    if (this.externalFile != null) {
      return new FileSystemResource(this.externalFile);
    }
    if (this.logFile == null) {
      logger.debug("Missing 'logging.file.name' or 'logging.file.path' properties");
      return null;
    }
    return new FileSystemResource(this.logFile.toString());
  }

}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class LogFile {

  /**
   * The name of the Spring property that contains the name of the log file. Names can
   * be an exact location or relative to the current directory.
   * @deprecated since 2.2.0 in favor of {@link #FILE_NAME_PROPERTY}
   */
  @Deprecated
  public static final String FILE_PROPERTY = "logging.file";

  /**
   * The name of the Spring property that contains the directory where log files are
   * written.
   * @deprecated since 2.2.0 in favor of {@link #FILE_PATH_PROPERTY}
   */
  @Deprecated
  public static final String PATH_PROPERTY = "logging.path";

  /**
   * The name of the Spring property that contains the name of the log file. Names can
   * be an exact location or relative to the current directory.
   * @since 2.2.0
   */
  public static final String FILE_NAME_PROPERTY = "logging.file.name";

  /**
   * The name of the Spring property that contains the directory where log files are
   * written.
   * @since 2.2.0
   */
  public static final String FILE_PATH_PROPERTY = "logging.file.path";

  private final String file;

  private final String path;

  /**
   * Create a new {@link LogFile} instance.
   * @param file a reference to the file to write
   */
  LogFile(String file) {
    this(file, null);
  }

  /**
   * Create a new {@link LogFile} instance.
   * @param file a reference to the file to write
   * @param path a reference to the logging path to use if {@code file} is not specified
   */
  LogFile(String file, String path) {
    Assert.isTrue(StringUtils.hasLength(file) || StringUtils.hasLength(path), "File or Path must not be empty");
    this.file = file;
    this.path = path;
  }

  /**
   * Apply log file details to {@code LOG_PATH} and {@code LOG_FILE} system properties.
   */
  public void applyToSystemProperties() {
    applyTo(System.getProperties());
  }

  /**
   * Apply log file details to {@code LOG_PATH} and {@code LOG_FILE} map entries.
   * @param properties the properties to apply to
   */
  public void applyTo(Properties properties) {
    put(properties, LoggingSystemProperties.LOG_PATH, this.path);
    put(properties, LoggingSystemProperties.LOG_FILE, toString());
  }

  private void put(Properties properties, String key, String value) {
    if (StringUtils.hasLength(value)) {
      properties.put(key, value);
    }
  }

  @Override
  public String toString() {
    if (StringUtils.hasLength(this.file)) {
      return this.file;
    }
    return new File(this.path, "spring.log").getPath();
  }

加了那个logback-base可以的原因是,点开base.xml

06

客户端与注册中心集成

说实话spring-boot-admin我看过的,基本上都是用在微服务场景比较多,因此后面的内容,我以集成注册中心为核心来讲解示例,通过url配置服务端监控地址就不再论述。

a、 在客户端项目的pom引入eureka-client GAV

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

b、 配置eureka 客户端相关信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
eureka:
  instance:
    instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${spring.application.instance_id:${random.uuid}}
    prefer-ip-address: ${PREFER_IP:false} #是否选择IP注册
 # ip-address: ${IP_ADDRESS:localhost} #指定IP地址注册
    lease-renewal-interval-in-seconds: 5  #续约更新时间间隔(默认30秒),使得eureka及时剔除无效服务
    lease-expiration-duration-in-seconds: 10 #续约到期时间(默认90秒)
    hostname: ${HOSTNAME:${spring.application.name}}
    metadata-map:
      ipAddress: ${spring.cloud.client.ip-address}
      management:
        address: ${spring.cloud.client.ip-address}
  client:
    service-url:
      defaultZone: ${EUREKA_CLIENT_SERVICEURL_DEFAULTZONE:http://localhost:8761/eureka/}
      #缩短延迟向服务端注册的时间、默认40s
    initial-instance-info-replication-interval-seconds: 10
    #提高Eureka-Client端拉取Server注册信息的频率,默认30s
    registry-fetch-interval-seconds: 5

注: 客户端和服务端集成的eureka地址必须得同一个

客户端和服务端同时配置好注册中心后,我们访问一下服务端监控面板

和用url配置服务端地址的效果一样,到这边大体就差不多了。但是实际使用,没那么简单。我们列举几种场景

场景一:客户端的默认端点不是actuator

因为公司有时候会有等保要求,正常是不能直接暴露actuator端点,所以我们客户端,可能会将端点路径改个名字,比如改成如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
management:
  endpoints:
    web:
      base-path: ${MONINTOR_BASE_PATH:/lyb-geek}
      exposure:
        include: "*"

此时通过服务端监控面板访问

会发现爆红了,点击爆红的面板进去

健康检测404,我们可以通过配置注册中心的元数据,示例如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
eureka:
  instance:
    metadata-map:
      management:
        context-path: ${management.endpoints.web.base-path:/actuator}

此时我们再访问服务端监控面板

发现可以正常访问了。

场景二:客户端的actuator需要认证才能访问

当我们没有通过认证,直接访问服务端监控面板时

会出现401,未授权访问,此时我们在注册中心配置形如下内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
eureka:
  instance:
    metadata-map:
      user.name: ${spring.security.user.name}
      user.password: ${spring.security.user.password}

访问服务端监控面板

已经可以正常访问

场景三:客户端通过hostName注册到注册中心,服务端监控面板只显示一个实例

这个场景出现在容器化部署,因为此时hostName和port都一样,因此这个客户端就被当成是同一个。此时通过如下配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
eureka:
  instance:
    metadata-map:
      management:
        address: ${spring.cloud.client.ip-address}

通过配置management.address指定ip

注: 想知道spring-boot-admin可以支持哪些注册中心元数据,可以查看官网

https://docs.spring-boot-admin.com/current/server.html

也看可以查看源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
de.codecentric.boot.admin.server.cloud.discovery.DefaultServiceInstanceConverter

如何为spring-boot-admin集成告警

以集成邮件告警为例,在服务端的POM引入邮件发送的GAV

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

在服务端的application.yml配置邮件发送配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  mail:
    host: ${MAIL_HOST:邮箱服务器地址}
    port:
    username: ${MAIL_USERNAME:邮箱服务器用户名}
    password: ${MAIL_PWD:邮箱服务器密码}
    protocol: ${MAIL_PROTOCOL:smtp}
    default-encoding: UTF-8
    properties:
      mail.smtp.auth: true
      mail.smtp.starttls.enable: true
      mail.smtp.starttls.required: true
      mail.smtp.socketFactory.port: ${MAIL_SMTP_SOCKETFACTORY_PORT:465}
      mail.smtp.socketFactory.class: javax.net.ssl.SSLSocketFactory
      mail.smtp.socketFactory.fallback: false
      mail.smtp.ssl.protocols: ${MAIL_SMTP_SSL_PROTOCOLS:TLSv1}

配置邮件通知接收人和发送人

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  boot:
    admin:
      notify:
        mail:
          to: ${NOTIFY_MAIL_TO:邮箱接收人,多个用,隔开}
          from: ${NOTIFY_MAIL_FROM:邮箱发送人}

当客户端出现异常时,会收到形如下告警

更多告警的玩法可以参考官网

https://docs.spring-boot-admin.com/current/server-notifications.html

3

总结

spring-boot-admin其实核心就做了一件事,就是把Spring Boot Actuators 可视化。本文就不提供demo了,因为官网文档写得很详细,大部分内容都可以从官网

https://docs.spring-boot-admin.com/current/

找到。除了那个日志稍微有点坑

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-10 08:00,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linyb极客之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
SSH 隧道与转发内网穿透(转载)
大家都知道 SSH 是一种安全的传输协议,用在连接服务器上比较多。不过其实除了这个功能,它的隧道转发功能更是吸引人。下面是个人根据自己的需求以及在网上查找的资料配合自己的实际操作所得到的一些心得。 SSH/plink 命令的基本资料 $ ssh -C -f -N -g -L listen_port:DST_Host:DST_port user@Tunnel_Host $ ssh -C -f -N -g -R listen_port:DST_Host:DST_port user@Tunnel_Host $ s
康怀帅
2018/02/28
4.4K1
SSH加密隧道之端口转发
SSH会自动加密和解密所有SSH客户端与服务端之间的网络数据,还能够将其他TCP端口的网络数据通过SSH连接进行转发,并且自动提供了相应的加密及解密服务,这一过程被叫做“SSH隧道” (tunneling)。
糖果
2020/02/17
4K0
SSH加密隧道之端口转发
实习记录(一) - 内网渗透之Neo-reGeorg
如果要使用BurpSuite抓包进行如暴力破解等操作,还需要另外配置一下BurpSuite的代理
Naraku
2021/07/29
2.2K0
实习记录(一) - 内网渗透之Neo-reGeorg
端口转发知多少?局域网向外看,互联网向内传,这一行指令,够了!
本文假设题主在国内出差,公司内部局域网有一台电脑W,可以访问外网。题主有一台云服务器S,有公网IP(2.2.2.2)。下面阐述一下,如何借由S访问W的资源。
程序员小助手
2020/04/08
2.6K0
SSH隧道详解与使用AutoSSH实现稳定的内网穿透
SSH 是一种建立在应用层基础上的安全协议,利用SSH进行数据传输时也是较为可靠和安全的。当有明文数据传输时,为保障其安全,可以利用SSH隧道对其进行加密安全传输,本文中讲到的SSH隧道用法均可以保障安全传输,文中不详做介绍,本文着重讲解除安全传输之外的其他使用场景,来分别分析三种SSH隧道的用法。
冯大仙
2021/11/15
4.8K0
SSH的三种端口转发
最近工作中经常需要ssh登录到某台跳板机,再连接受限网络环境中的某台服务器。以前经常用SSH端口转发这一功能,但周围的同事好像对这个并不清楚,这里记录一下以备其它同事询问。
jeremyxu
2019/03/13
2.5K0
如何设置 SSH 隧道(端口转发)
SSH隧道或SSH端口转发是一种在客户端和服务器机器之间创建加密SSH连接的方法,通过该连接可以中继服务端口。
星哥玩云
2022/07/28
8.5K0
如何设置 SSH 隧道(端口转发)
巧用SSH转发功能深入穿透内网
ssh能够提供客户端到服务端的加密传输,当http、ftp等协议被防火墙所拦截时,可以考虑使用SSH的端口转发功能,将其它TCP端口的网络数据通过SSH连接来转发。
FB客服
2021/02/08
1.7K0
内网渗透测试:隐藏通讯隧道技术
上一节中,我们讲解了网络层的隧道技术(IPv6 隧道、ICMP 隧道)和传输层的隧道技术(TCP 隧道、UDP 隧道、常规端口转发)。现如今,TCP、UDP 通信大量被防御系统拦截,传统的Socket隧道也已经濒临淘汰,DNS、ICMP、HTTP/HTTPS 等难以被禁用的协议已经成为了攻击者控制隧道的主要渠道。在这一节中,我们将对应用层的隧道 SOCKS 代理技术进行实验性的讲解,由于小编能力太菜,很多东东也是现学现卖,应用层的DNS隧道我会在未来专门写一个专题进行讲解。
FB客服
2020/07/13
2.4K0
应用层隧道技术:SSH隧道反向代理(非主流用法)
socks5代理(-D):相当于ss/ssr指定本地“动态”应用程序级端口转发。这通过分配一个套接字来侦听本地端的端口(可选地绑定到指定的bind_address)来实现。每当与此端口建立连接时,该连接都会通过安全通道转发,然后使用应用协议确定从远程计算机连接到的位置。当前支持SOCKS4和SOCKS5协议,而ssh将充当SOCKS服务器。只有root可以转发特权端口。动态端口转发也可以在配置文件中指定
FB客服
2021/09/16
4.5K0
SSH 隧道:端口转发功能详解!
SSH 隧道是一种安全的数据传输方法,它允许我们在不安全的网络上建立一个安全的连接。SSH 隧道提供两大功能:
民工哥
2024/06/17
1.1K0
SSH 隧道:端口转发功能详解!
ProxyChains实现自动添加代理逃避检测
使用爬虫爬取网站或者使用扫描器扫描目标时经常会遇到扫描频率较为频繁导致IP被封或者限制访问的情况,这时候我们就需要考虑利用IP代理的方式不断的变换IP进行爬虫和扫描,从而逃避目标端的检测。这里介绍一款代理工具ProxyChains。 ProxyChains是一个开源代理工具,能够强制使任何应用的TCP连接使用SOCKS4,SOCKS或者HTTP(S)代理进行连接。首先简单介绍一下ProxyChains的使用。 Kali中自带ProxyChains,也可以从https://github.com/rofl0r/
FB客服
2018/02/24
3.2K0
ProxyChains实现自动添加代理逃避检测
利用SSH隧道技术穿越内网访问远程设备
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/11903758.html
叶余
2019/11/21
4.3K0
挖了一条网络隧道,差点被公司激活
你是否常常遇到这些个麻烦,因为公司安全策略的问题,每次要通过跳板机而不能直接连开发环境,使用上面已经搭建好的数据库服务。为了方便发布,自己电脑上的服务别人,不能让开发环境的机器直接连上测试。还有我们在星巴克喝着咖啡连着免费wifi的时候,会不会网络请求都被黑客抓包下来?
机智的程序员小熊
2019/05/13
3.2K1
挖了一条网络隧道,差点被公司激活
使用Proxychain4进行网络代理
学校的个人账号只能在一台设备上进行认证联网,但是我们使用的 GPU 服务器经常需要访问互联网,在服务器上认证之后我们自己的电脑就会掉线,所以可以通过代理的方式让服务器通过我们自己的设备进行联网,解决这个问题。
棒棒鸡不棒
2023/03/20
2.9K0
SSH隧道端口转发功能详解
ssh隧道大致可以分为3种,分别为本地端口转发,远程端口转发,动态端口转发,本文将让你彻底搞懂这3个转发的命令表达形式,让你能够灵活运用解决生活中的各种特殊场景。
Lcry
2022/11/29
2.5K0
SSH隧道端口转发功能详解
内网渗透之各种正反向内网穿透、端口转发(http,socks5)- 渗透红队笔记
在我们拿下一个Webshell的时候,我们没办法把一些工具上传到目标服务器上去使用,那样可能会有风险,而且有的时候还没有特定的环境来使用工具。这个时候我们就可以使用内网穿透来吧服务器的流量代理到本地,就相当于我们是在内网环境,我们就可以使用自己PC上的工具对内网进行扫描,内网渗透,域渗透等等。
渗透攻击红队
2020/11/25
5.3K0
内网渗透之各种正反向内网穿透、端口转发(http,socks5)- 渗透红队笔记
SSH端口转发
让我们先来了解一下端口转发的概念吧。我们知道,SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还同时提供了一个非常有用的功能,这就是端口转发。它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程有时也被叫做“隧道”(tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果您工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,那么也是能够通过将 TCP 端口转发来使用 SSH 进行通讯。总的来说 SSH 端口转发能够提供两大功能:
用户4877748
2020/07/22
3.1K0
SSH端口转发
ATT&CK视角下的红蓝对抗:五. 内网穿透之利用HTTP协议进行隧道穿透
ATT&CK视角下的红蓝对抗:四. 内网穿透之通过Earthworm(EW)进行隧道穿透
一只特立独行的兔先生
2023/11/02
1.7K1
ATT&CK视角下的红蓝对抗:五. 内网穿透之利用HTTP协议进行隧道穿透
内网渗透之隐藏通信隧道 -- sock5
SOCKS是一种代理服务,可以简单地将一端的系统连接另一 端。 SOCKS支持多种协议,包括HTTP、FTP等。SOCKS分为SOCKS 4和SOCKS 5两种类型: SOCKS 4只支持TCP协议;SOCKS5不仅支持TCP/UDP协议,还支持各种身份验证机制等,其标准端口为1080.SOCKS能够与目标内网计算机进行通信,避免多次使用端口转发。
Gh0st1nTheShel
2021/11/23
5.7K0
推荐阅读
相关推荐
SSH 隧道与转发内网穿透(转载)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档