设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客

企业应用开源防火墙安全保障实战演练:PartII

2013-7-16 10:38| 发布者: joejoe0332| 查看: 2685| 评论: 0|原作者: 李洋|来自: ibm

摘要:   实战应用 IPTables 完成 NAT 功能  NAT 简介  在传统的标准的 TCP/IP 通信过程中,所有的路由器仅仅是充当一个中间人的角色,也就是通常所说的存储转发,路由器并不会对转发的数据包进行修改,更为确切的说 ...

  实战应用 IPTables 完成 NAT 功能


  NAT 简介


  在传统的标准的 TCP/IP 通信过程中,所有的路由器仅仅是充当一个中间人的角色,也就是通常所说的存储转发,路由器并不会对转发的数据包进行修改,更为确切的说,除了将源 MAC 地址换成自己的 MAC 地址以外,路由器不会对转发的数据包做任何修改。NAT(Network Address Translation)恰恰是出于某种特殊需要而对数据包的源 IP 地址、目的 IP 地址、源端口、目的端口进行改写的操作。


  一般说来,有如下几种情况下需要做 NAT:

  • 为用户群提供 Internet 接入服务:为了方便管理,ISP 分配给用户的 IP 地址都是伪 IP,但是部分用户要求建立自己的 WWW 服务器对外发布信息,这时候我们就可以通过 NAT 来提供这种服务了。我们可以在防火墙的外部网卡上绑定多个合法 IP 地址,然后通过 NAT 技术使发给其中某一个 IP 地址的包转发至内部某一用户的 WWW 服务器上,然后再将该内部 WWW 服务器响应包伪装成该合法 IP 发出的包。
  • 使用拨号上网的网吧:因为只有一个合法的 IP 地址,必须采用某种手段让其他机器也可以上网,通常是采用代理服务器的方式,但是代理服务器,尤其是应用层代理服务器,只能支持有限的协议,如果过了一段时间后又有新的服务出来,则只能等待代理服务器支持该新应用的升级版本。如果采用 NAT 来解决这个问题,因为是在应用层以下进行处理,NAT 不但可以获得很高的访问速度,而且可以无缝的支持任何新的服务或应用。
  • 还有一个方面的应用就是重定向,也就是当接收到一个包后,不是转发这个包,而是将其重定向到系统上的某一个应用程序。最常见的应用就是和 squid 配合使用成为透明代理,在对 HTTP 流量进行缓存的同时,可以提供对 Internet 的无缝访问。


  NAT 的原理


  Linux 将 NAT 分成了两种类型,即源 NAT(SNAT) 和目的 NAT(DNAT),顾名思义,所谓 SNAT 就是改变转发数据包的源地址,所谓 DNAT 就是改变转发数据包的目的地址。前面提到过,Netfilter 是 Linux 核心中一个通用架构,它提供了一系列的"表"(tables),每个表由若干"链"(chains) 组成,而每条链中可以有一条或数条规则 (rule) 组成。并且系统缺省的表是"filter"。但是在使用 NAT 的时候,我们所使用的表不再是"filter",而是"nat"表,所以我们必须使用"-t nat"选项来显式地指明这一点。因为系统缺省的表是"filter",所以在使用 filter 功能时,我们没有必要显式的指明"-t filter"。同 filter 表一样,nat 表也有三条缺省的"链"(chains),这三条链也是规则的容器,它们分别是:

  • PREROUTING:可在这里定义进行目的 NAT 的规则,因为路由器进行路由时只检查数据包的目的 IP 地址,所以为了使数据包得以正确路由,我们必须在路由之前就进行目的 NAT;
  • POSTROUTING:可以在这里定义进行源 NAT 的规则,系统在决定了数据包的路由以后再执行该链中的规则;
  • OUTPUT: 定义对本地产生的数据包的目的 NAT 规则。


  如前所述,在使用 iptables 的 NAT 功能时,我们必须在每一条规则中使用"-t nat"显示的指明使用 nat 表。然后使用以下的选项:


  (1)对规则的操作

  • 加入 (append) 一个新规则到一个链 (-A) 的最后。
  • 在链内某个位置插入 (insert) 一个新规则 (-I),通常是插在最前面。
  • 在链内某个位置替换 (replace) 一条规则 (-R)。
  • 在链内某个位置删除 (delete) 一条规则 (-D)。
  • 删除 (delete) 链内第一条规则 (-D)。


  (2)指定源地址和目的地址


  通过 --source/--src/-s 来指定源地址 ( 这里的 / 表示或者的意思,下同 ),通过 --destination/--dst/-s 来指定目的地址。可以使用以下四中方法来指定 IP 地址:

  • 使用完整的域名,如“www.tsinghua.edu”;
  • 使用 IP 地址,如“172.168.92.10”;
  • 用 IP 地址 / 子网掩码指定一个网络地址,如“192.168.1.0/255.255.255.0”;
  • 用 IP 地址 / 子网掩码的位数指定一个网络地址,如“192.168.1.0/24”这里的 24 表明了子网掩码的有效位数,这是 Linux 环境中通常使用的表示方法。缺省的子网掩码数是 32,也就是说指定 172.168.92.10 等效于 172.168.92.10/32。


  (3)指定网络接口


  可以使用 --in-interface/-i 或 --out-interface/-o 来指定网络接口。从 NAT 的原理可以看出,对于 PREROUTING 链,我们只能用 -i 指定进来的网络接口 ; 而对于 POSTROUTING 和 OUTPUT 我们只能用 -o 指定出去的网络接口。


  (4)指定协议及端口


  可以通过 --protocol/-p 选项来指定协议,如果是 udp 和 tcp 协议,还可使用 --source-port/--sport 和 --destination-port/--dport 来指明端口。


  NAT 具体使用


  源地址 NAT


  (1)标准的 SNAT


  SNAT 的目的是进行源地址转换,应用于 POSTROUTING 规则链。在路由决定之后应用 SNAT 与出站接口相关 , 而不是入站接口。语法如下:

 #iptables -t nat -A POSTROUTING -o <outgoing interface> -j SNAT \ --to-source <address>[-<address>][:port-port] 

 

  (2)MASQUERADE 源 NAT

  MASQUERADE 没有选项来指定在 NAT 设备上使用的特定源地址,使用的源地址就是出站好接口的地址。

 #iptables -t nat -A POSTROUTING -o <outgoing interface> -j MASQUERADE \ [--to-ports <port>[-port]] 

 

  举一个简单的例子:更改所有来自 192.168.1.0/24 的数据包的源 IP 地址为 1.2.3.4:

 #iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 1.2.3.4

 

  这里需要注意的是,系统在路由及过虑等处理直到数据包要被送出时才进行 SNAT。


  另外,有一种 SNAT 的特殊情况是 IP 欺骗,也就是所谓的 Masquerading,通常建议在使用拨号上网的时候使用,或者说在合法 IP 地址不固定的情况下使用。比如:

 # iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 

 

  可以看出,这时候我们没有必要显式的指定源 IP 地址等信息。


  目的地址 NAT


  目的地址 NAT 有两种形式:DNAT 和 REDIRECT。REDIRECT 是目的地址转换的特殊形式,将数据包重定向到 NAT 设备的输入或回环接口。目的地址 NAT 应用于 nat 表的 PREROUTING 和 OUTPUT 规则链,在做出路由决定前对目的地址进行修改。在 PREROUTING 中,DNAT 和 REDIRECT 规则与用来接受通过本地路由转发或送到主机的入站接口的数据包的入站接口有关。在 OUTPUT 中,DNAT 和 REDIRECT 规则用来处理来自 NAT 主机本身生成的出站数据包。


(1)标准目的地址 NAT(DNAT)

 #iptables -t nat -A PREROUTING -i <incoming interface> -j DNAT \ --to-destination <address>[-<address>][:port-port]  #iptables -t nat -A OUTPUT -o <outgoing interface> -j DNAT \ --to-destination <address>[-<address>][:port-port] 

 

目的地址用来替换数据包中的原始目的地址和多位本地服务器地址。


(2)REDIRECT

 #iptables -t nat -A PREROUTING -i <incoming interface> \ -j REDIRECT [--to-ports <port>[-port]]  #iptables -t nat -A OUTPUT -o <outgoing interface> \ -j REDIRECT [--to-ports <port>[-port]] 

 

REDIRECT 重定向数据包到执行 REDIRECT 操作的那台主机。

举个简单的例子:更改所有来自 192.168.1.0/24 的数据包的目的 IP 地址为 1.2.3.4:

 #iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth1 -j DNAT --to 1.2.3.4 

 

  这里需要注意的是,系统是先进行 DNAT,然后才进行路由及过虑等操作。有一种 DNAT 的特殊情况是重定向,也就是所谓的 Redirection,这时候就相当于将符合条件的数据包的目的 IP 地址改为数据包进入系统时的网络接口的 IP 地址。通常是在与 Squid( 一种开源代理服务器 ) 配置形成透明代理时使用,假设 Squid 的监听端口是 3128,我们可以通过以下语句来将来自 192.168.1.0/24,目的端口为 80 的数据包重定向到 Squid 监听端口:

 #iptables -t nat -A PREROUTING -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 / -j REDIRECT --to-port 3128 

 

  一个具体的应用实例


  为了更加系统和全面地介绍 NAT 的使用,下面举一个实际的例子来进行说明。假设有一家 ISP 提供园区 Internet 接入服务,为了方便管理,该 ISP 分配给园区用户的 IP 地址都是私网 IP,通过该私网 IP 用户无法向外发布信息。但是,部分用户要求建立自己的 WWW 服务器对外发布信息。我们可以再防火墙的外部网卡上绑定多个合法 IP 地址,然后通过 IP 映射使发给其中某一个 IP 地址的包转发至内部某一用户的 WWW 服务器上,然后再将该内部 WWW 服务器响应包伪装成该合法 IP 发出的包。


  具体的 IP 分配如下:


