【防火墙概念】

防火墙是工作于主机或网络边缘,对进出的报文根据定义的规则做出检查,进而对被规则匹配到的报文做出相应处理的套件。

【iptables的概念】

iptables是网络层防火墙,它的功能是编写规则,然后交由netfilter来执行生效。

【iptables的组成】

五链:

PREROUTING路由前

INPUT到达本机内部

FORWARD         转发

OUTPUT         本机发出

POSTROUTING路由后

四表:

raw连接追踪表

mangle报头修改表

nat地址转换表

filter过滤表

N模块:(因为模块是可以依具自己的需求自行加载的,所以这里就暂时列出常用的基础几个)

multiport多端口匹配

iprange地址范围匹配

string字符串匹配

time时间匹配

connlimit连接数匹配

limit速率匹配

state状态匹配

...

【五链的数据流向图示】

wKiom1PzdRihf9fqAAE3iizyhQo403.jpg

【表跟链的对应关系】

raw:PREROUTING,OUTPUT

mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

nat:PREROUTING(SNAT),POSTROUTING(DNAT),OUTPUT

filter:INPUT,FORWARD,OUTPUT

【五链四表对照关系图示】

wKioL1PzdnCQqrKbAAEPdFEQU2o309.jpg

【数据报文的流向】

与本机进行通信:

流入:PREROUTING,INPUT

流出:OUTPUT,POSTROUTING

由本机转发:

请求:——>PREROUTING——>FORWARD——>POSTROUTING

响应:——>PREROUTING——>FORWARD——>POSTROUTING

数据报文的流向:

源IP和目标IP由流向决定

【写规则时的注意】

服务端:先进后出

客户端:先出后进

客户端端口是随机的,因此大多数场景下无需限定

【iptables的基本语法格式】

    iptables [-t TABLE] COMMAND CHAIN CRETIERIA -j TARGET

-t TABLE:

raw,mangle,nat,filter

默认为filter

COMMAND:

链:

-F:flush,清空规则链

-N:new,自建一条链

-X:delete,删除一条自定义的空链

-Z:zero,计数器归零

-P:policy,设置默认策略,对filter表来讲,默认规则为ACCEPT或DROP

-E:重命名自定义链

链中的规则:

-A:Append,附加

-I:Insert,插入

-D:Delete,删除

-R:Replace,替换

查询:

-L:List

-n:数字格式显示主机地址和端口

-v:详细格式

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

-x:不对计数器的计数结果做单位换算,而显示其精确值

CHAIN:

PREROUTING

INPUT

FORWARD

OUTPUT

POSTROUTING

CRETIERIA:

通用匹配:

-s:源地址,--src,--source

-d:目标地址,--dst,--destination

-p:协议,类型一般为:tcp,udp,icmp

-i:数据报文流入接口:PREROUTING,INPUT,FORWARD

-o:数据报文流出接口:OUTPUT,FORWARD,POSTROUTING

扩展匹配:

隐式扩展:

-p tcp:

--sport PORT[-PORT]:指定源端口

--dport PORT[-PORT]:指定目标端口

--tcp-flags:要检查的标志位

-p udp:

--sport

--dport

显式扩展:必须明确说明使用哪个模块进行扩展,而后才能使用其扩展专用选项

-m 

multiport:多端口限制匹配

专用选项:

   --source-ports, --sports port[,port,port:port]

   --destination-ports, --dports

   --ports

iprange:地址范围限制匹配

专用选项:

   [!] --src-ragne IP[-IP]

   [!] --dst-range

string:字符串限制匹配

专用选项:

   --algo {kmp|bm}

   --string "STRING"

   --hex-string "HEX_STRING": HEX_STRING为编码成16进制格式的字串

time:时间限制匹配

专用选项:

--datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]

--datestop 

--timestart hh:mm[:ss]

--timestop hh:mm[:ss]

--weekdays day[,day]

connlimit:连接数限制匹配

专用选项:

[!] --connlimit-above [n] 

limit:速率限制匹配

专用选项:

--limit n[/second|/minute|/hour|/day]

--limit-burst n

state:状态限制匹配

专用选项:

--state

连接追踪中的状态:

NEW: 新建立一个会话

ESTABLISHED:已建立的连接

RELATED: 有关联关系的连接

INVALID: 无法识别的连接

TARGET:

内置目标:

DROP

REJECT

ACCEPT

自定义的链:

自定义的链只能在五链中被调用执行,并且删除也必须要先解除调用关系后才能删除。

【iptables的常见操作模式】

删除规则:

iptables [-t table] -D chain rulenum

设置默认策略:

iptables [-t table] -P chain target

修改规则:

iptables [-t table] -R chain rulenum rule-specification

插入规则:

iptables [-t table] -I chain [rulenum] rule-specification

创建自定义链:

iptables [-t table] -N chain

删除自定义且0引用的空链

iptables [-t table] -X chain

重命名自定义链:

iptables [-t table] -E old_name new_name

【简单实例配置】

    1.插入并匹配多端口:

      # iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT

      # iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT

    2.附加并匹配地址范围:

      # iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT

      # iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT

    3.字符串匹配:

      # iptables -I OUTPUT -m string --algo kmp --string "sex" -j DROP

    4.时间匹配:

      # iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue,Thu,Fri -j REJECT

    5.连接数匹配:

      #iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP

    6.速率匹配:

      # iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT

    7.状态匹配:

      #iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT