iptables详解

iptables防火墙详解

注:为了便于查看,我把iptables和firewlld的使用总结文档放到了这个链接(下载),这个文档如果有新的内容和更正,我会及时更新。

有需要可以直接下载查看,应该比在博客(博客做很多格式太耗费时间了)上看到的格式要友好一些。

说明:个人认为此处文章适合已经对iptables有一定了解,并且希望对实用操作有一篇总结性的文章来方便查阅的受众,

或者本来对iptables没有多少了解,但是想系统地了解iptables及其一些常用操作,拿来就能用的受众。

 

=====================================华丽的分割线=====================================

目录:

1 四表五链和一些基础知识

  2 iptables命令基础

  2.1 规则链管理

  2.2 规则管理

  2.3 查看规则

  2.4 基本匹配

  2.5 扩展匹配之隐式匹配

  2.6 target

  2.7 扩展匹配之显式匹配

    GMT、CST等各种时间

3 NAT

4 iptables七层访问过滤

5 iptables常用配置

=====================================华丽的分割线=====================================

1 四表五链和一些基础知识

每个功能需要使用多个链,一个链上有N条规则,这样就相当于一个表了。这就是叫做iptables的原因。

流入:PREROUTING --> INPUT  #外部到本机

流出:OUTPUT --> POSTROUTING  #本机到外部

转发:PREROUTING --> FORWARD --> POSTROUTING  #外部经过本机转发到其他主机

 

 

 

防火墙匹配规则流程:

1.     防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。

2.     如果匹配上规则,即明确表示是阻止还是通过,数据包就不再向下匹配新的规则。

3.     如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。

4.     防火墙的默认规则是所有规则执行完才执行的。

 

注意:iptables只能针对IPV4地址,不能用来过滤IPV6.

下图为iptables规则链匹配流程图:

 

2 iptables命令基础使用

 

2.1 规则链管理

-F:flush,清空规则链;省略链,表示清空指定表上的所有的链;

-X:drop, 删除用户自定义的空的规则链;

-Z:zero,清零,置零规则计数器;

-N:new, 创建新的自定义规则链;

-P:Policy,为指定链设置默认策略;对filter表中的链而言,默认策略通常有ACCEPT(允许), DROP(丢弃),REJECT(拒绝,挑衅行为式的拒绝);  

-E: rEname,重命令自定义链;当引用计数不为0的自定义链,无法改名,也无法删除;

 

2.2 规则管理

-A:append,将新规则追加于指定链的尾部;

-I:insert,将新规则插入至指定链的指定位置;

-D:delete,删除指定链上的指定规则;

     有两种指定方式:

              (1) 指定匹配条件;

              (2) 指定规则编号;

-R:replace,替换指定链上的指定规则;

 

2.3 查看规则

-L:list,列出指定链上的所有规则;

    -n: numberic,以数字格式显示地址和端口号;     #这样就不会反解

    -v: verbose,显示详细信息;

           -vv, -vvv #v越多显示越详细

    --line-numbers:显示规则编号;

    -x: exactly, 显示计数器计数结果的精确值;

 

  -t, --table table 指定表:filter、nat、mangle和raw,默认为filter

 

2.4 基本匹配

[!] -s, --src, --source IP|Netaddr,检查报文中源IP地址是否符合此处指定的地址范围;

[!] -d, --dst, --destination IP|Netaddr,检查报文中源IP地址是否符合此处指定的地址范围;

-p, --protocol {tcp|udp|icmp},检查报文中的协议,即ip首部中的protocols所标识的协议;

-i, --in-interface IFACE,数据报文的流入接口;仅能用于PREROUTING, INPUT及FORWARD链上;

-o, --out-interface IFACE,数据报文的流出接口;仅能用于FORWARD, OUTPUT及POSTROUTING链上;

 

2.5 扩展匹配之隐式扩展

-m macth_name --spec_options

隐式扩展:对-p protocol指明的协议进行的扩展,可省略-m选项;