(1)该 ISP 分配给 A 单位 www 服务器的 IP 为:

私网 IP:172.168.92.100

公网 IP:210.95.33.100

(2)该 ISP 分配给 B 单位 www 服务器的 IP 为:

私网 IP:172.168.92.200

公网 IP:210.95.33.200

(3)Linux 防火墙的 IP 地址分别为:

内网接口 eth1:172.168.92.10

外网接口 eth0:210.95.33.1

然后,我们需要进行如下步骤地操作:

(1)将分配给 A、B 单位的真实 IP 绑定到防火墙的外网接口,以 root 权限执行以下命令:

 #ifconfig eth0 add 210.95.33.100 netmask 255.255.255.0  #ifconfig eth0 add 210.95.33.200 netmask 255.255.255.0 

 

(2)成功升级内核后安装 IPTables,然后执行以下脚本载入相关模块:

 modprobe ip_tables  modprobe ip_nat_ftp 

 

(3)对防火墙接收到的目的 IP 地址为 210.95.33.100 和 210.95.33.200 的所有数据包进行 DNAT:

 #iptables -A PREROUTING -i eth0 -d 210.95.33.100 -j DNAT --to 172.168.92.100  #iptables -A PREROUTING -i eth0 -d 210.95.33.200 -j DNAT --to 172.168.92.200 

 

(4)对防火墙接收到的源 IP 地址为 172.168.92.100 和 172.168.92.200 的数据包进行 SNAT:

 #iptables -A POSTROUTING -o eth0 -s 172.168.92.100 -j SNAT --to 210.95.33.100  #iptables -A POSTROUTING -o eth0 -s 172.168.92.200 -j SNAT --to 210.95.33.200 

 

  这样,所有目的 IP 为 210.95.33.100 和 210.95.33.200 的数据包都将分别被转发给 172.168.92.100 和 172.168.92.200; 而所有来自 172.168.92.100 和 172.168.92.200 的数据包都将分别被伪装成由 210.95.33.100 和 210.95.33.200,从而也就实现了 IP 映射。



  实战应用 DMZ


  DMZ 原理


  DMZ 是英文“DeMilitarized Zone”的缩写,中文名称为“隔离区”,也称“非军事化区”。它是为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间的缓冲区,这个缓冲区位于企业内部网络和外部网络之间的小网络区域内,在这个小网络区域内可以放置一些必须公开的服务器设施,如企业 Web 服务器、FTP 服务器和论坛等。另一方面,通过这样一个 DMZ 区域,更加有效地保护了内部网络,因为这种网络部署,比起一般的防火墙方案,对攻击者来说又多了一道关卡。网络结构如图 1 所示。网络设备开发商利用这一技术,开发出了相应的防火墙解决方案。DMZ 通常是一个过滤的子网,DMZ 在内部网络和外部网络之间构造了一个安全地带。


  图 1.DMZ 示意图


