防火墙和iptables


Dubbo学习材料

Alibaba分布式服务框架 Dubbo
团队成员梁飞专访
 

正文目录:

RPC介绍

  1. 什么是RPC?

    RPC(Remote Procedure Call)远程过程调用。见名知意 –
    从远程主机调用一个进程/函数。 
    RPC的对象是:使得本程序调用其他远程主机上的函数,好像调用本程序内的函数一样简单,并且屏蔽编程语言的差别性。 
    要实现上述目的率先是计划一种简报协议,称之为:RPC合计(Protocol)

    • RPC商事不是一个具体的协商,而是一个项目名,代表一类协议,这类协议叫做RPC协商;
    • RPC协议在TCP/UDP之上,广义上得以超过平台、语言举行应用间通讯(说广义是因为可以付出一个商谈且不援助跨语言);
  2. 缘何要用RPC? 
    事实上这是行使开发到一定的级差的引人注目需求使得的。

    1. 尽管大家付出简单的纯净应用,逻辑简单、用户不多、流量不大,这我们用不着;

    2. 当咱们的序列访问量增大、业务增多时,我们会发现一台单机运行此系统现已黔驴技穷经受。此时,我们得以将工作拆分成多少个互不关联的运用,分别配备在分级机器上,以划清逻辑并减小压力。此时,大家也可以不需要RPC,因为使用之间是互不关联的。

    3. 当我们的事体尤其多、应用也进一步多时,自然的,我们会发觉有点效果已经无法大概划分开来仍旧私分不出去。此时,能够将国有事务逻辑抽离出来,将之组成独立的劳动Service应用 。而原有的、新增的施用都可以与那个单身的Service应用 互相,以此来完成总体的事务功用。所以那时候,我们需要一种高效的应用程序之间的通讯手段来完成这种需要,所以你看,RPC大显身手的时候来了!

    其实#3讲述的情状也是服务化 微服务 分布式系统架构 的底子场景。即RPC框架就是兑现上述结构的兵不血刃措施。

  3. 有哪些RPC? 
    有广大RPC框架:CORBAR、Thrift、Dubbo等等。基本上他们分成二种档次:

    • 一种是跨语言的;
    • 一种是同语言的,如果您的分布式应用架构主体都是Java应用,显著我们不应当运用跨语言的RPC来多一层中转浪费功能。

    就Java来说,我以为其自我API提供的RMI就是一种RPC协议,可是其终归奥马哈始,需要协调去充裕很多编制才能上生产条件。所以,前几天牵线下自家多年来使用的Dubbo框架。

6.1
为什么需要防火墙

dubbo常用配备总计

1、关闭启动时检查 
Dubbo默认会在启动时检查倚重的劳动是否可用,不可用会抛出非凡,阻止Spring起首化完成。借使对有些服务不关心,或者出现了循环依赖,必须有一方先启动时,可以关闭启动时检查。形式如下:

     <dubbo:reference interface=”com.xxx.XxxService” check=”false”
/>

2、引用默认依旧延迟初阶化的,只有引用被注入到其他Bean,或者被getBean()获取时,才会起首化。如若需要饥饿加载,即Dubbo启动时就应声转变动态代理实例,则足以安排:

     <dubbo:reference interface=”com.xx.XxxService” init=”true” />

3、给dubbo接口添加白名单——dubbo
Filter的应用

4、有时候你的劳动在本土开发测试时需要登记到注册中央,但又从不完全做完的时候,即便就这样注册上去,其他顾客在调用该服务时,就会有时的调用到你本地的劳务,这样就报错了。

*     *<dubbo:registry protocol=”zookeeper” address=”${dubbo.registry.address}” register=”false”/>
 

*     在<dubbo:registry
>最后添加register=”false”,这样旁人就不会调你的本土服务,但您的当地服务所订阅的劳务正常运作。*

5、直连提供者

*     开发测试环境下,需要绕过注册要旨,直接测试服务提供者*

     <dubbo:reference interface=”com.changhf.service.DeptmentService” id=”deptmentService” check=”false”  url=”dubbo://192.168.1.1:20881″/>  

   
 serviceImpl里加个断点,每一趟访问都会走断点。在管控台本地服务接口最终点击禁用,依旧得以健康访问,表达绕过了挂号中央。

6、服务分组,可实现服务的深厚提升

     <dubbo:service interface=”com.changhf.service.IDubboGroupService” ref=”dubboGroup1Service” group=”feedback2″/>
 

     <dubbo:reference interface=”com.changhf.service.IDubboGroupService” id=”dubboGroup1Service” check=”false” group=”feedback2″/>
 

*   
 group属性为该服务接口添加一个分组,消费者就只会调用同一分组的劳务接口了。*

*     也得以用version属性来顶替:*

*  <dubbo:service interface=”com.changhf.service.DeptmentService” ref=”deptmentService” version=”2.0″/>
 *

  <dubbo:reference interface=”com.changhf.service.DeptmentService” id=”deptmentService” check=”false” version=”2.0″/>
 

6.2
数据传输流程

6.2.1
网络数据传输过程

6.2.2
本机数据路由决策

6.3
TCP一回握手、一回挥手以及syn攻击

6.3.1
五遍握手建立tcp连接

6.3.2
两遍挥手端口tcp连接

6.3.3
syn
flood攻击

6.4
各种文件分布

6.4.1
从链路层来判断是否处理

6.4.2
从网络层来判定是否处理

6.4.3
从传输层来判定是否处理

6.4.4
从利用层来判定是否处理

6.4.5
特殊的防火墙判断

6.4.6
数据包过滤

6.4.7
iptables和netfilters的关系

6.5
Linux上防火墙相关基础

6.5.1
netfilter与其模块

6.5.2
netfilter的结构

6.5.3
INPUT、OUTPUT、FORWARD链

6.5.4
防火墙布线示例

6.6
filter表

6.7
iptables命令书写规则

6.7.1
iptables语法

6.7.2
ip_conntrack功能和iptstate命令

6.7.3 -m
state状态解释

6.7.4
filter-iptables命令示例

6.7.5
合并规则以及调整规则的依次

6.8
规则的田间管理措施

6.8.1
保存规则

6.8.2
规则的军事管制方法

6.9
自定义链

6.10
NAT

6.10.1
配置网关以及倒车

6.10.2
配置网关式防火墙

6.10.3
SNAT和DNAT


正文介绍防火墙知识和Linux主机处理数据包的历程,同时介绍了iptables管理防火墙的办法。

6.1 为啥需要防火墙

对此从未防火墙存在的一条网络路线中,主机A发送给主机B的其他一个数据包,主机B都会照单全收,即便是带有了病毒、木马等的多寡也如出一辙会收。虽说害人之心不可有,然而在网络上,你觉得是害你的一言一行在对方眼中是利他的行为。所以防人之心定要有,防火墙就足以提供一定的保持。

图片 1

有了简要的防火墙之后,在数据传输的过程中就会承受”入关”检查,能经过的数额包才继续传输,不可能透过的多少包则拒绝或者直接丢掉。

图片 2

从地点的图中得以见到,防火墙至少需要多少个网卡,其中一块控制流入数据包,另一块网卡控制流出数据包。尽管是软件防火墙,要实现一体化的防火墙效用,也需要至少两块网卡。

所谓防火墙就是”防火的墙”,即便復苏的是”火”就得挡住,固然復苏的不是”火”就放行,但怎么样是”火”,这由人们自行定制。

但不管咋样,所谓的”火”都是基于OSI七层模型的,简单的剪切为四层:最高的应用层(如HTTP/FTP/SMTP),往下一层是传输层(TCP/UDP),再往下一层是网络层,最后是链路层。能够按照整个7层模型的每一层来定制防火墙,但是默认防火墙(没有编译内核源码定制七层防火墙)一般认为工作在以上的4层中。

在网上和诸多书籍上都详细解释了OSI七层模型各层的所作所为和效能,我个人推举一本《总括机网络原理立异教程》,里面的OSI模型是自个儿上学过最通俗易懂且完全详细的教程。

6.2 数据传输流程

6.2.1 网络数据传输过程

首先看望网络数据传输的主导流程。

图片 3

数码从上层进入到传输层,加上源端口和对象端口成为数据段(假诺是UDP则改为数据报),再进来网络层加上源IP和对象IP成为数据包,再进入链路层加上源MAC地址和目的MAC地址成为数据帧,这段过程是一种”加头”封装数据的经过。数据经过网络传输到达目的主机后,逐层”剃头”解包,最终取得data纯数据内容。

6.2.2 本机数据路由决策

实际上,进程间数据传输的章程有多种:共享内存、命名管道、套接字、音讯队列、信号量等。上边描述的OSI通信模型只是数目传输的一种形式,它特指网络数据传输,是依据套接字(ip+port)的,所以既可以是主机间进程通信,也足以是本机服务端和客户端进程间的通信。

不顾,网络数据连接会注入、流出的,即便是本机的客户端和服务端进程间通信,也需要从套接字的一端流出、套接字的另一端流出,只不过这多少个多少无需路由、无需经过网卡。当向外侧主机发送数据时,在它从网卡流入后需要对它做路由决定,依据其目标控制是流入本机数据依然转发给其他主机,倘诺是流入本机的多少,则数据会从水源空间进入用户空间(被应用程序接收、处理)。当用户空间响应(应用程序生成新的数据包)时,响应数据包是本机暴发的新数据,在响应包流出往日,需要做路由决定,依照目的控制从哪个网卡流出。假使不是流入本机的,而是要转发给其他主机的,则一定涉及到另一个流出网卡,此时多少包必须从流入网卡完整地转发给流出网卡,这要求Linux主机可以一气浑成这么的转化。但Linux主机默认未打开ip_forward效用,那使得数据包不可以转车而被遗弃。Linux主机和路由器不同,路由器本身就是为着转发数据包,所以路由器内部默认就能在不同网卡间转发数据包,而Linux主机默认则不可能转化。

下图可以很好地演说下边的进程:

图片 4

本文是为着介绍防火墙的,充当防火墙的主机需要至少两块网卡,所以有必要解释下数据流入和流出时,Linux主机是何许处理的。

先是要注明的是,IP地址是属于基本的(不仅如此,整个tcp/ip协议栈都属于基本,包括端口号),如果能和里面一个地址通信,就能和另一个位置通信(这么说不兢兢业业,准确地就是能路由这两个地方),而不管是否开启了数量包转发功用。例如某Linux主机有两网卡eth0:172.16.10.5和eth1:192.168.100.20,某192.168.100.22主机网关指向192.168.100.20,它能ping通192.168.100.20,但也同等能ping通172.16.10.5,因为地点属于基本,从eth1进入的数量包被内核分析时,发现目的地方为本机地址,直接就生出新数据包回应192.168.100.22,根据路由决策,该响应包应从eth1出去,于是192.168.100.22能吸纳回复完成所有ping过程。

在此过程中,没有举办数据包转发过程,因为流出的响应包是新爆发的,而非原来流入的数据包。倘使流入和流出的包是如出一辙的(或者稍作修改),则数据流入后不可能跻身用户空间,而是直接通过基础转发给另一个网卡。数据包从网卡1交给网卡2,这多少个历程就是转发,在Linux主机上由ip_forward进行支配。例如,网卡1所在网段主机ping网卡2所在主机时,数据包流入网卡1后就需要转交给网卡2,然后从网卡2流出。

在后文中有尝试专门测试和认证地点的历程:布局网关以及倒车

6.3 TCP五次握手、一遍挥手以及syn攻击

老是TCP会话的创设都亟需通过五次握手,断开时都急需四回挥手。

6.3.1 一次握手建立TCP连接

如图。

图片 5

(1).客户端和服务端都远在CLOSED状态。(发起TCP请求的称之为客户端,接受请求的名叫服务端)

(2).服务端打开服务端口,处于listen状态。

(3).客户端发起连接请求。首首发送SYN(synchronous)报文给服务端,等待服务端给出ACK报文回应。发送的SYN=1,ACK=0,表示只发送了SYN信号。此时客户端处于SYN-SENT状态(SYN信号已发送)。

(4).服务端收到SYN信号后,发出ACK报文回应,并同时暴发友好的SYN信号请求连接。此时服务端处于SYN-RECV状态(syn
recieved,在图中显得的是SYN-RCVD)。发送的SYN=1 ACK=1,表示发送了SYN+ACK。

(5).客户端收到服务端的认可信号ACK后,再一次发送ACK信号给服务端以回复服务端发送的syn。此时客户端进入ESTABLISHED状态,发送的SYN=0,ACK=1表示只发送了ACK。

(6).服务端收到ACK信号后,也进入ESTABLISHED状态。

此后进展数量的传输都经过此连续举办。其中第3、4、5步是五遍握手的历程。这一个过程通俗地说就是五头伸手并回答的过程:①A殡葬syn请求B并听候B回应;②B回应A,并同时请求A;③B回应A。

6.3.2 一次挥手断开TCP连接

淌倘使客户端请求的断开。初步状态,双方都处在ESTABLISHED状态。

图片 6

                                                               
 注:图中LAST-WAIT画错,是TIME-WAIT

(1).客户端发送FIN(finally)报文信号,请求断开。此后客户端进入FIN-WAIT-1状态。

(2).服务端收到FIN信号,给出确认信号ACK,表示同意断开。此时服务端进入CLOSE-WAIT状态。此过程截止后表示从客户端到服务端方向的TCP连接已经倒闭了,也就是说整个TCP连接处于半关闭状态。

(3).客户端收到服务端的ACK后跻身FIN-WAIT-2状态,以等待服务端发出断开信号FIN。在客户端的FIN-WAIT-2状态的等候过程中,服务端再暴发温馨的FIN信号给客户端。此时服务端进入LAST-ACK状态。

(4).客户端收到服务端的FIN信号,给出回应信号ACK,表示接受服务端的断开请求,此时客户端进入TIME-WAIT状态,此时客户端已退出整个TCP,只需再伺机一段时间(2*MSL)就自动进入CLOSED状态。

(5).服务端收到客户端的回应ACK信号,知道客户端同意了服务端到客户端方向的TCP断开,直接进去CLOSED状态。

上述的1、2、3、4步是三遍挥手阶段。从中能够见见,五次挥手和一次握手的进程实际上是近似的,都是双边爆发断开请求并答应对方,只但是一遍挥手的历程是将服务端发送的ACK和FIN分开发送了,而两遍握手的过程中服务端发送的ACK和SYN是坐落一个数目包内发送的。

其它,以上所述是客户端请求的断开,服务端也得以请求断开,这时过程是完全一致的,只可是角色沟通了。还需注意的是,尽管是客户端请求断开,那么服务端就是被动端,可能会保留大量的CLOSE-WAIT状态的连接,淌尽管服务端主动请求断开,则可能会保留大量的TIME_WAIT状态的接连。由于各样连接都急需占用一个文件描述符,高并发情况下可能会耗尽那多少个资源。由此,需要找出相应问题,做出相应的防治,一般的话,可以修改内核配置文件/etc/sysctl.conf来缓解一些问题。

6.3.3 syn flood攻击

syn洪水攻击是一种常见的DDos攻击手段。攻击者能够通过工具在极长期内伪造大量任意不设有的ip向服务器指定端口发送tcp连接请求,也就是殡葬了大气syn=1
ack=0的数据包,当服务器收到了该数据包后会復苏并同样发送syn请求tcp连接,也就是发送ack=1
syn=1的数据包,此后服务器进入SYN-RECV状态,正常境况下,服务器期待收到客户端的ACK回复。但问题是服务器复苏的靶子ip是不设有的,所以过来的多少包总被废弃,也直接无法吸纳ACK回复,于是不断重发ack=1
syn=1的东山再起包直至超时。

在服务器被syn flood攻击时,由于持续接受大量冒牌的syn=1
ack=0请求包,它们将长日子占据资源队列,使得正规的SYN请求不能拿到正确处理,而且服务器平素处在重传响应包的情状,使得cpu资源也被消耗。显而易见,syn
flood攻击会大方消耗网络带宽和cpu以及内存资源,使得服务器运行缓慢,严重时可能会挑起网络堵塞甚至系统瘫痪。

就此,防范syn flood攻击分外首要。当然,首先需要判定出是否遭遇了syn
flood攻击。可以由此抓包工具或者netstat等工具得到处于SYN_RECV状态的半连接,假使有雅量处于SYN_RECV且源地址都是乱七八糟的申明遭到了syn洪水攻击。

比如说使用netstat工具判断的格局如下:

[root@xuexi ~]# netstat -tnlpa | grep tcp | awk '{print $6}' | sort | uniq -c
      1 ESTABLISHED
      7 LISTEN
    256 SYN_RECV

6.4 防火墙的判断范围

从设备上分类,防火墙分为软件防火墙、硬件防火墙、芯片级防火墙。后文所说的或是是软件防火墙、也说不定是硬件防火墙,在知道上它们没什么区别,只是将防火墙剥离成了单身的服务器而已。

从技术上分类,防火墙分为数据包过滤型防火墙、应用代理型防火墙。那是因为四层模型的每一层都足以采纳防火墙。

6.4.1 从链路层来判定是否处理

按照链路层的防火墙是决定MAC的。例如,可以将店铺内网员工电脑的MAC地址全体笔录到防火墙上,从而限制他们上外网。再比如,可以将铺面电脑的MAC地址整体笔录到防火墙使他们可以上网,可是非本信用社的总结机就不可能从本公司上网。

但是,基本上不会有商家这样做,这样的表现太死板,而且记录MAC地址本身就是一件很劳碌的事。

6.4.2 从网络层来判定是否处理

网络层的主干是IP(也席卷icmp等)。所以从网络层来判断,可以遵照源IP、目的IP来指定防火墙的平整。例如,来自38.68.100.61的主机无法通过防火墙;访问目的是192.168.109.19的服务器的乞求不可能让其通过防火墙;还足以安装icmp协议作为判断依照,使得外网人士的ping包被挡住。

在网络层可以用来制订防火墙规则的始末有广大。如下表。最常用的也就是后两个而已。

图片 7

6.4.3 从传输层来判定是否处理

可以从TCP或者UDP来判断。以TCP为例,例如限制目的端口是22端口的呼吁,那样SSH就无法连接上服务器了。

下表是TCP数据包中可以用来制定防火墙规则的字段。

图片 8

6.4.4 从使用层来判定是否处理

到了这一层的处理就属于行使代理型的防火墙了。他需要解开数据包并还原数据,也就是说它可以博得到数量包中的具有情节,但也由此负担很重,所需CPU和内存较大。它的适用面较窄。

6.4.5 特殊的防火墙判断

而外上述4种判定格局,还有二种特其它判定方法也相比常用。

◇ 依据数量包内容判断

诸如,不容许内网的客户端连上taobao.com上的此外主机,可以在防火墙上检查DNS的辨析包中是否包含”taobao.com”这一个字符串,要是有就丢掉,这样就足以让DNS对此外taobao.com上的主机解析失利达到限制上该网的目标。

只顾:虽说数据部分是应用层的,但是有些防火墙在网络层就能够开展检查。Linux默认自带的iptables/netfilters就是中间一种。

◇ 依照关系状态判断

如果现在不允许任何internet上的主机进入到铺子里面,然而允许合作社内的电脑可以上网。这样的设定目标是为了以防万一来自外网的攻击。可是一旦”禁止源地址为外网的保有地点穿过防火墙、允许源地址为公司里面的地点穿过防火墙”来安装防火墙,将造成一个题材:内网连上internet后呼吁某个网页,要能正常上网,内网总结机必然要收取外网网页的回到数据。但外网数据包不可能通过防火墙,这样并没有实现内网主机上网的目标。

当今只要内网某机器上外网时的套接字为192.168.100.8:9000,想要访问10.0.0.5:80,也即是说多少流向是192.168.100.8:9000→10.0.0.5:80,那么再次来到的多少包流向一定是10.0.0.5:80→192.168.100.8:9000。按照这种关联性,防火墙可以设定允许那样的数据包通过。

这属于连接跟踪的行事。FTP服务器对于防火墙的设置是一个考验,假若没有连接跟踪的效用,数据通道的端口不固定性将促成防火墙设置极端不方便。

6.4.6 数据包过滤

以下是协议栈(TCP/IP协议栈)底层大致机制。数据包都要透过A流入,再依据路由决策决定数据包的流向(网络层)。要是是流入本机,则经过B进入用户空间层,对于每个从本机流出的数据包,也都要经过路由决策来支配从哪些网络接口出去,然后路经D,从E出去。假如不是流入本机则流向C,然后顺着E点出去。

图片 9

上图有一处容易了解错误,从用户空间层出去的数据包是本机新发生的数据包,可能是对流入数据包的响应数据,也说不定是本机应用向外爆发的哀求数据包。不问可知,数据包走不完A–>B点–>User
Space–>D–>E这条路,在数据包进去用户空间层时已经被处理了,从用户空间层出来的数额已经不是原流入的数额,所以在上图中自我将用户空间的两个箭头断开了。

用英文来讲明ABCDE这5个点就相比浅显易懂:

A表示:altering packets as soon as
they come in,

B表示:destined to local
sockets,

C表示:be routed through the
box,

D表示:locally-generated
packets,

E表示:altering packets as they
are about to go out。

在上图中的ABCDE这三个点,其实就是防火墙发挥成效的点。在Linux主机上,防火墙是由基本空间的netfilter实现的,其中功效在ABCDE这六个点的各自名为PREROUTING链、INPUT链、FORWARD链、OUTPUT链和POSTROUTING链。那一个术语在后文会做特别详尽的证实。

图片 10

6.4.7 iptables和Netfilter的关系

防火墙起效果的是Netfilter,而iptables只是管理控制netfilter的工具,可以应用该工具举行相关规则的制定以及此外的动作。iptables是用户层的主次,netfilter是内核空间的,在netfilter刚参与到Linux中时,netfilter是一个Linux的一个内核模块,要兑现任何的防火墙行为还索要加载其他相应的模块,到了后来netfilter一部分必须的模块已经投入到根本中了。

也就是说,iptables命令工具操作的netfilter,真正起”防火”效用的是netfilter。

6.5 Linux上防火墙相关基础

6.5.1 netfilter与其模块

Linux是一个无比模块化的基本。netfilter也是以模块化的款型存在于Linux中,所以每添加一个和netfilter相关的模块,代表着netfilter就多一个效应。

不过有些模块是运用netfilter所必须的,所以这多少个模块已经默认编译到基础中而非需要时加载。

存放netfilter模块的目录有三个:/lib/modules/$kernel_ver/net/{netfilter,ipv4/netfilter,ipv6/netfilter}。$kernel_ver代表内核版本号。

其中ipv4/netfilter/存放的ipv4的netfilter,ipv6/netfilter/存放的ipv6的netfilter,/lib/modules/$kernel_net/kernel/netnetfilter/存放的是还要满足ipv4和ipv6的netfilter。在结尾一个目录中放入更多的模块,是netfilter团队前行的靶子,因为要维护ipv4和ipv6三个版本挺累的。

6.5.2 netfilter的结构

要使netfilter可以工作,就需要将持有的规则读入内存中。netfilter自己维护一个内存块,在此内存块中有4个表:filter表、NAT表、mangle表和raw表。在各类表中有对应的链,链中存放的是一条条的规则,规则就是过滤防火的话语或者其他效能的语句。也就是说表是链的容器,链是规则的器皿。实际上,每个链都只是一个hook函数(钩子函数)而已。

说到此地,需要纠正一个概念,Linux上的防火墙是由netfilter实现的,但是netfilter的职能不仅仅唯有”防火”,一般可以认为”防火”的效率只是filter表的功用。

有关这4个表,它们的结构如下:

图片 11


filter表:netfilter中最重大的表,负责过滤数据包,也就是防火墙实现”防火”的效益。filter表中只有OUTPUT/FORWARD/INPUT链。


NAT表:实现网络地址转换的表。可以转换源地址、源端口、目标地方、目标端口。NAT表中的链是PREROUTING/POSTROUTING/OUTPUT。


mangle表:一种独特的表,通过mangle表可以实现数据包的拆分和复苏。mangle表中隐含所有的链。


raw表:加速数据包穿过防火墙的表,也就是提高防火墙性能的表。只有PREROUTING/OUTPUT表。

是因为这个表中有再一次的链,所以数据被不同链中规则处理时是由各类的。下图是完好的数码包处理流程。

图片 12

6.5.3 INPUT、OUTPUT、FORWARD链

各样链对应的都是同名称的数据包,如INPUT链针对的是INPUT数据包。

INPUT链的成效是为着维护本机。例如,假若进入的数据包的靶子是本机的80端口,且发来数据包的地方为192.168.100.9时则摈弃,这样的平整应有写入本机的INPUT链。可是要注意,这么些本机指的是防火墙所在的机器,假如是硬件防火墙,那么肯定会配合FORWARD链。

OUTPUT链的意义是为了管住本机。例如,限制浏览www.taobao.com网页。

INPUT和OUTPUT链很容易精通,FORWARD链起的是如何效用吗?数据包从一端流入,不过不经过本机,那么就要从另一端流出。对于硬件防火墙这很容易领悟,如下图,数据总要转发到另一个网卡接口然后进入防火墙负责为其”防火”的网段。也就是说,FORWARD链的效益是尊敬”后端”的机械。

图片 13

前文说过,Linux主机自身也有ip_forward功用用于网卡间的数码包转发,这多少个ip_forward和netfilter的forward链有如何区别吗?这就是防火墙的意思,当数码包需要中转时,仅使用ip_forward时将不问是非对错总是举办中转,而使用forward链时可以筛选这么些需要转接的数据包,以控制是否要被转接。显然,ip_forward的效益是转发数据包,而forward链是筛选允许转发的数据包,然后让ip_forward转发。这也印证forward链要健康办事,要求开启ip_forward功能。

6.5.4 防火墙布线示例

图片 14

这么的摆放不仅给了服务器对外的一层防火墙,也给了服务器对内的一层防火墙,可以防别人也得以防内贼。

6.6 filter表

只考虑filter表的时候,防火墙处理数据包的历程如下图。

图片 15

当数码包流入时,首先通过路由裁判该数据包是流入防火墙本机仍旧转发到其它机器的。对于流入本机的数目包经过INPUT链,INPUT链所在地点是一个钩子函数,数据经过时将被钩子函数检查一番,检查后倘使发现是被醒目拒绝或索要吐弃的则直接丢弃,明确通过的则放行,不切合匹配规则的一样摒弃。然而钩子函数毕竟是半路劫财的角色,所以不管怎样都要报告一声netfilter,说那多少个数据包是怎么样如何的,就算是不容或抛弃了数额包也依然会提交一个通报。

当用户空间发出的数码包要发送出去时,首先通过路由决策判决从哪个接口出去,然后经过OUTPUT链并被这里的钩函数检查一番,检查通过则放行并最终从网卡流出,否则不通过。

譬如说,当外界主机请求WEB服务的时候,请求数据包流入到本机,路经INPUT链被放行。进入到本机用户空间的长河后,本机进程依据请求提交响应报文,该响应报文的源地址是本机,目标地址是外面主机。当响应报文要出来时必须先通过路由决定从哪个接口出去,然后流经OUTPUT,最终流出并路由到外面主机。

再譬如ping本机地址(如127.0.0.1)的时候,ping请求从用户空间发送后,数据包从用户空间流出,经过路由决策发现是某网卡的地址,于是流经到OUTPUT,然后从此网卡流出。可是出于ping的对象为本机地址,所以数据包仍从流出的网卡流入,并被INPUT链检查,最终回来ping的结果信息。

6.7 iptables命令书写规则

iptables用法相比复杂,有众多下令、选项和参数。所以,我先绝大多数命令、选项和模块选项列出,然后再举例表明iptables命令的用法。

Usage: iptables [-t TABLE] COMMAND CHAIN [ expressions -j target ]

这象征要操作TABLE表中的链,操作动作由COMMAND决定,例如添加一条规则、删除一条规则、列出规则列表等。假诺是向链中加进规则,则需要写出规则表明式用来检查数据包,并指明数据包被规则匹配上时应当做哪些操作,例如允许该数据包ACCEPT、拒绝该数量包REJECT、丢弃该数量包DROP,这一个操作称为target,由”-j”选项来指定。

 6.7.1 iptables语法

Commands:
Either long or short options are allowed.
  --append  -A chain                       链尾部追加一条规则
  --delete  -D chain                       从链中删除能匹配到的规则
  --delete  -D chain rulenum               从链中删除第几条链,从1开始计算
  --insert  -I chain [rulenum]             向链中插入一条规则使其成为第rulenum条规则,从1开始计算
  --replace -R chain rulenum               替换链中的地rulenum条规则,从1开始计算
  --list    -L [chain [rulenum]]           列出某条链或所有链中的规则
  --list-rules -S [chain [rulenum]]        打印出链中或所有链中的规则
  --flush   -F [chain]                     删除指定链或所有链中的所有规则
  --zero    -Z [chain [rulenum]]           置零指定链或所有链的规则计数器
  --new     -N chain                       创建一条用户自定义的链
  --delete-chain  -X [chain]               删除用户自定义的链
  --policy  -P chain target                设置指定链的默认策略(policy)为指定的target
  --rename-chain  -E old new               重命名链名称,从old到new

Options:
[!] --proto  -p proto                      指定要检查哪个协议的数据包:可以是协议代码也可以是协议名称,
                                           如tcp,udp,icmp等。协议名和代码对应关系存放在/etc/protocols中
                                           省略该选项时默认检查所有协议的数据包,等价于all和协议代码0
[!] --source -s address[/mask][...]        指定检查数据包的源地址,或者使用"--src"
[!] --destination -d address[/mask][...]   指定检查数据包的目标地址,或者使用"--dst"
[!] --in-interface  -i input name[+]       指定数据包流入接口,若接口名后加"+",表示匹配该接口开头的所有接口
[!] --out-interface -o output name[+]      指定数据包流出接口,若接口名后加"+",表示匹配该接口开头的所有接口
  --jump        -j target                  为规则指定要做的target动作,例如数据包匹配上规则时将要如何处理
  --goto        -g chain                   直接跳转到自定义链上
  --match       -m match                   指定扩展模块
  --numeric     -n                         输出数值格式的ip地址和端口号。默认会尝试反解为主机名和端口号对应的服务名
  --table       -t table                   指定要操作的table,默认table为filter
  --verbose     -v                         输出更详细的信息
  --line-numbers                           当list规则时,同时输出行号
  --exact       -x                         默认统计流量时是以1000为单位的,使用此选项则使用1024为单位

iptables援助extension匹配。协助三种扩充匹配:使用”-p”时的隐式扩张和拔取”-m”时的显式增加。遵照指定的壮大,随后可利用不同的选项。在指定扩充项的末端可拔取”-h”来赢得该扩张项的语法扶助。

“-p”选项指定的是隐式扩张,用于指定协议项目,每种协议项目都有一些子选项。常见协议和子选项如下表达:

-p tcp 子选项
  子选项:
    [!] --source-port,--sport port[:port]
          指定源端口号或源端口范围。指定端口范围时格式为"range_start:range_end",最大范围为0:65535。
    [!] --destination-port,--dport port[:port]
          指定目标端口号或目标端口号范围。
    [!] --tcp-flags mask comp
          匹配已指定的tcp flags。mask指定的是需要检查的flag列表,comp指定的是必须设置的flag。
          有效的flag值为:SYN ACK FIN RST URG PSH ALL NONE。
          如果以0和1来表示,意味着mask中comp指定的flag必须为1其余的必须为0。
          例如:iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN
          表示只匹配设置了SYN=1而ACK、FIN和RST都为0数据包,也即只匹配TCP三次握手的第一次握手。
    [!] --syn
         是"--tcp-flags SYN,ACK,FIN,RST SYN"的简写格式。

-p udp 子选项
  子选项:
    [!] --source-port,--sport port[:port]
          指定源端口号或源端口范围。指定端口范围时格式为"range_start:range_end",最大范围为0:65535。
    [!] --destination-port,--dport port[:port]
          指定目标端口号或目标端口号范围。

-p icmp 子选项
  子选项:
    [!] --icmp-type {type[/code]|typename}
          用于指定ICMP类型,可以是ICMP类型的数值代码或类型名称。有效的ICMP类型
          可由iptables -p icmp -h获取。常用的是"echo-request"和"echo-reply",分别
          表示pong和ping,数值代号分别是8和0
          ping时先请求后响应:ping别人先出去8后进来0;别人ping自己,先进来8后出去0

“-m”选项指定的是显式扩大。其实隐式增添也是要指定扩充名的,只可是默认已经清楚所使用的扩张,于是可以简单。例如:-p
tcp –dport =  -p tcp -m tcp –dport。

常用的扩大和它们常用的选项如下:

(1).iprange:匹配给定的IP地址范围。

[!] –src-range from[-to]:匹配给定的源地址范围

[!] –dst-range from[-to]:匹配给定的靶子地方范围

(2).multiport:离散的多端口匹配模块,如将21、22、80几个端口的规则统一成一条。

最多帮助写15个端口,其中”555:999″算2个端口。只有指定了-p tcp或-p
udp时该采取才生效。

[!] –source-ports,–sports port[,port|,port:port]…

[!] –destination-ports,–dports port[,port|,port:port]…

[!] –ports port[,port|,port:port]…
:不区分源和目的,只假设端口就行

(3).state:状态扩充。结合ip_conntrack追踪会话的事态。

[!] –state state

其中state有如下4种:

  INVALID:非法连接(如syn=1 fin=1)

  ESTABLISHED:数据包处于已创设的连天中,它和连续的相互都相关联

  NEW:新建连接请求的数据包,且该数据包没有和此外已有连日相关联

  RELATED:表示数据包正在新建连接,
但它和已有连日是相关联的(如被动情势的ftp的通令连接和数目连接)

例如:-m state –state NEW,ESTABLISHED -j ACCEPT

有关这4个状态,在下文还有更详实的描述。

(4).string:匹配报文中的字符串。

–algo {kmp|bm}:二种算法,随便指定一种

–string “string_pattern”

如:

iptables -A OUTPUT -m string --algo bm --sting "taobao.com" -j DROP

(5).mac:匹配MAC地址,格式必须为XX:XX:XX:XX:XX:XX。

[!] –mac-source address

(6).limit:使用令牌桶(token bucket)来界定过滤连接请求数。

–limit
RATE[/second/minute/hour/day]:允许的平分数据。如每分钟允许10次ping,即6秒三回ping。默认为3/hour。