-p tcp

       --dport PORT[-PORT]:目标端口,可以是单个端口或连续多个端口;

       --sport PORT[-PORT]: 源端口,可以是单个或者多个连续端口

       --tcp-flags LIST1 LIST2:

             检查LIST1所指明的所有标志位,且这其中,

LIST2所表示出的所有标记位必须为1,而余下的必须为0;

没有LIST1中指明的,不作检查;

              SYN, ACK, FIN, RST, PSH, URG

              --tcp-flags SYN,ACK,FIN,RST SYN

       --syn:检查新建TCP连接是否为第一次请求,等价于下面的写法:

              --tcp-flags SYN,ACK,FIN,RST SYN

-p udp

       --dport

       --sport

-p icmp

       --icmp-type

       可用数字表示其类型:

              0:echo-reply

              8: echo-request

2.6 target

-j TARGET:jump至指定的TARGET

常见的target有:

  ACCEPT: 接受

  DROP: 丢弃

  REJECT: 拒绝

  RETURN: 返回调用链

  REDIRECT:端口重定向

  LOG: 记录日志

  MARK:做防火墙标记

  DNAT:目标地址转换

  SNAT:源地址转换

  MASQUERADE:地址伪装

  自定义链:由自定义链上的规则进行匹配检查

 

2.7 扩展匹配之显式扩展(必须用-m指定)

1、multiport扩展

       以离散方式定义多端口匹配,默认的-p sport|dport是不支持多个离散端口匹配的;最多指定15个端口;

       [!] --source-ports,--sports port[,port|,port:port]...:指明多个源端口;

       [!] --destination-ports,--dports port[,port|,port:port]...:指明多个离散的目标端口;

       [!] --ports port[,port|,port:port]...

也可以不使用上面的参数,只要指定-m multiport,直接就能使用-p dport|sport 22,24,25

1 iptables -A INPUT -s 10.0.0.9 -m multiport -p tcp --dport 22,24,25 -j DROP 

 

2、iprange扩展

       指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用;

       [!] --src-range from[-to]:指明连续的源IP地址范围;

       [!] --dst-range from[-to]:指明连续的目标IP地址范围;

1 iptables -I INPUT -d 172.16.100.9 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 172.16.100.1-172.16.100.120 -j ACCEPT

2 iptables -I OUTPUT -s 172.16.100.9 -p tcp -m multiport --sports 22:23,80 -m iprange --dst-range 172.16.100.1-172.16.100.120 -j ACCEPT

 

3、string扩展

       检查报文中出现的字符串;

       --algo {bm|kmp}   #bm|kmp分别是两种不同的字符串比较算法

              bm = Boyer-Moore    

              kmp = Knuth-Pratt-Morris

       [!] --string pattern

1 iptables -I OUTPUT -m string --algo bm --string 'movie' -j REJECT

 

4、time扩展

       根据报文到达的时间与指定的时间范围进行匹配;

       --datestart     --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]    #起始日期    

       --datestop     --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]#结束日期

       --timestart

       --timestop

       --monthdays

       --weekdays

       具体可以看帮助

几种常见时间概述与关系

1)全球24个时区的划分

       相较于两地时间表,可以显示世界各时区时间和地名的世界时区表(World Time),就显得精密与复杂多了,

通常世界时区表的表盘上会标示着全球24个时区的城市名称,但究竟这24个时区是如何产生的?

  过去世界各地原本各自订定当地时间,但随着交通和电讯的发达,各地交流日益频繁,不同的地方时间,造成许多困扰,

于是在西元1884年的国际会议上制定了全球性的标准时,明定以英国伦敦格林威治这个地方为零度经线的起点(亦称为本初子午线),

并以地球由西向东每24小时自转一周360°,订定每隔经度15°,时差1小时。而每15°的经线则称为该时区的中央经线,

将全球划分为24个时区,其中包含23个整时区及180°经线左右两侧的2个半时区。就全球的时间来看,东经的时间比西经要早,

也就是如果格林威治时间是中午12时,则中央经线15°E的时区为下午1时,中央经线30°E时区的时间为下午2时;

反之,中央经线15°W的时区时间为上午11时,中央经线30°W时区的时间为上午10时。以台湾为例,台湾位于东经121°,

换算后与格林威治就有8小时的时差。如果两人同时从格林威治的0°各往东、西方前进,当他们在经线180°时,

就会相差24小时,所以经线180°被定为国际换日线,由西向东通过此线时日期要减去一日,反之,若由东向西则要增加一日。

2)CET

       欧洲中部时间(Central European Time,CET)是比世界标准时间(UTC)早一个小时的时区名称之一。

它被大部分欧洲国家和部分北非国家采用。冬季时间为UTC+1,夏季欧洲夏令时为UTC+2。

3)UTC

  协调世界时间,又称世界标准时间或世界协调时间,简称UTC,从英文“Coordinated Universal Time”/法文“Temps Universel Cordonné”而来。

台湾采用CNS 7648的《资料元及交换格式–资讯交换–日期及时间的表示法》(与ISO 8601类似)称之为世界统一时间。

中国大陆采用ISO 8601-1988的国标《数据元和交换格式信息交换日期和时间表示法》(GB/T 7408)中称之为国际协调时间。

UTC是经过平均太阳时(以格林威治时间GMT为准)、地轴运动修正后的新时标以及以「秒」为单位的国际原子时所综合精算而成的时间,

计算过程相当严谨精密,因此若以「世界标准时间」的角度来说,UTC比GMT来得更加精准。其误差值必须保持在0.9秒以内,

若大于0.9秒则由位于巴黎的国际地球自转事务中央局发布闰秒,使UTC与地球自转周期一致。

所以基本上UTC的本质强调的是比GMT更为精确的世界时间标准,不过对于现行表款来说,GMT与UTC的功能与精确度是没有差别的。

4)GMT

  格林尼治标准时间(旧译格林尼治平均时间或格林威治标准时间;英文:Greenwich Mean Time,GMT),十七世纪,

格林威治皇家天文台为了海上霸权的扩张计画而进行天体观测。1675年旧皇家观测所(Old Royal Observatory) 正式成立,

位于英国伦敦郊区,到了1884年决定以通过格林威治的子午线作为划分地球东西两半球的经度零度。观测所门口墙上有一个标志24小时的时钟,

显示当下的时间,对全球而言,这里所设定的时间是世界时间参考点,全球都以格林威治的时间作为标准来设定时间,

这就是我们耳熟能详的「格林威治标准时间」(Greenwich Mean Time,简称G.M.T.)的由来,标示在手表上,则代表此表具有两地时间功能,

也就是同时可以显示原居地和另一个国度的时间。但由于地球自转不均匀不规则,导致GMT不精确,现在已经不再作为世界标准时间使用。

5)CST

       在国内一般指北京时间,China Standard Time,又名中国标准时间,是中国的标准时间。在时区划分上,属东八区,

比协调世界时早8小时,记为UTC+8,与中华民国国家标准时间(旧称“中原标准时间”)、香港时间和澳门时间和相同。

与格林尼治时间相差8小时。值得注意的是CST却同时可以代表如下 4 个不同的时区:

Central Standard Time (USA) UT-6:00

Central Standard Time (Australia) UT+9:30

China Standard Time UT+8:00

Cuba Standard Time UT-4:00

可见,CST可以同时表示美国,澳大利亚,中国,古巴四个国家的标准时间。 

6)DST

      所谓「夏日节约时间」Daylight Saving Time(简称D.S.T.),是指在夏天太阳升起的比较早时,将时钟拨快一小时,

以提早日光的使用,在英国则称为夏令时间(Summer Time)。这个构想于1784年由美国班杰明·富兰克林提出来,

1915年德国成为第一个正式实施夏令日光节约时间的国家,以削减灯光照明和耗电开支。自此以后,全球以欧洲和北美为

主的约70个国家都引用这个做法。目前被划分成两个时区的印度也正在商讨是否全国该统一实行夏令日光节约时间。

欧洲手机上也有很多GSM系统的基地台,除了会传送当地时间外也包括夏令日光节约时间,做为手机的时间标准,

使用者可以自行决定要开启或关闭。值得注意的是,某些国家有实施「夏日节约时间」的制度,

出国时别忘了跟随当地习惯在表上调整一下,这可是机械表没有的功能设计哦!

7)关系

  CET=UTC/GMT + 1小时

  CST=UTC/GMT +8 小时

  CST=CET+9

例如: Thursday 03/17/2011 between 0:30am and 6:00am CET (UTC/GMT +1 hour)

CET = 03/17/2011  0:30am and 6:00am

UTC/GMT = 03/17/2011  1:30am and 7:00am

CST  = 03/17/2011  9:30am and 15:00am

 

5、connlimit扩展

根据每客户端IP(也可以是地址块)做并发连接数数量匹配;    #单IP并发访问限制,

--connlimit-above n:连接的数量大于n

--connlimit-upto n: 连接的数量小于等于n

 

6、limit扩展

基于收发报文的速率做检查;

令牌桶过滤器              #使用的是令牌桶算法

       --limit rate[/second|/minute|/hour|/day]   速率       #limit 30/second

       --limit-burst number   峰值       #limit-burst 5

7、state扩展

根据连接追踪机制检查连接的状态;      

能够增强服务器(比如web服务)的安全性,避免反弹式木马攻击,但是必须打开连接追踪功能,这样会消耗服务器的性能。

反弹式木马其实就是被动等待肉鸡来连接的一种木马,如灰鸽子。一般防火墙对内部访问外部的数据都不会过问,肉鸡会主动连接控制端。

       调整连接追踪功能所能够容纳的最大连接数量:

              /proc/sys/net/nf_conntrack_max

       已经追踪到并记录下的连接:

              /proc/net/nf_conntrack

       不同协议或连接类型追的时长:

              /proc/sys/net/netfilter/

       可追踪的连接状态:

              NEW:新发出的请求;连接追踪模板中不存此连接相关的信息条目,因此,将其识别为第一次发出的请求;

              ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态;

              RELATED:相关的连接;如ftp协议的命令连接与数据连接之间的关系;

              INVALIED:无法识别的连接;

1 iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT  # 放行FTP主动连接

以下为iptables可追踪的连接状态图解:

 

 

 

 

 

 

 

 

state例子之如何开放被动模式的ftp服务?

FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。

Port模式:ftp server:tcp 21 <------client:dynamic    ftp server:tcp 20 ------>client:dynamic

Pasv模式:ftp server:tcp 21 <----client:dynamic     ftp server:tcp dynamic <----client:dynamic

PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请 求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户 端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条 数据链路来传送数据。

PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请 求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务 器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来 传送数据。

1 开放主动模式
2 
3 iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
4 
5 iptables -A INPUT -p tcp -s x.x.x.x --dport 20:21  -j ACCEPT

 

开放被动模式方法一:

 1 如果用vsftpd,修改配置文件,设置最小和最大打开端口
 2 
 3 pasv_min_port=2222
 4 
 5 pasv_max_port=2225
 6 
 7 iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
 8 
 9 iptables -A INPUT -p tcp -s x.x.x.x --dport 21  -j ACCEPT
10 
11 iptables -A INPUT -p tcp -s x.x.x.x --dport 2222:2225  -j ACCEPT

 

方法二使用连接追踪模块:

 1 (1) 装载ftp追踪时的专用的模块:
 2 
 3        /lib/modules/2.6.32-696.el6.x86_64/kernel/net/netfilter/nf_conntrack_ftp
 4 
 5        modinfo nf_conntrack_ftp.ko   -- 查看模块信息
 6 
 7        modprobe nf_conntrack_ftp   -- 使用模块
 8 
 9 (2) 放行请求报文:
10 
11        命令连接:NEW, ESTABLISHED
12 
13        数据连接:RELATED, ESTABLISHED
14 
15        # iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
16 
17        # iptables -A INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
18 
19 (3) 放行响应报文:
20 
21        ESTABLISEHD
22 
23        # iptables -A OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT
24 
25  

 

8、如何保存及重载规则:

       直接保存:规则自动保存到了/etc/sysconfig/iptables,用此命令保存的规则开机会自动生效。

