一.iptables简介

防火墙,其实说白了讲,就是用于实现Linux下访问控制功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测,它的功能十分强大,使用非常灵活,毫不逊色于一些企业级防火墙。

二.Netfilter、table、chains、policy之间的关系。

Netfilter是table的容器,而table(表)是chains(链)的容器,policy(规则)属于chain(链)。
为了方便读者理解,举个例子:如果把Netfilter比作一栋楼,那么他们的关系如下:
linux笔记防火墙之iptables入门

三.iptables的工作原理

匹配规则原理图

linux笔记防火墙之iptables入门_第1张图片

防火墙规则的执顺序默认是从前到后,遇到匹配规则(不管是deny或者accept)后就不再往下检查,如果遇到不到匹配的规则会继续向下检查直到遇到匹配规则为止,若检查完所有规则还没有匹配就会使用默认规则进行匹配。

iptable表和链的对应关系

linux笔记防火墙之iptables入门_第2张图片

防火墙默认使用的是Fileter表,负责过滤本机流入、流出的数据包
INPUT:负责过滤所有目标地址是本机地址的数据包
FORWARD:负责转发流经本机但不进入本机的数据包,起转发的作用
OUTPUT:处理所有从本机发出去的数据包。
PROWARD:在数据包到达防火墙时,进行路由判断之前执行的规则,改变数据包的目的地址(DNAT)、端口等,通常应用于端口映射,例如把公网ip地址或端口映射为某个内网的ip地址或端口。
POSTROUTING:在数据包离开防火墙时进行路由判断之后执行的规则,改变数据包的源地址(SNAT)、端口等,通常应用于,局域网共享外网ip上网。例如,把所有的局域网ip都转换成一个公网ip实现上网。

链和表的工作流程图

linux笔记防火墙之iptables入门_第3张图片

四.详解COMMAND:

1.链管理命令(这都是立即生效的)

-P :设置默认策略的(设定默认门是关着的还是开着的)
    默认策略一般只有两种
    iptables -P INPUT (DROP|ACCEPT)  默认是关的/默认是开的
    比如:
    iptables -P INPUT DROP 这就把默认规则给拒绝了。并且没有定义哪个动作,所以关于外界连接的所有规则包括Xshell连接之类的,远程连接都被拒绝了。
    -F: FLASH,清空规则链的(注意每个链的管理权限)
    iptables -t nat -F PREROUTING
    iptables -t nat -F 清空nat表的所有链
    -N:NEW 支持用户新建一个链
        iptables -N inbound_tcp_web 表示附在tcp表上用于检查web的。
    -X: 用于删除用户自定义的空链
        使用方法跟-N相同,但是在删除之前必须要将里面的链给清空了
    -E:用来Rename chain主要是用来给用户自定义的链重命名
        -E oldname newname
     -Z:清空链,及链中默认规则的计数器的(有两个计数器,被匹配到多少个数据包,多少个字节)
        iptables -Z :清空

2.规则管理命令

     -A:追加,在当前链的最后新增一个规则
     -I num : 插入,把当前规则插入为第几条。
        -I 3 :插入为第三条
     -R num:Replays替换/修改第几条规则
        格式:iptables -R 3 …………
     -D num:删除,明确指定删除第几条规则

3.查看管理命令 “-L”

 附加子命令
 -n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名。
 -v:显示详细信息
 -vv
 -vvv :越多越详细
 -x:在计数器上显示精确值,不做单位换算
 --line-numbers : 显示规则的行号
 -t nat:显示所有的关卡的信息

五.详解匹配标准

1.通用匹配:源地址目标地址的匹配

 -s:指定作为源地址匹配,这里不能指定主机名称,必须是IP
    IP | IP/MASK | 0.0.0.0/0.0.0.0
    而且地址可以取反,加一个“!”表示除了哪个IP之外
 -d:表示匹配目标地址
 -p:用于匹配协议的(这里的协议通常有3种,TCP/UDP/ICMP)
 -i eth0:从这块网卡流入的数据
    流入一般用在INPUT和PREROUTING上
 -o eth0:从这块网卡流出的数据
    流出一般在OUTPUT和POSTROUTING上

2.扩展匹配

2.1隐含扩展:对协议的扩展

-p tcp :TCP协议的扩展。一般有三种扩展
--dport XX-XX:指定目标端口,不能指定多个非连续端口,只能指定单个端口,比如
--dport 21  或者 --dport 21-23 (此时表示21,22,23)
--sport:指定源端口
--tcp-fiags:TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)
    对于它,一般要跟两个参数:
    1.检查的标志位
    2.必须为1的标志位
    --tcpflags syn,ack,fin,rst syn   =    --syn
    表示检查这4个位,这4个位中syn必须为1,其他的必须为0。所以这个意思就是用于检测三次握手的第一次包的。对于这种专门匹配第一包的SYN为1的包,还有一种简写方式,叫做--syn
-p udp:UDP协议的扩展
    --dport
    --sport
-p icmp:icmp数据报文的扩展
    --icmp-type:
    echo-request(请求回显),一般用8 来表示
    所以 --icmp-type 8 匹配请求回显数据包
    echo-reply (响应的数据包)一般用0来表示

2.2显式扩展(-m)

 扩展各种模块
  -m multiport:表示启用多端口扩展
  之后我们就可以启用比如 --dports 21,23,80

六.详解-j ACTION

 常用的ACTION:
 DROP:悄悄丢弃
    一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表
 REJECT:明示拒绝
 ACCEPT:接受
    custom_chain:转向一个自定义的链
 DNAT
 SNAT
 MASQUERADE:源地址伪装
 REDIRECT:重定向:主要用于实现端口重定向
 MARK:打防火墙标记的
 RETURN:返回
    在自定义链执行完毕后使用返回,来返回原规则链。

七.iptable规则实战

1.查看当前所有的iptables配置

[root@centos7 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

2.清除防火墙的所有规则

[root@centos7 ~]# iptables -F //清除所有规则
[root@centos7 ~]# iptables –X //删除用户自定义的规则
[root@centos7 ~]# iptables –Z //链的计数器清零

我们检查一下结果
[root@centos7 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

3.禁止某个端口连接主机

例如禁止远程主句用ssh和本机的22端口进行连接

[root@centos7 ~]# iptables -A INPUT -p tcp --dport 22 -j DROP

4.删除规则的方法

方法一:
把规则命令的A换成D就可以把规则删除,例如:

[root@centos7 ~]# iptables -D INPUT -p tcp --dport 22 -j DROP

方法二:
查看iptables列表得到想要删除那条命令的规则号,删除规则号的方式进行删除

查看规则号
[root@centos7 ~]# iptables -L -n --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22

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

Chain OUTPUT (policy ACCEPT)
num target prot opt source destination

比如我要删除规则号为1这条规则

[root@centos7 ~]# iptables -D INPUT 1
[root@centos7 ~]# iptables -L -n --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination

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

Chain OUTPUT (policy ACCEPT)
num target prot opt source destination

可以看到规则已被删除。

5. 禁止某个网段接入我的eth0网卡,如10.10.10.0/24

[root@centos7 ~]# iptables -A INPUT -i eth0 -s 10.10.10.0/24 -j DROP
[root@centos7 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 10.10.10.0/24 0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

注意:参数不加-I默认对所有接口生效

6. 对多个不连续端口进行控制

禁止本机的80、445、3306端口对外提供服务
[root@centos7 ~]# iptables -A INPUT -p tcp -m multiport --dport 80,445,3389 -j DROP
[root@centos7 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 10.10.10.0/24 0.0.0.0/0
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 80,445,3389

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

对多个连续端口进行端口范围的控制

[root@centos7 ~]# iptables -A INPUT -p tcp --dport 25:30 -j DROP
[root@centos7 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 10.10.10.0/24 0.0.0.0/0
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 80,445,3389
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpts:25:30

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

7. 生产环境常用服务iptables规则实战(默认是对filter表进行操作)

1) 清除防火墙的所有规则
[root@centos7 ~]#
iptables -F
iptables -Z
iptables –X

2) 允许管理网192.168.10.0/24 ssh登入

[root@centos7 ~]#
iptables -A INPUT -p tcp -s 192.168.10.0/24 --dport 22 -j ACCEPT

3) 允许lo接口进行流入流出
[root@centos7 ~]# iptables -A INPUT -i lo -j ACCEPT

4) 严格控制默认防火墙拒绝规则
查看防火墙的默认规则全部链默认为ACCEPT
[root@centos7 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

接下来进行严格控制
[root@centos7 ~]# iptables -P FORWARD DROP
[root@centos7 ~]# iptables -P OUTPUT ACCEPT
[root@centos7 ~]# iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 192.168.10.0/24 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0

Chain FORWARD (policy DROP)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

可以看到NPUT链和FORWARD链的默认规则为拒绝所有,而OUTPUT链默认规则为允许所有。

5) 开启信任的ip段,例如允许办公网ip段 172.16.10.0/24 、 192.168.1.0/24

[root@centos7 ~]# iptables -A INPUT -s 172.16.10.0/24 -j ACCEPT
[root@centos7 ~]# iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT

6) 允许http服务无条件通过
[root@centos7 ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

7) 允许icmp协议通过
允许特定ip段可以ping该主机
[root@centos7 ~]# iptables -A INPUT -p icmp -s 192.168.10.0/24 -icmp --icmp-type any -j ACCEPT

