2023年2月

作者:顾娟
链接:https://www.zhihu.com/question/314745822/answer/1183812295
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

绝大多数企业为了防止内部核心数据泄露,都实施了内外网隔离,甚至在内部网络中又划分出了研发网、办公网、生产网等。主要目的和场景是这样的:

绝大多数企业采取的第一个步骤是将企业内网与互联网进行隔离,将内部数据“困在”内网,同时也能够有效屏蔽外部网络攻击的风险。

内外网隔离,本质上隔离的是“自己人”与“外人”,具有较强的安全敏感性。有条件的企业可能会在内外网边界部署DLP(数据防泄漏)系统,所有内部向外部发出的数据(如电子邮件),都要经过DLP系统的内容扫描,在确保不包含敏感信息的情况下才允许发出。

较大规模的企业还可能对内部网络实施进一步的隔离,比如划分为办公网、研发网、生产网、测试网等,主要用来屏蔽不同部门、不同业务之间的违规数据交换。

内部子网隔离,本质上解决的是“人民内部矛盾”,其敏感性因业务不同而有所差别。比如,研发网内的核心知识产权数据、生产网内的真实用户隐私数据,即便只是流入到内部办公网,也可能造成较大的安全风险。

隔离的方式也有很多,主要如下:

  • DMZ(Demilitarized Zone,隔离区)它是为了解决安装防火墙后外部网络的访问用户不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间的缓冲区。

  • 在一台物理主机上安装两个网卡,一个连接内部网络,一个连接外部网络。

  • 在内部网和外部网之间、专用网公共网之间的边界上构造的保护屏障。在两个网络之间架设防火墙,默认阻断所有跨网通信。

  • 如果企业已经实施了虚拟化平台,可以在虚拟化平台内构造两个虚拟子网(比如一个办公虚拟子网,一个研发虚拟子网),两个虚拟子网子网间不连通。

  • 网闸/光闸是专用的网络隔离设备,其隔离安全性最高,基本原理是阻断网络通信协议,在内部采用私有通信协议,同一时间只连接一个网络,轮流连接两个网络进行数据摆渡

以上都是个人的一些看法,如果想要进一步了解的话,推荐看看《企业网络隔离建设指南》这个资料,免费下载的,可供参考。


企业局域网内外网分离方案

一些企事业单位出于安全考虑,需要做内外网分离。举例来说,需要达到如下的技术要求:

  1. 生产网、办公网、外网三网隔离。

  2. 启用网络准入,对非规定允许接入的设备禁止其接入网络。

  3. 上网数据留存。

在本文中,我将结合WSG上网行为管理来阐述如何实现内外网分离。

1. 划分VLAN使生产网、办公网、外网三网隔离

要实现三网隔离,首先需要创建三个VLAN,分别是生产网段、办公网段、外网网段(wifi)。并且对每个网段设置不同的网络权限。具体步骤如下:

企业局域网内外网分离方案

 

然后配置防火墙策略,禁止网段之间的互访。

企业局域网内外网分离方案

 

2. 配置各网段的外网策略

2.1 完全禁止生产网段访问外网

企业局域网内外网分离方案

 

2.2 办公网段采用严格的IP-mac绑定,只有允许的终端设备才可以接入

企业局域网内外网分离方案

 

2.3 对外网WiFi开启实名认证,并且记录上网内容。

企业局域网内外网分离方案

 


企业局域网内外网分离方案

 

经过上述配置后,即可满足局域网内外网分离的安全需要,并且实现全网上网行为管理和上网日志审计,大幅度提高企事业的网络安全。


作为一名从事网络数据通信的技术员、管理员,应该掌握IP地址与子网掩码的作用,并且应该知道:怎么计算ip地址的子网掩码和子网掩码计算可用ip范围,划分网段等基础操作,下面IT备忘录小编就给大家详细的解答下IP与子网掩码的算法,并将简单的公式分享给大家。

怎么计算ip地址的子网掩码 子网掩码计算可用ip范围【算法详解】

常规情况下,供主机使用的IP地址为三类:A类地址、B类地址、C类地址,下面我们就以这三类地址给大家举例做算法介绍:

C类地址举例:

192.168.1.0/26

计算要求:

1、能划分为几个子网

2、每个子网有多少地址可用

3、每个子网的地址起止范围,网络地址和广播地址

得出下列参数:

1、借位数: 2

什么是借位数?

以IP地址属于哪类地址,根据所属类地址的默认子网掩码位数,来计算借位数,比如:C类地址,默认子网掩码为:255.255.255.0,二进制表示方法:11111111.11111111.11111111.00000000(换算成二进制就是:/24位,里面有24个1,大家可以根据实际情况自行计算)。

2、剩余位数: 6

什么是剩余位数?

在IPV4中,子网掩码总长度为:32位(也是二进制长度),计算方式:子网掩码总长度(32)-子网掩码长度(26)=6。

计算公式:

1、划分的子网数: 2^借位数=4

2、每个子网可用地址: 2^剩余位数-2=62

3、列出结果:

192.168.1.0/26 192.168.1.1-192.168.1.62 192.168.1.63

192.168.1.64/26 192.168.1.65-192.168.1.126 192.168.1.127

192.168.1.128/26 192.168.1.129-192.168.1.190 192.168.1.191 

192.168.1.192/26 192.168.1.193-192.168.1.254 192.168.1.255

备注:每个子网第一个IP地址为:网络地址,最后一个为:广播地址,中间范围内的地址为:IP地址可用范围。

B类地址举例:

172.16.0.0/18

1、能划分为几个子网

2、每个子网有多少地址可用

3、每个子网的地址起止范围,网络地址和广播地址

得出下列参数:

1、借位数: 2

2、剩余位数: 14

3、借位段剩余位数: 6

什么是借位段剩余位数?

默认B类地址子网掩码为:16位(255.255.0.0),该例子向后面C类IP地址段子网掩码借了2位,子网掩码位数:18位,C类地址子网掩码位数为:24位,24-18=6 或者 8-2=6,(因为每段二进制掩码长度为:8)。

计算公式: 

1、划分的子网数: 2^借位数=4

2、每个子网可用地址: 2^剩余位数- 2=16382

3、每两个子网的间隔位数: 2^借位段剩余位数=64

4、列出结果:

172.16.0.0/18 172.16.0.1-172.16.63.254 172.16.63.255

172.16.64.0/18 172.16.64.1-172.16.127.254 172.16.127.255

172.16.128.0/18 172.16.128.1-172.16.191.254 172.16.191.255

172.16.1920/18 172.16.192.1-172.16.255.254 172.16.255.255

A类地址举例:

100.0.0.0/11

得出下列参数:

1、借位数: 3

2、剩余位数:21

3、借位段剩余位数: 5

计算公式:

1.划分的子网数: 2^借位数=8

2.每个子网可用地址: 2^剩余位数-2=

3.每两个子网的间隔位数: 2^借位段剩余位数=32

4.列出结果:

100.0.0.0/ 11 100.0.0.1- 100.31.255.254 100.31.255.255