iptables save

       保存规则至指定文件:

              iptables-save > /etc/sysconfig/iptables

       从指定文件重载规则:

              iptables-restore < /etc/sysconfig/iptables

       保存规则:#iptables-save >/etc/iptables-script

       恢复规则:#iptables-restore>/etc/iptables-script

       开机自动恢复规则,把恢复命令添加到启动脚本:echo '/sbin/iptables-restore /etc/iptables-script' >>/etc/rc.d/rc.local

 

9、实现网络防火墙

       实现网络防火墙最重要的就是要打开核心转发,并且按需求配置FORWARD链上的策略。/etc/sysctl.conf #永久修改

       查看核心转发功能是否开启:

       cat /proc/sys/net/ipv4/ip_forward

       sysctl net.ipv4.ip_forward

sysctl

       -a   显示所有的系统参数

       -w   临时改变某个指定参数的值

       -p   从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载

3 NAT

nat:Network Address Translation,安全性,网络层+传输层             #最初出现的目的是为了隐藏本地网络中的主机

proxy:代理,应用层。      #真正的请求者是代理服务器。

nat:

       SNAT:只修改请求报文的源地址;

       DNAT:只修改请求报文的目标地址;     #相对于请求报文来说

  MASQUERADE:地址伪装,当外网IP不固定时

 

源地址转换:

报文到达主机在PREROUTING后是不知道去哪里的,要等到确定了是转换(NAT)并确实了从哪个网卡发送出去(这里是指路由发生),

再(路由发生后)在POSTROUTING的时候再做源地址转换。

1 iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP
2 
3 iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE   #外网地址不是固定的

 

目标地址转换:

路由发生前,一律查NAT表,根据规则转换为能够在内网通信的地址。   #不然黄花菜都凉了

1 iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]

 

连接追踪:

iptables的连接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,连接碰到各种状态的超时后就会从表中删除。

所以解決方法一般有两个:

 1        (1) 加大 ip_conntrack_max 值
 2 
 3        vi /etc/sysctl.conf
 4 
 5        net.ipv4.ip_conntrack_max = 393216
 6 
 7        net.ipv4.netfilter.ip_conntrack_max = 393216
 8 
 9        (2): 降低 ip_conntrack timeout时间
10 
11        vi /etc/sysctl.conf
12 
13        net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
14 
15        net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
16 
17        net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
18 
19        net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120

 

4 iptables七层访问过滤(知道有这个功能即可,不必深究):

要实现需要做以下处理:

1)对内核中的netfilter,打补丁layer7,重新编译内核

2)对iptables打补丁,补上layer7模块,重启iptables

 

为什么要使用iptables的七层过滤

  作为网络管理员,对P2P,QQ,酷狗,等软件是又爱又恨,大多数公司,为了提高工作效率禁止公司员工上QQ,看视频等, 

在市场上买专门的上网行为管理设备,随便都是好几W,而使用linux来做网关,一样可以禁止qq,酷狗等软件,成本才几千块,下面将介绍下怎么实现的

在Linux的防火墙体系Netfilter下有一个独立的模块L7 filter。从字面上看Netfilter是对网络数据的过滤,

L7 filter是基于数据流应用层内容的过滤。不过实际上 L7 filter的本职工作不是对数据流进行过滤而是对数据流进行分类。

它使用模式匹配算法把进入设备的数据包应用层内容与事先定义好的协议规则进行比对,如果匹配成功就说明这个数据包属于某种协议。

  L7 filter是基于数据流工作的,建立在Netfilter connstrack功能之上。因为一个数据流或者说一个连接的所有数据都是属于同一个应用的,

所以L7 filter没有必要对所以的数据包进行模式匹配,而只匹配一个流的前面几个数据包 (比如5或10个数据包)。

当一个流的前面几个数据包包含了某种应用层协议的特征码时 (比如QQ),则这个数据流被L7 filter识别;

当前面几个数据包的内容没有包含某种应用层协议的特征码时,则L7 filter放弃继续做模式匹配,这个数据流也就没有办法被识别。

 

5 iptables常用配置实例

 