图 1 DMZ 示意图
 

  DMZ 防火墙方案为要保护的内部网络增加了一道安全防线,通常认为是非常安全的。同时它提供了一个区域放置公共服务器,从而又能有效地避免一些互联应用需要公开,而与内部安全策略相矛盾的情况发生。在 DMZ 区域中通常包括堡垒主机、Modem 池,以及所有的公共服务器,但要注意的是电子商务服务器只能用作用户连接,真正的电子商务后台数据需要放在内部网络中。在这个防火墙方案中,包括两个防火墙,外部防火墙抵挡外部网络的攻击,并管理所有内部网络对 DMZ 的访问。内部防火墙管理 DMZ 对于内部网络的访问。内部防火墙是内部网络的第三道安全防线 ( 前面有了外部防火墙和堡垒主机 ),当外部防火墙失效的时候,它还可以起到保护内部网络的功能。而局域网内部,对于 Internet 的访问由内部防火墙和位于 DMZ 的堡垒主机控制。在这样的结构里,一个黑客必须通过三个独立的区域 ( 外部防火墙、内部防火墙和堡垒主机 ) 才能够到达局域网。攻击难度大大加强,相应内部网络的安全性也就大大加强,但投资成本也是最高的。


  构建 DMZ


  构建原则


  Linux 从 2.4 内核开始,正式使用 IPTables 来代替以前的 Ipfwadm 和 Ipchains,实现管理 Linux 的包过滤功能。Linux 的包过滤通过一个叫 Netfilter 的内核部件来实现。Netfilter 内建了三个表,其中默认表 Filter 中又包括 3 个规则链,分别是负责外界流入网络接口的数据过滤的 INPUT 链、负责对网络接口输出的数据进行过滤的 OUTPUT 链,以及负责在网络接口之间转发数据过滤的 FORWARD 链。


  要在 Linux 系统中构建一个带 DMZ 的防火墙,需要利用对这些链的设定完成。首先要对从连接外部网络的网卡 (eth0) 上流入的数据进行判断,这是在 INPUT 链上完成。如果数据的目标地址属于 DMZ 网段,就要将数据转发到连接 DMZ 网络的网卡 (eth1) 上 ; 如果是内部网络的地址,就要将数据转发到连接内部网络的网卡 (eth2) 上。表 1 显示了各个网络之间的访问许可关系:


表 1.DMZ 和内外网的访问关系

  内网 外网 DMZ
内网 / 允许 允许
外网 禁止 / 允许
DMZ 禁止 禁止 /

 

  根据表 1,可以明确以下六条访问控制策略:


  • 内网可以访问外网:内网的用户显然需要自由地访问外网。在这一策略中,防火墙需要进行源地址转换。
  • 内网可以访问 DMZ:此策略是为了方便内网用户使用和管理 DMZ 中的服务器。
  • 外网不能访问内网:内网中存放的是公司内部数据,这些数据不允许外网的用户进行访问。
  • 外网可以访问 DMZ:DMZ 中的服务器本身就是要给外界提供服务的,所以外网必须可以访问 DMZ。同时,外网访问 DMZ 需要由防火墙完成对外地址到服务器实际地址的转换。
  • DMZ 不能访问内网:很明显,如果违背此策略,则当入侵者攻陷 DMZ 时,就可以进一步进攻到内网的重要数据。
  • DMZ 不能访问外网:此条策略在有的情况下可能会有例外,比如 DMZ 中放置邮件服务器时,就需要访问外网,否则将不能正常工作。


  DMZ 的具体实现


  根据以上访问控制策略可以设定 Linux 防火墙的过滤规则。下面将在一个虚构的网络环境中,探讨如何根据以上六条访问控制策略建立相应的防火墙过滤规则。这里的讨论和具体应用会有所区别,不过这种讨论将有助于实际应用。用户在实际应用时可根据具体的情况进行设置。该虚拟环境的网络拓扑如图 2 所示。


  图 2.DMZ 网络拓扑图


图 2 DMZ 网络拓扑图
 

  如图 2 所示,路由器连接 Internet 和防火墙。作为防火墙的 Linux 服务器使用三块网卡:网卡 eth0 与路由器相连,网卡 eth1 与 DMZ 区的 Hub 相连,网卡 eth2 与内网 Hub 相连。作为一个抽象的例子,我们用“[ 内网地址 ]”来代表“192.168.1.0/24”之类的具体数值。同理还有“[ 外网地址 ]”和“[DMZ 地址 ]”。


  对于防火墙,原则之一就是默认禁止所有数据通信,然后再打开必要的通信。所以在防火墙脚本的最初,需要清空系统原有的规则,然后将 INPUT、OUTPUT、FORWARD 的默认规则设置为丢弃所有数据包。


  (1)防火墙基本设置


  对应的防火墙脚本片段如下: # Flush out the tables and delete alluser-definedchains /sbin/iptables -F /sbin/iptables -X /sbin/iptables -t nat -F /sbin/iptables -t nat – X # Drop every packet /sbin/iptables -P INPUT DROP /sbin/iptables -P OUTPUT DROP /sbin/iptables -P FORWARD DROP

 

2)六种策略的具体实现

1)内网可以访问外网

对应的防火墙脚本片段如下:

 /sbin/iptables -t nat -A POSTROUTING -s [ 内网地址 ] -d [ 外网地址 ] / -oeth0-j SNAT --to [NAT 的真实 IP] 

 

  当数据从连接外网的 eth0 流出时,要将来自内网的数据包的源地址改成 Internet 上的真实 IP,这样才能和外网的主机进行通信。“[NAT 的真实 IP]”表示分配给 NAT 用户的真实 IP,有几个就写几个,以空格分开,但至少要写一个。

2)内网可以访问 DMZ

对应的防火墙脚本片段如下:

 /sbin/iptables -A FORWARD -s [ 内网地址 ] -d [DMZ 地址 ] -i eth2-jACCEPT 

 

  以上命令允许所有来自内网、目的地为 DMZ 的数据包通过。

3)外网不能访问内网

对应的防火墙脚本片段如下:

 /sbin/iptables -t nat -A PREROUTING -s [ 外网地址 ] -d [ 内网地址 ] -i eth0-jDROP 

 

以上命令将来自外网、去往内网的数据包全部丢弃。

4)外网可以访问 DMZ

为了保护 DMZ 中的服务器,外网对 DMZ 的访问也要加以限制。通常的思路是,只允许外网访问 DMZ 中服务器所提供的特定服务,比如 HTTP。

对应的防火墙脚本片段如下:

 /sbin/iptables -t nat -A PREROUTING -p tcp --dport 80 / -d[ 分配给 HTTP 服务器的 Internet 上的真实 IP] -s [ 外网地址 ] / -i eth0 -j DNAT--to[HTTP 服务器的实际 IP]  /sbin/iptables -A FORWARD -p tcp -s [ 外网地址 ]/  -d [HTTP 服务器的实际 IP]-ieth0 --dport 80 -j ACCEPT  /sbin/iptables -A FORWARD -p tcp -d [ 外网地址 ] / -s [HTTP 服务器的实际 IP]-ieth1 --sport 80 ! --syn -j ACCEPT  /sbin/iptables -t nat -A PREROUTING -s [ 外网地址 ] / -d [DMZ 地址 ] -ieth0-j DROP 

 

该防火墙脚本片段将开放 HTTP 服务,使得只有访问 DMZ 中 HTTP 服务的数据包才能通过防火墙。

5)DMZ 不能访问内网

对应的防火墙脚本片段如下:

 /sbin/iptables -A FORWARD -s [DMZ 地址 ] -d [ 内网地址 ] -i eth1 – jDROP 

 

以上命令将丢弃所有从 DMZ 到内网的数据包。

6)DMZ 不能访问外网