100.32.0.0/11 (后面的大家自己算,只有这样你才能记住算法,加深印象

100.64.0.0/11

100.96.0.0/11

100.128.0.0/11

100.160.0.0/11

100.192.0.0/11

100.224.0.0/11

大家还可以参考:子网掩码对照表


  关于ip以及相关的掩码、网络号等概念可以查看相关的博客、资料,这些东西很容易找着,一搜一大片。本文主要记录通过实例进行ip相关的计算。

我自己使用的在线网络计算器地址:https://www.sojson.com/convert/subnetmask.html

例子:

  已知有IP 59.108.14.0,28位掩码,求其掩码、可容纳主机、可用地址、网络地址、广播地址、可用IP范围。

分析:

  59段属于A类网络,默认网络位7位,主机号24位。

解答:

  将59.108.14.0转换为二进制,为00111011 01101100 00001110 00000000

  因为主机号有四位,网络号有28位,所以掩码为11111111 11111111 11111111 11110000,转换为10进制即为255.255.255.240;

  可容纳主机数为24=16位,可用主机为24-2=14位;

  网络地址主机号全为0,因此网络地址为00111011 01101100 00001110 00000000,二进制为59.108.14.0;

  广播地址主机位全为1,因此广播地址为00111011 01101100 00001110 00001111,二进制为59.108.14.15;

  则可用ip地址范围为59.108.14.1-59.108.14.14;

  另外,将ip和掩码的二进制进行与运算亦可得网络地址:

  


  

  二进制为59.108.14.0

  此外,若ip同样是59.108.14.0, 但可用主机要求为36位,其网络号、主机号、掩码、网络地址、广播地址、可用地址段分别为多少?

  主机要求36位,25=32<36<26=64,要满足主机要求,主机号取6,此时可容纳主机位为26=64位,可用主机64-2=62位,能满足要求。网络位有32-6=26;

掩码为 11111111 11111111 11111111 11000000,十进制为255.255.255.192;

网络地址00111011 01101100 00001110 00000000,二进制为59.108.14.0;

广播地址00111011 01101100 00001110 00111111,二进制为59.108.14.63,;

可用地址范围 59.108.14.1-59.108.14.62;


springcloud-alibaba-demo

参考博客:https://www.jianshu.com/p/9a8d94c0c90c

项目地址:https://github.com/MoreBetterShare/springcloud-alibaba/tree/master

项目创建

  1. 父级创建maven的pom项目

  2. 模块创建springboot项目

  3. 公共模块创建maven项目

nacos注册中心

下载地址:https://github.com/alibaba/nacos/releases

window

安装使用
  • 启动:双击安装根目录bin/startup.cmd

  • 测试url:http://127.0.0.1:8848/nacos/

  • 配置:添加依赖,在application.yml或.properties如下配置

spring.cloud.nacos.discovery.server-addr:127.0.0.1:8848

 <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
  • 相关服务在主启动类中添加:@EnableDiscoveryClient

经过上面的配置之后,在测试地址中便可以看到相关的服务

添加提供者模块

  • 主启动类添加@EnableDiscoveryClient

消费者配置文件

#配置端口号
server:
  port: 8083
#配置该服务名称
spring:
  application:
    name: nacos-provider
#配置nacos地址
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

#actutor暴露端口
management:
  endpoints:
    web:
      exposure:
        include: "*"
#配置日志
logging:
  level:
    com.cy: debug

添加消费者模块

  • 主启动类添加@EnableDiscoveryClient

  • 实现远程服务调用

    • 配置远程调用restTemplet

@Configuration
public class ConsumerConfiguration {

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
  • 实现负载均衡:LoadBalancerClient

@RestController
public class ConsumerController {
    /**负载均衡客户端*/
    @Autowired
    private LoadBalancerClient balancerClient;

    /** restful类型的请求对象 */
    @Autowired
    private RestTemplate restTemplate;

    @Value("${spring.application.name}")
    private String name;

    @GetMapping(value = "/test/name")
    public String test(){
        ServiceInstance serviceInstance = balancerClient.choose("nacos-provider");
        String url = String.format("http://%s:%s/test/%s",serviceInstance.getHost(),serviceInstance.getPort(),name);
        return restTemplate.getForObject(url,String.class);
    }
}

feign声明式客户端:实现降级熔断

使用

  • 添加依赖

 <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 主启动类添加@EnableDiscoveryClient和@EnableFeignClients

  • 声明服务接口,直接调用提供者@FeignClient(value="nacos-provider")

  • 熔断实现写xxxFallback类继承上面的接口,并修改@FeignClient(value="nacos-provider",Fallback=xxxFallback.class)

  • 添加配置防止后面解析string报错

@SpringBootConfiguration
public class FeignConfig {
    @Bean
    public Decoder feignDecoder() {
        return new ResponseEntityDecoder(new SpringDecoder(feignHttpMessageConverter()));
    }

    public ObjectFactory<HttpMessageConverters> feignHttpMessageConverter() {
        final HttpMessageConverters httpMessageConverters = new HttpMessageConverters(new GateWayMappingJackson2HttpMessageConverter());
        return new ObjectFactory<HttpMessageConverters>() {
            @Override
            public HttpMessageConverters getObject() throws BeansException {
                return httpMessageConverters;
            }
        };
    }

    public class GateWayMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
        GateWayMappingJackson2HttpMessageConverter(){
            List<MediaType> mediaTypes = new ArrayList<>();
            mediaTypes.add(MediaType.valueOf(MediaType.TEXT_HTML_VALUE + ";charset=UTF-8"));
            setSupportedMediaTypes(mediaTypes);
        }
    }

}

消费者配置文件:application.yml

#配置该服务名称
spring:
  application:
    name: nacos-feign

#配置nacos注册中心
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
#配置仪表盘
    sentinel:
      transport:
        port: 8719
        dashboard: localhost:8080

#配置启动端口
server:
  port: 8082

#检测端口
management:
  endpoints:
    web:
      exposure:
        include: "*"

#配置sentinel实现熔断
feign:
  sentinel:
    enabled: true

sentinel控制台:仪表盘

java -jar D:\810chengData\projectManage\sentinel-dashboard.jar

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
  • 配置

spring.cloud.sentinel.transport.port: 8719
spring.cloud.sentinel.transport.dashbord: localhost:8080
  • 保证客户端有一定的访问量,然后进入仪表盘查看

gateway网关

  • 添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
  • 主启动类添加:@EnableDiscoveryClient和@EnableFeignClients

启动项目,先访问网关,然后由网关调用配置的服务

  • 添加过滤配置

@Component
public class AuthFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getQueryParams().getFirst("token");
        if(token == null ||token.isEmpty()){
            ServerHttpResponse response = exchange.getResponse();
            HashMap<String, Object> responseMap = Maps.newHashMap();
            responseMap.put("code",401);
            responseMap.put("message","非法请求");
            responseMap.put("cause","token is empty");

            try {
                ObjectMapper objectMapper = new ObjectMapper();
                byte[] bytes = objectMapper.writeValueAsBytes(responseMap);
                DataBuffer wrap = response.bufferFactory().wrap(bytes);
                response.setStatusCode(HttpStatus.UNAUTHORIZED);
                response.getHeaders().add("Content-Type","application/json;charset=UTF-8");
                return response.writeWith(Mono.just(wrap));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }

        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
    }
}