1、阻止相应网段主机访问服务端指定端口服务

1 10.0.0.0/24 -- 22端口(阻止)
2 
3 iptables -t filter -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP
4 
5 iptables -t filter -A INPUT -s 10.0.0.9 -p tcp --dport 22 -j DROP
6 
7 iptables -t filter -A INPUT -i eth0 -s 10.0.0.9 -p tcp --dport 22 -j DROP

 

2、除了某个地址可以访问22端口之外,其余地址都不能访问

1 10.0.0.1 10.0.0.253    10.0.0.9(只允许)
2 
3 iptables -t filter -A INPUT -s 10.0.0.9 -p tcp --dport 22 -j ACCEPT
4 
5 iptables -t filter -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP
6 
7 iptables -t filter -A INPUT ! -s 10.0.0.9 -p tcp --dport 22 -j ACCEPT
8 
9 !(感叹号)表示非

 

3、指定阻止访问多个端口服务

 1 22--80 22,24,25
 2 
 3 iptables -A INPUT -s 10.0.0.9 -p tcp --dport 22:80 -j DROP   
 4 
 5 --- 匹配连续的端口号访问
 6 
 7 iptables -A INPUT -s 10.0.0.9 -m multiport -p tcp --dport 22,24,25 -j DROP  
 8 
 9 --- 匹配不连续的端口号访问,默认不支持,必须加扩展参数multiport
10 
11       -m   --- 指定应用扩展模块参数
12 
13               multiport   --- 可以匹配多个不连续端口信息

 

4、通过防火墙实现禁ping功能

实现ping功能测试链路是否正常,基于icmp协议实现的

icmp协议有多种类型(这里只需关注0和8):

  icmp-type 8:请求类型  icmp-type 0:回复类型    

  

情况一:实现禁止主机访问防火墙服务器(禁ping,主机主动)

1 iptables -A INPUT -p icmp --icmp-type 8 -j DROP   --直接不允许ping进来
2 
3 iptables -A OUTPUT -p icmp --icmp-type 0 -j DROP --允许进来,但是不允许防火墙回复

 

情况二:实现禁止防火墙访问主机服务器(禁ping,防火墙主动)

1 iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP  --防火墙不让ping请求出去
2 
3 iptables -A INPUT -p icmp --icmp-type 0 -j DROP  --防火墙可以让请求发送,但是不让回复进来

 

一般情况:所有icmp类型都禁止

1 iptables -A INPUT -p icmp -m icmp --icmp-type any -j DROP
2 
3 iptables -A OUTPUT -p icmp -m icmp --icmp-type any -j DROP

 

5、实现防火墙状态机制控制

       --根据连接追踪机制检查连接的状态

  --能够增强服务器(比如web服务)的安全性,避免反弹式木马攻击,但是必须打开连接追踪功能,

  --这样会消耗服务器的性能。反弹式木马其实就是被动等待肉鸡来连接的一种木马,如灰鸽子,

  --一般防火墙对内部访问外部的数据都不会过问,肉鸡会主动连接控制端。

 

调整连接追踪功能所能够容纳的最大连接数量:

       /proc/sys/net/nf_conntrack_max

已经追踪到并记录下的连接:

       /proc/net/nf_conntrack

不同协议或连接类型追的时长:

       /proc/sys/net/netfilter/

 

可追踪的连接状态:

       NEW:新发出的请求;连接追踪模板中不存此连接相关的信息条目,因此,将其识别为第一次发出的请求;发送数据包里面控制字段为syn=1,发送第一次握手的数据包。

       ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态;请求数据包发出之后,响应回来的数据包称为回复的包

       RELATED:相关的连接;基于一个连接,然后建立新的连接,如ftp协议的命令连接与数据连接之间的关系;

       INVALIED:无法识别的连接;无效的的数据包,数据包结构不符合正常要求的

1 例如:iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT  --防火墙放行FTP主动模式的配置

 

6、防火墙放行FTP的主被动模式

开放主动模式

1 iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
2 
3 iptables -A INPUT -p tcp -s x.x.x.x --dport 20:21  -j ACCEPT

 