–limit-burst:允许第一次涌进的面世数量。首次涌进大于后就按RATE指定数来交付响应。默认值为5。

譬如说:允许每分钟6次ping,但第一次可以ping
10次。10次之后按照RATE总计。所以,前10个ping包每秒能健康再次来到,从第11个ping包起来,每10秒允许一次ping:iptables
-A INPUT -d ServerIP -p icmp –icmp-type 8 -m limit –limit 6/minute
–limit-burst 10 -j ACCEPT

(7).connlimit:限制每个客户端的连日上限。

–connlimit-above n:连接数量超越上限n个时就实施TARGET

如最两只同意某ssh客户端建立3个ssh连接,超出就拒绝。二种写法:

iptables -A INPUT -d ServerIP -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
iptables -A INPUT -d ServerIP -p tcp --dport 22 -m connlimit ! --connlimit-above 3 -j  ACCEPT

其一模块即使限制能力不错,但要依据环境统计出网页正常访问时索要树立的连接数,其余还要考虑使用NAT转换地址时连接数会翻倍的题目。

 

末段剩余”-j”指定的target还未表明,target表示对郎才女貌到的数码包要做如何处理,比如吐弃DROP、拒绝REJECT、接受ACCEPT等,除这3个target外,还辅助很多种target。以下是中间二种:

DNAT:目的地址转换

SNAT:源地址转换

REDIRECT:端口重定向

MASQUERADE:地址伪装(其实也是源地址转换)

RETURN:用于自定义链,自定义链中匹配完毕后回去到自定义的前一个链中继续向下匹配

6.7.2 ip_conntrack功能和iptstate命令

ip_conntrack提供追踪效用,后来改称为nf_conntrack,由nf_conntrack模块提供。

只要OPPO载该模块,/proc/net/nf_conntrack文件中就会记录下追踪的连接情形。即便会追踪TCP/UDP/ICMP的拥有连接,不过在此文件中只保留tcp的连天处境。

[root@mail ~]# cat /proc/net/nf_conntrack
ipv4     2 tcp      6 431714 ESTABLISHED src=192.168.100.1 dst=192.168.100.8 sport=1586 dport=22 src=192.168.100.8 dst=192.168.100.1 sport=22 dport=1586 [ASSURED] mark=0 secmark=0 use=2
ipv4     2 tcp      6 427822 ESTABLISHED src=192.168.100.8 dst=192.168.100.1 sport=22 dport=1343 src=192.168.100.1 dst=192.168.100.8 sport=1343 dport=22 [ASSURED] mark=0 secmark=0 use=2
ipv4     2 tcp      6 299 ESTABLISHED src=192.168.100.1 dst=192.168.100.8 sport=1608 dport=22 src=192.168.100.8 dst=192.168.100.1 sport=22 dport=1608 [ASSURED] mark=0 secmark=0 use=2

首先条显示的是ESTABLISHED状态的接连,该连接是192.168.100.1:1586–>192.168.100.8:22,以及重回的连接192.168.100.8:22 –>
192.168.100.1:1586。

也得以动用iptstate命令实时显示连续情况,它是像top工具一样的展现。该命令工具在iptstate包中,可能需要手动安装,。如图为iptstate的几次结果。

图片 16

可以发现TTL(超时时间)值以及气象,还有此外的一部分音讯。那一个TTL值的安装岗位都在/proc/sys/net/netfilter/目录下的文本中。例如上图中web服务TIME_WAIT的晚点时间为2分钟,可以将其修改,对应的公文为下图中标示的。可以直接修改该文件的值,如180秒,即等待TIME_WAIT的时光3分钟后就断开连接。(TIME_WAIT处于TCP连接4次挥手主动段开方的倒数第二个等级)

图片 17

nf_conntrack好处是大大的,但是很喜剧,每一个监督和追踪的工具都是消耗性能的,而nf_conntrack也有其瓶颈所在。nf_conntrack也会损耗一定的资源,所以在设计的时候默认给出了其最大的追踪数据,最大追踪数据值由/proc/sys/net/netfilter/nf_conntrack_max文件决定。默认是31384个。这么些值显著是力不从心满意较高并发量的服务器的,所以可以将其增大一些,否则追踪数达到了最大值后,后续的保有连接都将排队被封堵,可能会就此交到警告。不过无论怎么着要了解的是追踪是会耗费性能的,所以该值应该钻探考虑。

[root@mail ~]# cat /proc/sys/net/netfilter/nf_conntrack_max
31384

同时要专注的一些是,nf_conntrack模块不是一定需要显式装载才会被装载的,有些倚重它的模块被装载时该模块也会被装载。例如iptables命令中包含iptables
-t nat时,就会装载该模块自动开启追踪,进而可能造成达到追踪max值而失误。

6.7.3 -m state的动静解释

采纳-m
state表示使用简称为”state”的模块。该模块提供4种情景:NEW、ESTABLISHED、RELATED和INVALID。可是这个处境和TCP三回握手一回挥手的十二种情状没任何关系。而且state提供的4种意况对于tcp/udp/icmp类型的多少包都是通用的。

注意:这四种情景是数据包的情状,不是客户端仍旧服务器当时所处的情景。也可以认为是防火墙state模块的气象,因为state模块在接受对应状态的包时会设置为同样的景观。

(1).NEW状态与TCP/UDP/ICMP数据包的关系

为了创立一条连接,发送的率先个数据包(如tcp五次握手的第一次SYN数据包)的意况为NEW。尽管第一次连续没制造成功,则第二个连续呼吁的数据包已经不是NEW数据包了。

故此,倘若不容许NEW状态的数额包表示不同意主动和对方创造连接,也不允许外界和本机建立连接。

(2).ESTABLISHED状态与tcp/udp/icmp数据包的涉嫌

甭管tcp数据包、udp数据包依然icmp数据包,要是发送的请求数据包穿过了防火墙,那么接下去双方传输的数据包状态都是ESTABLISHED,也就是说发过去的和再次来到回来的都是ESTABLISHED状态数据包。

(3).RELATED数据包的诠释

对于RELATED数据包的分解是:与当下任何连接都无关,完全是消极或临时创设的总是之间传输的数据包。

诸如,下图中tracert发送数据包的探测过程。

图片 18

图中客户端为了探测服务器的地点发送了tracert命令。这么些命令首先会标记一个tcp数据包的TTL值为1,当数码包到达首个路由器该值就减1,所以TTL变为0表示该数额包到了收尾该DROP掉的时候,然后该路由器就会发送一个icmp数据包(icmp-type=11)重回给客户端,这样客户端就了然了第一个路由器的地点。然后客户端的tracert命令继续标记一个TTL为2的数码包向外发送,直到第二个路由器才被放任,第二个路由器又发送一个icmp包给客户端,那样客户端就精通了第二个路由器的地方。同理第几遍也如出一辙。

在tracert探测的进程中,由路由器重返的icmp包都是RELATED状态的数据包。因为可以毫无疑问的说,客户端发送给路由器的tcp数据包是走的一条连接,数据包被路由器放任后路由器发送的icmp数据包与原先的连续已经无关了,这是其它一条回来的连天。但是之所以有这一个数据包,完全是因为后边的连年完毕而发出的答应数据包。

可是RELATED状态和商谈无关,只要数据包是因为本机先送出一个多少包而招致另一条连接的发出,那么这几个新连接的具备数据包都属于RELATED状态的数据包。

这样就容易明白ftp被动格局设置的related状态了。在ftp服务器上的21号端口上开启了命令通道(也就是命令连接)后,未来不管被动格局的轻易数据端口仍然主动形式的固定20多少端口,可以毫无疑问的是数据通道的成立是由命令通道指定要拉开的,所以这多少个数据通道中传输的数额包都是RELATED状态的。

(4).INVALID状态的数据包

所谓的INVALID状态,就是恶意的数据包。只要不是ESTABLISHED、NEW、RELATED状态的数据包,那么就肯定是INVALID状态。对于INVALID数据包最应当放在链中的第一条,以避免恶意的循环攻击。

(5).网关式防火墙的NEW状态、ESTABLISHED状态和RELATED

网关式的防火墙挡在客户端和劳动器端中间,用于过滤或变更数据包,不过它的景色却糟糕判断了。

至于它的情事变化,可以总计为”墙头草”:客户端送到防火墙的数据包是何许意况,防火墙的state模块就设置为啥状态,转发给服务器的数据包就是怎样情况;服务端发给防火墙的数据包是哪些状况,防火墙的state模块就安装为何状态,转发出来的数码包就是如何动静。也就是说,防火墙并不转移数据包状态的性质。

虽然数据包的图景只有防火墙才有身份判断,不过如此综合却不妨碍了然。