网关配置文件

spring:
  application:
    name: springcloud-gateway
#nacos注册中心
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
#配置仪表盘
    sentinel:
      transport:
        port: 8720
        dashboard: localhost:8080
#配置网关
    gateway:
      discovery:
        locator:
          enabled: true
      #配置路由规则
      routes:
        #采用自定义路由ID
        - id: NACOS-CONSUMER
          #采用LoadBalanceClient方式请求,
          #以lb://开头,后面是注册在nacos中的服务名
          uri: lb://nacos-consumer
          predicates:
            - Method=GET,POST
        - id: NACOS-FEIGN
          uri: lb://nacos-feign
          predicates:
            - Method=GET,POST
server:
  port: 8086

feign:
  sentinel:
    enabled: true

management:
  endpoints:
    web:
      exposure:
        include: "*"

#配置日志
logging:
  level:
    com.cy: debug

访问测试:

http://localhost:9000/nacos-consumer-feign/test/hi

http://localhost:9000/nacos-consumer/test/app/name

nacos配置中心

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  • 创建bootstrap.properties,并移动yml文件到nacos中,并删除原项目中的yml文件

  • 修改bootstrap.properties如下

#对应nacos config中的DataID
spring.application.name=nacos-provider-config
#配置文件类型
spring.cloud.nacos.config.file-extension= yaml
#配置nacos config地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
  • 配置完成后重启nacos,进行访问测试

开发过程中:服务提供者会提供接口供服务消费者进行调用

报错汇总


Description:

Parameter 0 of method modifyResponseBodyGatewayFilterFactory in org.springframework.cloud.gateway.config.GatewayAutoConfiguration required a bean of type 'org.springframework.http.codec.ServerCodecConfigurer' that could not be found.

spring-boot-start-web与gateway产生了冲突,将spring-boot-start-web注掉可解决

  1. 参考博客:https://blog.csdn.net/lizz861109/article/details/105707590