Linux 学习之防火墙配置

1.安装iptables防火墙

yum install iptables 
2. 清除已有的iptables规则 
iptables -F 
iptables -X 
iptables -Z 
3.显示iptables规则数
iptables -L -n --line-numbers
4. 删除已经添加的iptables规则
iptables -D INPUT 8
5.iptables开机自动启动保存
chkconfig --level 345 iptables on
service iptables save

iptables简介

    netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

iptables基础

    规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。

iptables和netfilter的关系:

    这是第一个要说的地方,Iptables和netfilter的关系是一个很容易让人搞不清的问题。很多的知道iptables却不知道netfilter。其实iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables,真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构。

iptables传输数据包的过程

① 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。 
② 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链,数据包到了INPUT链后,任何进程都会收到它,本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。 
③ 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。

iptables的规则表和链:

    表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。

   链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
    Iptables采用“表”和“链”的分层结构。在REHL4中是三张表五个链,现在REHL5成了四张表五个链了,不过多出来的那个表用的也不太多,所以基本还是和以前一样。下面罗列一下这四张表和五个链。注意一定要明白这些表和链的关系及作用。

规则表:

1.filter表——三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包  内核模块:iptables_filter.
2.Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat
3.Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)
4.Raw表——两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理  内核模块:iptable_raw
(这个是REHL4没有的,不过不用怕,用的不多)

规则链:

1.INPUT——进来的数据包应用此规则链中的策略
2.OUTPUT——外出的数据包应用此规则链中的策略
3.FORWARD——转发数据包时应用此规则链中的策略
4.PREROUTING——对数据包作路由选择前应用此链中的规则
(记住!所有的数据包进来的时侯都先由这个链处理)
5.POSTROUTING——对数据包作路由选择后应用此链中的规则
(所有的数据包出来的时侯都先由这个链处理)

规则表之间的优先顺序:

Raw——mangle——nat——filter
规则链之间的优先顺序(分三种情况):

第一种情况:入站数据流向

    从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。

第二冲情况:转发数据流向
    来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

第三种情况:出站数据流向
    防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

防火墙修改示例:

service iptables status可以查看到iptables服务的当前状态
/etc/init.d/iptables stop
/etc/init.d/iptables start

封单个IP的命令
iptables -I INPUT -s 211.1.0.0 -j DROP

封IP段的命令是
iptables -I INPUT -s 211.1.0.0/16 -j DROP
iptables -I INPUT -s 211.2.0.0/16 -j DROP
iptables -I INPUT -s 211.3.0.0/16 -j DROP

封整个段的命令是
iptables -I INPUT -s 211.0.0.0/8 -j DROP

封几个段的命令是
iptables -I INPUT -s 61.37.80.0/24 -j DROP
iptables -I INPUT -s 61.37.81.0/24 -j DROP

服务器启动自运行
有三个方法:
1、把它加到/etc/rc.local中
2、iptables-save >;/etc/sysconfig/iptables可以把你当前的iptables规则放到/etc/sysconfig/iptables中,系统启动iptables时自动执行。
3、service  iptables  save 也可以把你当前的iptables规则放/etc/sysconfig/iptables中,系统启动iptables时自动执行。
后两种更好此,一般iptables服务会在network服务之前启来,更安全

解封:

iptables -L INPUT

iptables -L --line-numbers 然后iptables -D INPUT 序号

----------------------------------------------------

防火墙端口操作

开启端口:

#/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT

#/sbin/iptables -I INPUT -p tcp --dport 22 -j ACCEPT

然后保存:

#/etc/rc.d/init.d/iptables save

关闭端口:

#/sbin/iptables -I INPUT -p tcp --dport 80 -j DROP

#/sbin/iptables -I INPUT -p tcp --dport 22 -j DROP

然后保存:

#/etc/rc.d/init.d/iptables save