开放被动模式方法一:

 1 如果用vsftpd,修改配置文件,设置最小和最大打开端口
 2 
 3 pasv_min_port=2222
 4 
 5 pasv_max_port=2225
 6 
 7 iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
 8 
 9 iptables -A INPUT -p tcp -s x.x.x.x --dport 21  -j ACCEPT
10 
11 iptables -A INPUT -p tcp -s x.x.x.x --dport 2222:2225  -j ACCEPT

 

方法二使用连接追踪模块:

 1 (1) 装载ftp追踪时的专用的模块:
 2 
 3        /lib/modules/2.6.32-696.el6.x86_64/kernel/net/netfilter/nf_conntrack_ftp
 4 
 5        modinfo nf_conntrack_ftp.ko
 6 
 7        # modprobe nf_conntrack_ftp
 8 
 9 (2) 放行请求报文:
10 
11        命令连接:NEW, ESTABLISHED
12 
13        数据连接:RELATED, ESTABLISHED
14 
15        # iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
16 
17        # iptables -A INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
18 
19 (3) 放行响应报文:
20 
21        ESTABLISEHD
22 
23        # iptables -A OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT

 

7、如何保存及重载规则

       直接保存:规则自动保存到了/etc/sysconfig/iptables,用此命令保存的规则开机会自动生效。

iptables save

       保存规则至指定文件:

              iptables-save > /etc/sysconfig/iptables

       从指定文件重载规则:

              iptables-restore < /etc/sysconfig/iptables

       保存规则:#iptables-save >/etc/iptables-script

       恢复规则:#iptables-restore>/etc/iptables-script

       开机自动恢复规则,把恢复命令添加到启动脚本:echo '/sbin/iptables-restore /etc/iptables-script' >>/etc/rc.d/rc.local

 

8、iptables实现共享上网方法(postrouting,外网地址确定)

1)先配置内网服务器,设置网关地址为防火墙的内网地址

说明:内网服务器网关地址指定为共享上网服务器内网网卡地址

 

2)配置共享上网服务器(防火墙),开启共享上网服务器路由转发功能

vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

sysctl -p

 

3)配置共享上网服务器,实现内网访问外网的NAT映射

iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.7

-s 172.16.1.0/24              --- 指定将哪些内网网段进行映射转换

-o eth0                          --- 指定在共享上网哪个网卡接口上做NAT地址转换

-j SNAT               --- 将源地址进行转换变更

-j DNAT               --- 将目标地址进行转换变更

--to-source ip地址        --- 将源地址映射为什么IP地址

--to-destination ip地址    --- 将目标地址映射为什么IP地址

 

如果forward默认drop策略,就需要配置forward链

iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT

iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT

iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT

iptables -A FORWARD -o eth1 -d 172.16.1.0/24 -j ACCEPT
# 网络数据包传输过程一定是有去有回的

 

9、iptables实现共享上网方法(postrouting,外网地址不确定)

1 iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j MASQUERADE  -- 伪装共享上网
2 
3 说明:在企业中如何没有固定外网IP地址,可以采取以上伪装映射的方式进行共享上网

总结:配置映射方法

01. 指定哪些网段需要进行映射    -s 172.16.1.0/24

02. 指定在哪做映射               -o eth0

03. 用什么方法做映射             -j SNAT/DNAT

04. 映射成什么地址               --to-source  ip地址/--to-destination ip地址

 

10、iptables实现外网IP的端口映射到内网IP的端口(prerouting)

需求:将网关的IP和9000端口映射到内网服务器的22端口

端口映射 10.0.0.7:9000 -->172.16.1.8:22

1 实现命令:
2 
3 iptables -t nat -A PREROUTING -d 10.0.0.7  -i eth0 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.8:22

-d 10.0.0.8    目标地址。

-j DNAT      目的地址改写。

 

以上很多纯属个人在学习iptables时的笔记和自行拓展内容,如果有不准确之处还希望大家指出!!!

望大家评论交流!!!

 
 
posted @ 2019-10-03 12:23  Repetition_Maximum  阅读(1156)  评论(0编辑  收藏  举报