譬如说,TCP三遍握手的首先次,客户端发送一个SYN数据包给服务器要白手起家连接,这么些SYN数据包传到防火墙上,防火墙的state模块也会将自己的状态设置为SYN_SENT,并认为这些数目包是NEW状态的数据包,然后转发给服务器,转发过程的数据包的景观也是NEW。当服务器收到SYN后答复一个SYN+ACK数据包,当SYN+ACK数据包到达防火墙时,防火墙也和服务器一样将团结安装为SYN_RECV状态,并以为这么些数据包已经是ESTABLISHED的多少包了,然后将这多少个数量包以ESTABLISHED的情状转发给客户端。

RELATED状态也是相同的,只要双方的连接是”另起炉灶”的数据包,客户端和服务端之间的防火墙会随着数据包的流向而做一支”墙头草”。

其实那些境况以及变更都会在/proc/net/nf_conntrack文件中著录,只是相比为难被人工追踪到。

6.7.4 filter-iptables命令示例

iptables实验主机地址:172.16.10.9。首先启动iptables。

service iptables start

(1).清空自定义链、清空规则、清空规则计数器。

[root@xuexi ~]# iptables -X
[root@xuexi ~]# iptables -F
[root@xuexi ~]# iptables -Z

(2).允许172.16.10.0网段连接ssh(端口22)。

[root@xuexi ~]# iptables -A INPUT -s 172.16.10.0/24 -d 172.16.10.9 -p tcp --dport 22 -j ACCEPT
[root@xuexi ~]# iptables -A OUTPUT -s 172.16.10.9 -p tcp --sport 22 -j ACCEPT

(3).设置filter表默认规则为DROP。

[root@xuexi ~]# iptables -P INPUT DROP
[root@xuexi ~]# iptables -P FORWARD DROP

一般防火墙对外是ACCEPT的,所以OUTPUT链采取默认的ACCEPT。

出于将INPUT链设置为所有DROP,因而除了前方设置的靶子为22端口的数额包允许通过,另外全体丢掉,即便是ping环回地址。

[root@xuexi ~]# ping -c 4 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.

--- 127.0.0.1 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 13000ms

(4).查看规则列表和总括数据。

[root@xuexi ~]# iptables -L -n
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  172.16.10.0/24       172.16.10.9         tcp dpt:22 

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  172.16.10.9          0.0.0.0/0           tcp spt:22

假设加上”-v”选项,则会显得每条规则上的流量总结数据。