对应的防火墙脚本片段如下:

 /sbin/iptables -t nat -A POSTROUTING -p tcp --dport 25 -d[ 外网地址 ] / -s [ 邮件服务器的 IP] -o eth0 -j SNAT / --to[ 分配给 SMTP 服务器的 Internet 上的真实 IP]  /sbin/iptables -A FORWARD -p tcp -s [ 邮件服务器的 IP] -d [ 外网地址 ] / -ieth1--dport 25 -j ACCEPT  /sbin/iptables -A FORWARD -p tcp -d [ 邮件服务器的 IP] -s [ 外网地址 ]/ -ieth0--sport 25 ! --syn -j ACCEPT 

 

  以上命令先允许 DMZ 中邮件服务器连接外网的 SMTP 服务端口 (25),然后禁止其它从 DMZ 发往外网的数据包。


  针对以上基本策略例举了实现它们的基本规则。在实际应用中,需要根据具体情况进行设置。只要设置得当,Linux 也能成为很好的防火墙。需要补充的是,无论何种防火墙都只能提供有限的保护。设置好防火墙不等于网络就是安全的,关键在于综合运用各种安全手段。



  防火墙的实际安全部署建议


  防火墙在实际的部署应用过程当中,经常部署在网关的位置,也就是经常部署在网内和网外的一个“中间分隔点”上,而就是在这样一个部署的环境中,也还存在着多种方式,且存在着许多“陷阱”,下面进行详细分析。


  方案一:错误的防火墙部署方式

  传统的防火墙部署方式可能所有人都认为非常简单,将防火墙部署于外部网络和内部网络之间。这个思路如果在内部网络中存在共享资源(比如说 FTP 服务器和 Web 服务器)的话,那么这将是一个非常危险的部署方式,如图 3 所示。理由其实非常简单,一旦这些共享服务器为黑客攻击和安装木马渗透病毒的话,那么内部网络的客户端及其资源将没有任何安全可言。因为在这种情况下,木马和病毒已经在内网中存在,而客户端和共享资源服务器在同一个网段,这无异于内网的安全隐患,防火墙对此无能为力,从而也失去了部署的意义了。


  图 3.错误的防火墙部署方式
图 3 错误的防火墙部署方式
 


  方案二:使用 DMZ

  目前一个比较流行和正确的做法就是采用如图 4 所示。也就是在防火墙上多加一块网卡,把提供对外服务的服务器和内网的客户端严格地隔离开来,这样,即算有安全风险和漏洞在 DMZ 中出现,由此对内部网络造成的危害也可以得到很好的控制,从而避免了方案一的缺点。


  图 4.使用 DMZ 的防火墙部署方式
图 4 使用 DMZ 的防火墙部署方式
 


  方案三:使用 DMZ+二路异构防火墙

  为了加强方案二中防火墙的安全强度,目前有些企业将图 4 的架构优化成图 5 的架构,也就是使用 DMZ+二路防火墙。另外,在此结构中选用防火墙,应尽量采用两家不同公司的异构产品,这样才有利于发挥这种架构的优势。


  图 5.使用 DMZ+二路防火墙的部署方式


图 5 使用 DMZ+二路防火墙的部署方式
 


  方案四:通透式防火墙

  在前面的几种方案中,防火墙本身就是一个路由器,在使用的过程中用户必须慎重地考虑到路由的问题。如果网络环境非常复杂或者是需要进行调整,则相应的路由需要进行变更,维护和操作起来有一定的难度和工作量。

  通透式防火墙则可以比较好的解决上述问题(如图 6 所示)。该类防火墙是一个桥接设备,并且在桥接设备上赋予了过滤的能力。由于桥接设备工作在 OSI 模型的第二层(也就是数据链路层),所以不会有任何路由的问题。并且,防火墙本身也不需要指定 IP 地址,因此,这种防火墙的部署能力和隐密能力都相当强,从而可以很好地应对黑客对防火墙自身的攻击,因为黑客很难获得可以访问的 IP 地址。


  图 6.通透式防火墙部署方式


图 6 通透式防火墙部署方式
 


 总结


  本系列文章详细介绍了 Netfilter/IPTables 防火墙框架的原理、安装、启动以及简单实战应用,并对实战应用 Netfilter/IPTables 防火墙框架进行 NAT、DMZ 应用进行了介绍,最后给出了防火墙的实际安全部署建议。


酷毙
2

雷人

鲜花

鸡蛋

漂亮

刚表态过的朋友 (2 人)

  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部