iptables实际上是Linux内置模块netfilter的管理程序,netfilter才是真正意义上起到防火墙作用的内核模块,并且工作在内核空间,而管理程序iptables则工作在用户空间。作为用户无法直接操作内核模块,因此需要通过iptables去编写防火墙规则。

    在生产环境中,大多数都使用硬件防火墙,较少使用Linux服务器作为网关设备。我们就以iptables作为“主机型防火墙”(即主要对本机进行保护的防火墙)来了解其编写规则。

    iptables采用了“表”和“链”的分层结构,如下图所示:

wKioL1i-xymSf1oiAADppTESvFo845.jpg-wh_50

    由图可知,iptables主要包含了四表五链,每张表可以理解为一个容器,每张表中有不同的链,而每条链中又包含了若干的规则,而这些规则正是实现防火墙的策略。

    基本格式:iptables [-t 表名] 管理选项 [链名] [匹配条件] -j [动作]

管理选项:

-A:在指定链的末尾追加一条新的规则。

-D:删除指定链中的某条规则,可以指定规序号或具体内容

-I:在指定链中插入一条新的规则,未指定序号时默认作为第一条规则。

-L:列出指定链中所有规则。

-P:设定默认规则。

-F:清空指定链中的所有规则,未指定具体链,则清空表中所有链。使用-F时默认策略不会受到影响

-Z:清除链中的计数器

-X:清除自定义链

-n:使用数字形式显示输出结果。

-v:查看规则时显示详细信息。

--line-numbers:查看规则列表时,同时显示在规则中的序号。

动作:

ACCEPT:允许数据包通过。

DROP:直接丢弃数据包。

匹配条件:

匹配条件具有很大的灵活性,常见的有以下几种:

-s:源地址匹配,如192.168.1.1、192.168.1.0/24

-d:目标地址匹配

-p:协议匹配

--sport:源端口匹配

--dport:目标端口匹配

-i或-o:接口匹配

-m state --state [NEW | ESTABLISHED | RELATED]:状态匹配

NEW——与任何链接无关

ESTABLISHED——已经建立连接的

RELATED——与已有连接有相关性


    示例:

设置默认规则:

iptables -P OUTPUT ACCEPT

iptables -P INPUT DROP


清除自定义链

[root@master ~]# iptables -t filter -X

[root@master ~]# iptables -t nat -Z


开放端口:

iptables -I INPUT -d 本机IP -p tcp --dport 80 -j ACCEPT

iptables -I INPUT -d 本机IP -p tcp --dport 22 -j ACCEPT

[root@slave2 ~]# iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT


拒绝IP为192.168.1.0/24网段的数据包进入本机:

iptables -I INPUT -s 192.168.1.0/24 -j DROP 


共享固定IP地址上网(长期有效,可以把命令写入rc.local文件)

[root@slave2 ~]# vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

[root@slave2 ~]# sysctl -p

[root@slave2 ~]# iptables -t nat -A POSTROUTING -s 192.168.154.0/24 -o eth0 -j SNAT --to-source 218.29.30.31

共享动态IP地址上网(如ADSL)

[root@slave2 ~]# iptables -t nat -A POSTROUTING -s 192.168.154.0/24 -o PPP0 -j MASQUERADE


发布企业内部的Web服务器

[root@slave2 ~]# vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

[root@slave2 ~]# sysctl -p

[root@slave2 ~]# iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 80 -j DNAT --to-destination 192.168.154.156


通过公网IP的8888端口连接内网服务器的sshd服务

[root@slave2 ~]# vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

[root@slave2 ~]# sysctl -p

[root@slave2 ~]# iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 8888 -j DNAT --to-destination 192.168.1.1:22


查看防火墙规则:

iptables -L -n --line-numbers

Chain INPUT (policy DROP)

num  target     prot opt source               destination         

1    DROP       all  --  192.168.154.156      0.0.0.0/0           

2    ACCEPT     tcp  --  0.0.0.0/0            192.168.154.160     tcp dpt:8080 

3    ACCEPT     tcp  --  0.0.0.0/0            192.168.154.160     tcp dpt:80 

4    ACCEPT     tcp  --  192.168.154.161      0.0.0.0/0           tcp dpt:873 

5    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 

6    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           

7    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

8    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 

9    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

10   DROP       all  --  192.168.154.156      0.0.0.0/0           

11   DROP       all  --  192.168.154.156      0.0.0.0/0           

12   DROP       all  --  192.168.154.156      0.0.0.0/0           

13   DROP       all  --  192.168.154.156      0.0.0.0/0           


Chain FORWARD (policy ACCEPT)

num  target     prot opt source               destination         

1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 


Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination         


[root@slave2 ~]# iptables -t nat -n -L OUTPUT       #查看nat表OUTPUT链的规则

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination 

     

删除和清空规则

[root@slave2 ~]# iptables -D INPUT 8                #删除INPUT链的第8条规则

[root@slave2 ~]# iptables -F                        #清除filter表中所有规则

[root@slave2 ~]# iptables -F INPUT                  #清除filter表INPUT链的所有规则


保存防火墙规则:

service iptables save


把防火墙规则保存到文件中:

iptables-save > a.txt


从文件中恢复防火墙规则:

iptables-restore < a.txt

备注:通常情况下,如果前端有硬件防火墙,则关闭内网所有的iptables;如果服务器有公网IP,直接面向公网,则设置INPUT链的默认规则为DROP,并且开放必要的端口,如Web服务器的80端口。OUTPUT链的默认规则可以设置为ACCEPT。