-------------------------

 iptables -F /* 清除所有规则 */
 iptables -A INPUT  -p tcp --dport 22 -j ACCEPT /*允许包从22端口进入*/
 iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT /*允许从22端口进入的包返回*/
 iptables -A OUTPUT -p udp --dport 53 -j ACCEPT /* 域名解析端口,一般不开 */
 iptables -A INPUT -p udp --sport 53 -j ACCEPT /* 域名解析端口,一般不开 */
 iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT /*允许本机访问本机*/
 iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
 iptables -A INPUT -p tcp -s 0/0 --dport 80 -j ACCEPT /*允许所有IP访问80端口*/
 iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
 iptables-save > /etc/sysconfig/iptables /*保存配置*/
 iptables -L /* 显示iptables列表 */

首先简单介绍一下什么是IPTables:

    iptables是Linux内核中内置的防火墙,可以允许管理员通过设置table, chain以及相关的规则来进行数据包过滤和NAT。 一般来讲,iptables防火墙已经内置于CentOS 6及其他Linux版本中,而且iptables服务默认都是启动的。  iptables应用于IPv4, 如果要用IPv6,需要使用ip6tables.

iptables [-t table] command [chain] [rules] [-j target] 

[-t table] :用来指明使用的表, 有三种选项: filter, nat 和 mangle,如果未指定,则使用filter作为缺省表。 事实上,对于单个服务器的防火墙配置,一般来讲,我们只需要对filter表进行配件就OK了。filter表包括 INPUT, OUTPUT,和FORWARD三个chain.

command 表明iptables命名要做什么,比如

-A (–append): 该命令会把一条规则附件到chain的末尾。

-D(–delete)用来删除某个规则。

-F (–flush) 如果指定了chain, 删除该chain中的所有规则,如果未指定chain, 则删除所有chain中的所有规则。

target: 是由规则指定的操作。 包括下面几种:

ACCEPT: 接收信息包(允许它前往目的地),并且将停止遍历chain.

DROP:  拒绝,

此外还有REJECT, RETURN, LOG, REDIRECT, MARK, MIRROR, MAQUERADE等。

具体的iptables的语法和概念就不再多说了,请参照 iptables man page 官方文档 .

    简单来说,iptables防火墙是由一系列的规则(rule)组成,  一个数据请求进来, 会依次和这些规则进行比较,如果正好符合规则的定义,那这个数据请求要么会被接收ACCEPT,要么被拒绝DRIP。如果不符合任何规则的定义,最后缺省的规则会被应用。

开始操作之前:

    注意:一定要把你在DigitalOcean/ Linode/ 阿里云上的服务器做一下快照备份 , 否则一旦你 iptables的配置出了问题,极有可能把你自己挡在门外,你自己都无法连接到服务器了!! 出现这种情况可是会欲哭无泪呀,除了重新做系统好像没有更好的办法了。( DigitalOcean提供了一个web console的界面,有时候会给你反悔和擦除iptables设置的机会,但阿里云没有)决定哪些端口需要开放,首先, SSH 的端口22自然是需要开放的,否则我们就无法登录服务器了。一般来讲,CentOS的VPS经常作为用LAMP搭建的Web服务器,FTP服务器, Mail服务器等。对于Web服务来说,需要开放80端口,如果是HTTPS/SSL协议的话,还需用开放443端口,对于Mail服务来说,由于涉及SMTP, POP3, IMAP协议,需要开放的端口如下:

SMTP : 25   Secure SMTP:465  POP3: 110   Secure POP3: 995   IMAP: 143   IMAP over SSL: 993

对于FTP服务来说,需要开放 20, 21两个端口

第一步: 屏蔽最常见的攻击

缺省情况下,CentOS的iptables的设置是允许任何数据通过的。

我们首先要清空iptables中的所有的规则:


iptables -F

然后我们加上阻止简单扫描和攻击的规则

1 iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP             #NONE 包(所有标识bit都没有设置)主要是扫描类的数据包
2 iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP     #防止sync-flood 攻击
3 iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP              #ALL包(所有的标注bit都被设置了)也是网络扫描的数据包

第二步: 为相应的服务开放对应的端口

首先我们应该接受本机localhost的任何请求,否则,数据库连接等将无法工作

iptables -A INPUT -i lo -j ACCEPT

对于不同的服务需要开放不同的端口