允许所有的ip可以ping该主机
[root@centos7 ~]# iptables -A INPUT -p icmp -icmp --icmp-type any -j ACCEPT

8) 允许关联的状态包通过
[root@centos7 ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@centos7 ~]# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

注意:以上配置的常用的规则,可根据需要修改或增加其他规则。

9) 保证iptables配置文件为永久的配置文件
[root@centos7 ~]# iptables-save > /etc/sysconfig/iptables

检查结果
[root@centos7 ~]# cat /etc/sysconfig/iptables
Generated by iptables-save v1.4.21 on Sun Apr 22 00:45:14 2018
*filter
:INPUT DROP [23:3864]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [4:620]
-A INPUT -i lo -j ACCEPT
-A INPUT -s 192.168.10.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 172.16.10.0/24 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 192.168.10.0/24 -p icmp -j ACCEPT
-A INPUT -s 192.168.10.0/24 -i cmp -p icmp -m icmp --icmp-type any -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
#Completed on Sun Apr 22 00:45:14 2018

提示:iptables默认配置文件为/etc/sysconfig/iptables
以后增加或修改防火墙规则可直接在配置文件进行修改或者增加

八.网络共享上网和端口映射

1. DNAT

DNAT全称为Destination Network Address Translation,意思为目的网络地址转换,DNAT是一种能改变数据包的目的ip地址等功能的技术,它可以使多台服务器共享一个IP地址连入internet,并且继续对外提供服务,通过同一个外部IP地址分配不同的端口映射到内部服务器不同的ip地址和端口,从而实现内部服务器对外提供服务的目的。
例如:
[root@centos7 ~]#
iptables -t nat -A PREROUTING -d 203.85.14.11 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.136:80

将所有访问目的地址为203.85.14.11并且是80端口的请求,将地址映射为内部192.168.10.136的80端口,从而实现内部服务器对外提供服务的目的

2.SNAT

SNAT全称是 Source Network Address Translation,意思是源网络地址转换,这是一种改变数据包源ip地址的技术,通常是用来给内部多台计算机共享一个或多个internet地址上网的目的。从而实现内部服务器共享上网。

例如:
[root@centos7 ~]#
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-source 203.85.14.11

把源地址为192.168.10.0网段的数据包转换为203.85.14.11出网,从而实现内部服务器的共享上网

3.MASQUERADE

MASQUERADE为动态地址转换,即当外部ip非固定ip时经常使用的选项,例如ADSL拨号上网的情况。对于单个或者多个外部ip地址的情况,也可以实现共享上网的目的。
例如
[root@centos7 ~]#
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
把内部网络的源地址为192.168.10.0/24网段的数据包进行伪装,此命令可以实现ADSL线路多台计算机共享上网。