[root@xuexi ~]# iptables -L -n -v
Chain INPUT (policy DROP 10 packets, 993 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  655 64963 ACCEPT     tcp  --  *      *       172.16.10.0/24       172.16.10.9         tcp dpt:22 

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 9 packets, 756 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  242 42857 ACCEPT     tcp  --  *      *       172.16.10.9          0.0.0.0/0           tcp spt:22

(3).放行环回设备的出入数据包(环回地址的放行很重点)。

[root@xuexi ~]# iptables -A INPUT -i lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
[root@xuexi ~]# iptables -A OUTPUT -o lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

这儿已经可ping 127.0.0.1。

[root@xuexi ~]# ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.067 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.051 ms
^C
--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1648ms
rtt min/avg/max/mdev = 0.051/0.059/0.067/0.008 ms

可是不提议直接写127.0.0.1,而是大概目的地点和源地址,因为ping本机ip地址最终交给环回设备不过不是提交127.0.0.1的,而是交由127.0.0网段的此外地点。所以应当如此写:

[root@xuexi ~]# iptables -A INPUT -i lo -j ACCEPT
[root@xuexi ~]# iptables -A OUTPUT -o lo -j ACCEPT

从而能够将眼前多余的平整删除掉。

[root@xuexi ~]# iptables -D INPUT 2
[root@xuexi ~]# iptables -D OUTPUT 2

(4).能自己ping自己的IP,也能ping旁人的IP,不过外人不可以ping自己。

ping的过程实际上是ping请求对方,然后对方pong回应,协议项目为icmp。其中ping请求时,icmp类型为echo-request,数值代号为8,pong回应时的icmp类型为echo-reply,数值代号为0。

就此本机向外ping时,流出的是echo-request数据包,流入的是echo-reply数据包。而外面ping本机时,则是流入echo-request数据包,流出echo-reply数据包。因而,要允许本机向外ping,只需允许icmp-type=8的流出包、icmp-type=0的流入包即可,又由于后面的考查中安装了INPUT和OUTPUT链的默认规则为DROP,所以外界主机不可以ping本机。

图片 19

[root@xuexi ~]# iptables -A OUTPUT -p icmp --icmp-type=8 -j ACCEPT
[root@xuexi ~]# iptables -A INPUT -p icmp --icmp-type=0 -j ACCEPT

本来,OUTPUT链本身就是放行所有数据包的,所以只需写INPUT链规则即可。

(5).安装httpd,让外界可以访问web页面(端口为80)。

[root@xuexi ~]# iptables -A INPUT -d 172.16.10.9 -p tcp --dport 80 -j ACCEPT
[root@xuexi ~]# iptables -A OUTPUT -s 172.16.10.9 -p tcp --sport 80 -j ACCEPT

(6).除去(或交流)放行ssh服务和web服务的平整,并写出基于ip_conntrack放行ssh和web的平整(进入的数据包的情形只可能会是NEW和ESTABLISHED,出去的境况只可能是ESTABLISHED)

放行ssh:

iptables -R INPUT 1 -s 172.16.10.0/24 -d 172.16.10.9 -p tcp --dport 22 -m state --state=NEW,ESTABLISHED -j ACCEPT
iptables -R OUTPUT 1 -s 172.16.10.9 -p tcp --sport 22 -m state --state=ESTABLISHED -j ACCEPT

放行web:

iptables -R INPUT 4 -d 172.16.10.9 -p tcp --dport 80 -m state --state=NEW,ESTABLISHED -j ACCEPT
iptables -R OUTPUT 4 -s 172.16.10.9 -p tcp --sport 80 -m state --state=ESTABLISHED -j ACCEPT

iptables -L -n --line-number
Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  172.16.10.0/24       172.16.10.9         tcp dpt:22 state NEW,ESTABLISHED 
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 0 
4    ACCEPT     tcp  --  0.0.0.0/0            172.16.10.9         tcp dpt:80 state NEW,ESTABLISHED 

Chain FORWARD (policy DROP)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  172.16.10.9          0.0.0.0/0           tcp spt:22 state ESTABLISHED 
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 8 
4    ACCEPT     tcp  --  172.16.10.9          0.0.0.0/0           tcp spt:80 state ESTABLISHED

诸如此类的装置使得外界得以和主机建立会话,不过由主机出去的数目包则一定只可以是ESTABLISHED状态的劳动发生的,这样本机想再接再厉和外边建立会话是不容许的。那样就贯彻了状态监测的效应,制止黑客通过开放的22端口或80端口植入木马并积极交流黑客。

(7).放行外界ping自己,不过要依照ip_conntrack来放行。

iptables -A INPUT -d 172.16.10.9 -p icmp --icmp-type=8 -m state --state=NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.10.9 -p icmp --icmp-type=0 -m state --state=ESTABLISHED -j ACCEPT  

iptables -L -n --line-number
Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  172.16.10.0/24       172.16.10.9         tcp dpt:22 state NEW,ESTABLISHED 
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 0 
4    ACCEPT     tcp  --  0.0.0.0/0            172.16.10.9         tcp dpt:80 state NEW,ESTABLISHED 
5    ACCEPT     icmp --  0.0.0.0/0            172.16.10.9         icmp type 8 state NEW,ESTABLISHED 

Chain FORWARD (policy DROP)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  172.16.10.9          0.0.0.0/0           tcp spt:22 state ESTABLISHED 
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 8 
4    ACCEPT     tcp  --  172.16.10.9          0.0.0.0/0           tcp spt:80 state ESTABLISHED
5    ACCEPT     icmp --  172.16.10.9          0.0.0.0/0           icmp type 0 state ESTABLISHED

(8).安装vsftpd,并设置其防火墙。

鉴于ftp有主动格局和被动形式,被动格局的数目端口不定,且使用哪个种类情势是由客户端决定的,这使得ftp的防火墙设置相比复杂,不过依靠netfilter的state模块,设置就大概的多了。

第一装载其专门的模块nf_conntrack_ftp。

[root@xuexi ~]# modprobe nf_conntrack_ftp

也可以写入/etc/sysconfig/iptables-config的”IPTABLES_MODULES=”nf_conntrack_ftp”。

下一场编写规则:放行21端口的进入数据包,放行related关联数据包,放行出去的包(放行出去的包是前边已默认的,但此间为了试验完整性,仍旧显式指定了)。

iptables -A INPUT -d 172.16.10.9 -p tcp --dport 21 -m state --state=NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -d 172.16.10.9 -m state --state=RELATED,ESTABLISHED -j ACCEPT                       
iptables -A OUTPUT -s 172.16.10.9 -m state --state=ESTABLISHED -j ACCEPT 

下面一个平整中三个状态列表,状态列表中的状态是“或”的涉嫌,满意这一个即可。

[root@xuexi ~]# iptables -L -n --line-number
Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  172.16.10.0/24       172.16.10.9         tcp dpt:22 state NEW,ESTABLISHED 
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 0 
4    ACCEPT     tcp  --  0.0.0.0/0            172.16.10.9         tcp dpt:80 state NEW,ESTABLISHED 
5    ACCEPT     icmp --  0.0.0.0/0            172.16.10.9         icmp type 8 state NEW,ESTABLISHED 
6    ACCEPT     tcp  --  0.0.0.0/0            172.16.10.9         tcp dpt:21 state NEW,ESTABLISHED 
7    ACCEPT     all  --  0.0.0.0/0            172.16.10.9         state RELATED,ESTABLISHED 

Chain FORWARD (policy DROP)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  172.16.10.9          0.0.0.0/0           tcp spt:22 state ESTABLISHED 
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 8 
4    ACCEPT     tcp  --  172.16.10.9          0.0.0.0/0           tcp spt:80 state ESTABLISHED
5    ACCEPT     icmp --  172.16.10.9          0.0.0.0/0           icmp type 0 state ESTABLISHED 
6    ACCEPT     all  --  172.16.10.9          0.0.0.0/0           state ESTABLISHED

明天iptables已经有成千上万规则,可是也充足乱的。不仅想看懂挺复杂,在数量包检查的时候性能也更差,所以有必要将它们统一成简单易懂的规则。

6.7.5 合并规则以及调整规则的一一

实施iptables-save命令,可以dump出脚下基础维护的netfilter指定表中的条条框框,默认导出filter表。

[root@xuexi ~]# iptables-save -t filter
# Generated by iptables-save v1.4.7 on Sun Aug 13 05:33:29 2017
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -s 172.16.10.0/24 -d 172.16.10.9/32 -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT 
-A INPUT -d 172.16.10.9/32 -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -d 172.16.10.9/32 -p icmp -m icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -d 172.16.10.9/32 -p tcp -m tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -d 172.16.10.9/32 -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A OUTPUT -s 172.16.10.9/32 -p tcp -m tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT 
-A OUTPUT -o lo -j ACCEPT 
-A OUTPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT 
-A OUTPUT -s 172.16.10.9/32 -p tcp -m tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT 
-A OUTPUT -s 172.16.10.9/32 -p icmp -m icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT 
-A OUTPUT -s 172.16.10.9/32 -m state --state ESTABLISHED -j ACCEPT 
COMMIT
# Completed on Sun Aug 13 05:36:22 2017

从导出结果中得以看到,input链中有一些条规则都是本着state=NEW,ESTABLISHED而建立的,同理OUTPUT链中的state=ESTABLISHED,且他们的target都是一致的,这样的规则可以设想是不是可以合并。

注意:环回接口lo一定要显式指定所有类型的数码都经过。

譬如说,先将OUTPUT链中state=ESTABLISHED的条条框框举办合并。

iptables -I OUTPUT 1 -s 172.16.10.9 -m state --state=ESTABLISHED -j ACCEPT

再将OUTPUT链中除去lo接口的所有规则删除掉即可。

最后OUTPUT链剩下以下两条规则。

-A OUTPUT -s 172.16.10.9/32 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

即便这样使得OUTPUT没有再限制端口和商事,但对此流出数据包而言,这样已经足足了。一般的话,OUTPUT链的概念格局是:默认所有数量出来,但禁止某些端口(如80)发送NEW、INVALID状态的包。所以,在OUTPUT链默认规则为ACCEPT的景色下,能够参见如下情势定义该链的规则:

-A OUTPUT -s 172.16.10.9/32 -p tcp -m multiport --sports 21,22,80 -m state --state NEW,INVALID -j DROP

今昔规则如下:

[root@xuexi ~]# iptables -L -n --line-number
Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  172.16.10.0/24       172.16.10.9         tcp dpt:22 state NEW,ESTABLISHED 
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 0 
4    ACCEPT     tcp  --  0.0.0.0/0            172.16.10.9         tcp dpt:80 state NEW,ESTABLISHED 
5    ACCEPT     icmp --  0.0.0.0/0            172.16.10.9         icmp type 8 state NEW,ESTABLISHED 
6    ACCEPT     tcp  --  0.0.0.0/0            172.16.10.9         tcp dpt:21 state NEW,ESTABLISHED 
7    ACCEPT     all  --  0.0.0.0/0            172.16.10.9         state RELATED,ESTABLISHED 

Chain FORWARD (policy DROP)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  172.16.10.9          0.0.0.0/0           multiport sports 21,22,80 state INVALID,NEW

再来合并INPUT链的平整。INPUT链的集合应该遵从这样一种规则:先定义好大规则,再逐渐向后添加更具体、针对性更强的小规则。

首先将INPUT链中第4、6两条规则统一。

iptables -I INPUT 4 -d 172.16.10.9 -p tcp -m multiport --dport 21,80 -m state --state=NEW,ESTABLISHED -j ACCEPT

再统一INPUT链中对内和对外的ping规则。

iptables -I INPUT 3 -p icmp --icmp-type any -m state --state=NEW,ESTABLISHED -j ACCEPT

再删除被统一的结余规则。最终INPUT链中规则列表如下:

-A INPUT -s 172.16.10.0/24 -d 172.16.10.9/32 -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -p icmp -m icmp --icmp-type any -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -d 172.16.10.9/32 -p tcp -m multiport --dports 21,80 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -d 172.16.10.9/32 -m state --state RELATED,ESTABLISHED -j ACCEPT

之后再有任何需要时,只需在此基础上添加更仔细、具体的规则即可。如禁止外界ping本机,只需在第三条INPUT规则前DROP掉进来的icmp-type=8的包即可。

从上边的条条框框列表中,也许已经意识了逐条不是很易读。规则列表中规则的逐一是至关首要的,不仅影响易读性,还影响检查的一一从而影响属性,例如大并发量的数据包应该尽早匹配。以下是调整INPUT链中规则顺序的几个提议:

(1).请求量大的玩命放前边。

(2).通用型的规则尽量放前边。

(3).直接拒绝的考虑放后面,紧假设防恶意的循环攻击,对于个别拉黑但非攻击意图的莫过于无需放前边。

实际,iptables服务脚本配置文件/etc/sysconfig/iptables中初露的条条框框就是一流的框架。

[root@xuexi ~]# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

从此有任何特定的急需,都足以一向在那一个初步规则基础上举行充实。

6.8 规则的田间管理章程

6.8.1 保存规则

行使iptables写的规则都存放在内存中,内核会维护netfilter的每张表中的规则,所以重启iptables”服务”会使内存中的条条框框列表全体被清空。

要想手动写的条条框框长期有效,需要将规则保存到持久存储文件中,例如iptables”服务”启动时默认加载的剧本配置文件/etc/sysconfig/iptables。

有二种艺术保存规则。

艺术一:直接保存到/etc/sysconfig/iptables中

service iptables save

存方法二:可自定义保存地方

iptables-save >/etc/sysconfig/iptables
iptables-save >/etc/sycofnig/iptables.20170103

回复规则的格局:

iptables-restore </etc/sysconfig/iptables
iptables-restore </etc/sysconfig/iptables.2170103

6.8.2 规则的管理措施

固然将规则放入/etc/sysconfig/iptables文件中可以每一遍加载netfilter都能拔取相应的条条框框,可是最好不指出这样做,否则以后很有可以能会欲哭无泪。假设防火墙规则数据库中关于192.168.100.8的平整有100条,不过该主机改了IP地址,难道要去修改所有192.168.100.8的规则吧。

管住规则更好的点子是写成脚本。将这么些规则全体写入到一个shell脚本中,并对多次重复的地方使用变量,例如服务器的地址或网段,内网的网段。如下图所示:

图片 20

拔取脚本的助益有:

1.管制的简便。写成脚本可以直接修改该文件,要重新生效时只需执行三遍该脚本文件即可。不过要留意脚本的第一条命令最好是iptables
-F,这样每回运行脚本都会先清空已有规则再加载脚本中的其他规则。

2.可以在剧本中运用变量。那样之后某台服务器地址变更了只需修改该服务器地址对应的变量值即可。

3.便于阅读,因为可以加注释,并透过注释来对规则举办归类,未来涂改就变得相对容易的多。

4.备份规则变得更便于。备份后,即便硬盘坏了导致现有的条条框框有失了也足以简单的正片一个剧本过去运行即可,而不用再一条一条命令的敲。

5.也可以兑现开机加载规则。只需在/etc/rc.d/rc.local中加上一条实施该脚本的通令即可。

6.可以将其投入任务计划。

6.9 自定义链

自定义链是被主链引用的。引用地方由”-j”指定自定义链名称,表示跳转到自定义链并配合其内规则列表。

诸如,在INPUT链中的第三条规则为自定义链的引用规则,则数据包匹配到了第三条时进入自定义链匹配,匹配完自定义链后倘诺定义了归来主链的RETURN动作,则赶回主链继续向下匹配,如若没有定义RETURN动作,则匹配停止。

图片 21

创制一条自定义链。

iptables -N mychain

向里面出席一些依据安全的攻防规则,让每一回数据包进去都分外五遍攻防链。

iptables -A mychain -d 255.255.255.255 -p icmp -j DROP
iptables -A mychain -d 192.168.255.255 -p icmp -j DROP
iptables -A mychain -p tcp ! --syn -m state --state NEW -j DROP
iptables -A mychain -p tcp --tcp-flags ALL ALL -j DROP
iptables -A mychain -p tcp --tcp-flags ALL NONE -j DROP

在自定义链中的最终一条加上一条回来主链的平整,表示出色完自定义后持续回来主链举行匹配。

iptables -A mychain -d 192.168.100.8 -j RETURN

在主链的适宜地点加上一条引用主链的平整。表示数据包匹配到了那些职位上马进入自定义链匹配,假若自定义链都没被匹配而是被最后的RETURN规则匹配,则赶回主链再次匹配。

iptables -I INPUT -d 192.168.100.8 -j mychain

删除自定义链:需要先清空自定义链,去除被引用记录,然后利用-X删除空的自定义链。

iptables -F mychain
iptables -D INPUT 1
iptables -X mychain

可以运用-E命令重命名自定义链。

6.10 NAT

6.10.1 配置网关以及倒车

先是是一个网关配置实验。

以CentOS_1用作两边内网的网关,让内网1和内网2足以相互通信。试验进程中,先关闭CentOS_1的防火墙。

图片 22

率先配置Windows Server 2003和CentOS_2的网关指向CentOS_1。

 图片 23图片 24

目前CentOS_1还没有打开转发功效。测试CentOS_2和Windows Server 2003都能ping通CentOS_1的多少个地方,但CentOS_2和Windows Server
2003两者不可能互相ping通。

缘何到六个内网到CentOS_1的五个地点都通,可是到对方内网却卡住啊?

图片 25

对于CentOS_1主机而言,网络是基本空间中的内容,多少个IP地址都属于主机而非属于网卡,内核知道eth0和eth1的留存。由于默认在路由表中有对应内网1和内网2的路由条目,这四个路由条目用于维持和团结所在网段的地址通信(Iface列指定了从eth1和eth0流出去)。

当CentOS_2发起ping
CentOS_1:eth1的哀求时,ping请求包从eth0接口进入CentOS_1,进入后被路由决定一遍,内核发现这多少个数据包的靶子地址是eth1,可以一贯回应给CentOS_2,于是发生pong响应包并被路由一回,决定从eth0出去,最后恢复生机给了CentOS_2。同理从eth1进去目的地址是eth0的数额包也是均等处理的。这其中并没有关联到数码包转发的经过。

但内网1主机在ping内网2主机时,在CentOS_1上却需要数据包的转速。因为数量包到达eth0上时数据包的对象地方是win
server
2003的地址172.16.10.30,路由决定时发现是和eth1同网段的主机,但却不是本机,于是决定从eth1流出去。要到位这多少个进程,需要将数据包完完整整地从eth0交给eth1,这要求CentOS_1主机可以成功转账,但并未开启ip_forward功效时是无能为力转车的,因而从eth0流入的数量包被吐弃,导致内网1主机ping不通内网2主机。

在CentOS_1上开启转发功效。

echo 1 > /proc/sys/net/ipv4/ip_forward

再使用CentOS_2来ping Windows Server
2003,结果自然是通的,假使没有通,考虑CentOS_1是否开启了防火墙。

6.10.2 配置网关防火墙

开辟转发后就足以对filter表的FORWARD链举行安装了:只假如被forward的多少包都会遭到防火墙的”钩子伺候”,并开展一番检查。

图片 26

要注意的是,此时防火墙是背负两个网段的,转发后的数据包状态并不会因为通过FORWARD而变更。例如内网1发生的NEW状态的数据包到内网2时历经FORWARD时,假诺允许通过则转向出来的数据包依然NEW状态的,这样也就保证了内网2接受到的数据包依然NEW状态的,假设内网2也安排一个单机防火墙就可以判明这是NEW状态的多少包从而举办有关的平整过滤。

例如:

iptables -P FORWARD DROP

那儿早已内网1和内网2相互ping不通了。加上下边的条条框框,内网1的CentOS_2就能ping通外面,且外面进入的多寡包都只好是ESTABLISHED状态的。

iptables -A FORWARD -m state --state NEW,ESTABLISHED -j ACCEPT 

再添加这两条,就能保证内网2只好向内网1主机的22和80端口发起NEW和ESTABLISHED状态的数据包,且内网1只好向外发送ESTABLISHED状态的数据包。

iptables -A FORWARD -d 172.16.10.15 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 172.16.10.15 -m state --state ESTABLISHED -j ACCEPT  

6.10.3 SNAT和DNAT

NAT依赖于ip_forward,由此需要先打开它。

NAT有五个功效:


地址转换。让内网(私有地址)可以共用一个或多少个公网地址连接Internet。这是从内向外的,需要在网关式防火墙的POSTROUTING处修改源地址,这是SNAT效率。


体贴内网服务器。内网主机连接Internet使用的是公网地址,对外界而言是看不到内网服务器地址的,所以外界想要访问内部主机只好经过防火墙主机的公网地址,然后将对象地方转换为内网服务器地址,这起到了敬重内网服务器的效果。转换目的地址需要在网关式防火墙的PREROUTING链处修改,那是DNAT成效。


不仅可以修改指标地址,还足以采纳端口映射效率。DNAT是修改目的地点,端口映射是修改目的端口。如将web服务器的8080端口映射为防火墙的80端口。

外网主机和内网主机通信有二种意况的多少包:一种状态是树立NEW状态的新请求连接数据包,一种是回应的数据包。无论哪个种类情状,在NEW状态数据包经过地方转换之后会在防火墙内存中维护一张NAT表,保存未成功连接的地址转换记录,这样在答复数据包到达防火墙时可以依据那个记录路由给正确的主机。

也就是说,SNAT首要应付的是其中主机连接到Internet的源地址转换,转换的地点是POSTROUTING链;DNAT首要应付的是外表主机连接内部服务器避免内部服务器被口诛笔伐的靶子地址转换,转换地方在PREROUTING;端口映射可以在五个地点转移。

(1).SNAT转换源地址

SNAT过程的多寡包转换过程如下图所示。

图片 27

注意SNAT设置在postrouting链,流出接口eth1。由于规则中有另外的规格存在,使得可以大多数时候不要指定流出接口,当然如果指定的话更完整。

iptables -t NAT -A POSTROUTING -s 172.16.10.0/24 -o eth1 -j SNAT --to-source 192.168.100.20
iptables -t NAT -A POSTROUTING -s 172.16.10.0/24 -o eth1 -j SNAT --to-source 192.168.100.20-192.168.100.25
iptables -t NAT -A POSTROUTING -s 172.16.10.0/24 -o eth1 -j MASQUERADE

第一条语句表示将内网1向外暴发的数目包进行拍卖,将源地址转换为192.168.100.20。

第二条语句表示将源地址转换成192.168.100.{20-25}之间的某部地点。

其三条语句表示动态获取流出接口eth1的地方,并将源地址转换为此地方。这称为地址伪装(ip
masquerade),地址伪装效率很实用,可是比较前两种,性能要稍差一些,因为拍卖每个数据包时都要得到eth1的地方,也就是说多了一个摸索动作。

(2).DNAT目的地方和端口转换

DNAT过程的数据包转换过程如下图所示。

图片 28

留神SNAT设置在prerouting链,流入接口eth1。

iptables -t NAT -A PREROUTING -i eth1 -d 192.168.100.20 -p tcp --dport 80 -j DNAT --to-destination 172.16.10.15:8080

地点的话语表示从外网流入的目标为192.168.100.20:80的多寡包转换为目的172.16.10.15:8080,于是该数额包被路由给内网1主机172.16.10.15的8080端口上。

 

回去系列小说大纲:http://www.cnblogs.com/f-ck-need-u/p/7048359.html

转载请注解出处:http://www.cnblogs.com/f-ck-need-u/p/7397146.html

注:若您觉得这篇随笔还不易请点击下右下角的引进,有了你的襄助才能刺激作者更大的编写热情,非凡感谢!

发表评论

电子邮件地址不会被公开。 必填项已用*标注