1 iptables -A INPUT -p tcp --dport 22 -j ACCEPT      # SSH
2 iptables -A INPUT -p tcp --dport 80 -j ACCEPT      # HTTP
3 iptables -A INPUT -p tcp --dport 443 -j ACCEPT     #HTTPS
4 iptables -A INPUT -p tcp --dport 25 -j ACCEPT   #SMTP
5 iptables -A INPUT -p tcp --dport 465  -j ACCEPT #Secure SMTP
6 iptables -A INPUT -p tcp --dport 110 -j ACCEPT   #POP3
7 iptables -A INPUT -p tcp --dport 995 -j ACCEPT   #Secure POP3
8 iptables -A INPUT -p tcp --dport 143 -j ACCEPT   #IMAP
9 iptables -A INPUT -p tcp --dport 993 -j ACCEPT   #Secure IMAP

第三步: 加上通用的规则

    首先要允许所有从服务器端发起的连接,由此返回的响应数据应该是允许的!比如VPS发起的yum update , 必须要允许外部的update数据进来

iptables -I INPUT -m state  --state ESTABLISHED, RELATED -j ACCEPT

最后,设置缺省的策略:屏蔽任何进入的数据请求,允许所有从Server发出的请求

1 iptables -P OUTPUT ACCEPT
2 iptables -P INPUT DROP

第四步: 保存设置

首先通过下面的命令查看一下我们的设置是否正确!

1 ptable -L -n

确认没有问题后,执行下面的命令

1 service iptables save

执行上述命令后,相应的规则会写入 /etc/sysconfig/iptables这个文件,你可以检查一下看看。

最后执行

1 service iptables restart

重新启动iptables防火墙,以使上述设置生效。

最佳的方法

    为了更方便的修改和维护自己的iptables的设置,我一般是把所有的iptables的设置先写到一个单独文件中,测试没有问题后。然后再保存到iptable的配置文件中。下面是我自己的iptables文件:~/script/firewall.sh

 1 </pre>
 2 #!/bin/bash
 3 # A simple iptables firewall configuration
 4  
 5 PATH=/sbin:/bin:/usr/sbin:/usr/bin; export PATH
 6  
 7 #flush/erase original rules
 8 iptables -F #清除所有已制定的rule
 9 iptables -X #清除用户自定义的chain/table
10 iptables -Z #将所有的chain的计数和流量统计归零
11  
12 #Accept localhost connetting, no matter what it is
13 iptables -A INPUT -i lo -j ACCEPT
14  
15 #Accept any response package which is initiated from inside
16 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
17  
18 #block most common network attacks(recon packets and syn-flood attack)
19 iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
20 iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
21 iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
22  
23 #open ports for different services
24 iptables -A INPUT -p tcp --dport 22 -j ACCEPT #SSH
25 iptables -A INPUT -p tcp --dport 80 -j ACCEPT #HTTP
26 #iptables -A INPUT -p tcp --dport 443 -j ACCEPT #HTTPS
27 #iptables -A INPUT -p tcp --dport 25 -j ACCEPT #SMTP
28 #iptables -A INPUT -p tcp --dport 465 -j ACCEPT #Secure SMTP
29 #iptables -A INPUT -p tcp --dport 110 -j ACCEPT #POP3
30 #iptables -A INPUT -p tcp --dport 995 -j ACCEPT #Secure POP
31  
32 #ICMP configuration
33 #To prevent ICMP DDOS,we do not allow ICMP type 8(echo-request) or limit this request with 1/second
34 #some ICMP requests are allowed.
35 icmp_type="0 3 4 11 12 14 16 18"
36 for ticmp in $icmp_type
37 do
38     iptables -A INPUT -p icmp --icmp-type $ticmp -j ACCEPT
39 done
40 #iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 1/second -j ACCEPT
41  
42 #default policies
43 iptables -P OUTPUT ACCEPT
44 iptables -P INPUT DROP
45  
46 #save to /etc/sysconfig/iptables
47 /etc/init.d/iptables save
原文地址:https://www.cnblogs.com/sunfie/p/5112797.html