Iptables

 

Iptables是属于网络层的防火墙,但是并不正真意义上是防火墙,因为iptables/netfilter是一个组件,iptables只是负责编写规则并提交给netfilter做执行的规则生成器。Netfiter是在linux内核中TCP/IP协议栈中工作的一个框架,从软件的角度来将是在TCP/IP协议栈中做了五个钩子函数,这五个钩子函数可非常准确的执行iptables所编写的规则并实现规则中相关的拦截和放行。规则的功能分别为raw,mangle,nat,filter四种,这些规则统称为表;而钩子函数分为PREROUTING、INPUT、FORWARD、OUTPUT、POSTOUTING五种,这些钩子函数统称为链

钩子函数是指:

:马上就要到本机时,简称为路由前

:到达本机内部的报文必经之路

:由本机转发的报文必经之路

:由本机发出的报文的必经之路

:马上就要离开本机,简称为路由后

规则的功能是指:

过滤,定义是否允许通过防火墙

地址转换,用于转换源地址和源端口或目标地址和目标端口

用于修改报文首部某些特性但不修改IP

目标是为nat表上启用的连接追踪功能

 

表和链的对应关系:

             filter:INPUT, FORWARD, OUTPUT

(SNAT),POSTROUTING(DNAT),OUTPUT

             mangle:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

             raw:PREROUTING, OUTPUT

下为图解:

                  

iptables可以卸载吗 iptables应用_网络

使用iptables编辑完规则后是可以直接生效的,因为iptables编辑完成以后会自动发往netfilter内,netfilter接收到以后便立即执行

下面说下iptables编写规则的基本使用

Iptables的基本语法

  iptables[-t TABLE] COMMAND CHAIN  CRETIRIA -jTARGET

表示指定规则

        nat, mangle, raw, filter

默认为filter

:  链中的命令

:flush,清空规则链

自建一条链

删除一条自定义的空链

:zero, 计数器归零

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

:重命名自定义链

链中的规则:

:增加

:插入

:删除

:修改、替换

查询:

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

详细格式

显示规则编号

匹配条件分为通用匹配和扩展匹配,扩展匹配又分为隐式匹配和显示匹配,下面是匹配条件的具体命令

通用匹配:

地址: 指定报文源IP地址的匹配的范围,可以是IP也可以是网络地址;可使用!取反, --src,--source和-s表达的意思一样

地址:指定报文目标IP地址匹配的范围,--dst,--destination和-d表达的意思一样

协议:指定匹配报文的协议类型,一般有三种tcp,udp和icmp;

数据报文流入的接口;PREROUTING,INPUT, FORWARD

数据报文流出的接口;OUTPUT, FORWARD, POSTROUITING

扩展匹配:

隐式扩展:

   -ptcp [-m tcp]

:指定源端口

:指定目标端口

要检查标志位列表(用逗号分隔)必须为1的标志位列表(逗号分隔)

   -p udp [-m udp]

:指定源端口

:指定目标端口

   -picmp [-m icmp]

       --icmp-type

响应

请求

显示扩展:

扩展模块名称(模块:是iptables,netfilter各拥有的一部分代码;在添加模块时可使用“,”和“:” ,表示离散的、:表示连续的)


multiport:多端口匹配(可用于匹配非连续或连续端口;最多指定15个端口;在添加模块时可使用,和: ,表示离散的,:表示连续的)

专用选项:

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

   --destination-ports, --dports

    --ports

iprange:匹配指定范围内的地址;匹配一段连续的地址而非整个网络时有用;

专用选项:

:源地址或地址段[!表示可以取反]

目标地址或地址段

string:字符串匹配,能够检测报文应用层中的字符串(字符匹配检查高效算法kmp, bm)

专用选项:

:比较时的算法

    --string "STRING"

为编码成16进制格式的字串;

(注:string和hex-string中选其一使用就可以)

time:基于时间做访问控制

专用选项:

:起始时间

:结束时间

    --timestart    hh:mm[:ss]

     --timestop     hh:mm[:ss]             

:设定以星期为单位

connlimit:连接数限制,对每IP所能够发起并发连接数做限制;

专用选项:

大于所设定的数字就拒绝,小于就允许

 

limit:速率限制

专用选项:

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

(n表示个数)

state:状态检查

专用选项:

 --state

连接追踪中的状态:

NEW: 新建立一个会话

ESTABLISHED:已建立的连接

RELATED: 有关联关系的连接

INVALID: 无法识别的连接

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

        /proc/sys/net/nf_conntrack_max           

记录当前追踪的所有连接

          /proc/net/nf_conntrack 

不同协议或连接类型追踪时的属性:

目录:

处理目标:

内置目标:

:表示拒绝

:有状态的拒绝

:允许

自定义链:为自己根据需求所设定的链

 



Iptables的常用命令已经介绍完了,下面为大家举例说明命令的使用
1、设定172.16.0.0网段的无法ping通172.16.25.1主机
root@localhost~]# iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.25.1 -p icmp -j DROP
2、查看设定的情况
[root@localhost~]# iptables -L -n –v
3、删除INPUT中设定的第一条策略
[root@localhost~]# iptables -D INPUT 1
4、再设置INPUT,OUTPUT链默认target为DROP,一定要将远程端口设定为打开,否则也会把自己挡在防火墙之外
[root@localhost~]# iptables -A INPUT -i eth0 -s 172.16.0.0/16 -d 172.16.25.1 -p tcp --dport 22-j ACCEPT
[root@localhost~]# iptables -A OUTPUT -s 172.16.25.1 -d 172.16.0.0/16 -p tcp --sport 22 -jACCEPT
5、设置INPUT, OUTPUT链默认target为DROP,也就是外部与服务器不能通信
[root@localhost~]# iptables -t filter -P INPUT DROP
[root@localhost~]# iptables -t filter -P OUTPUT DROP
6、修改在使用远程访问本机时只能通过eth0的端口访问
[root@localhost~]# iptables -R OUTPUT 1 -s 172.16.25.1 -d 172.16.0.0/16 -o eth0 -p tcp --sport22 -j ACCEPT
7、插入一条对应规则,可以使本主机ping自己的回环地址
[root@localhost~]# iptables -I INPUT -i lo -j ACCEPT
[root@localhost~]# iptables -I OUTPUT -o lo -j ACCEPT
8、设置本机可以ping其他主机
[root@localhost~]# iptables -R INPUT 2 -d 172.16.25.1 -p icmp --icmp-type 0 -j ACCEPT
[root@localhost~]# iptables -A OUTPUT -s 172.16.25.1 -p icmp --icmp-type 8 -


j ACCEPT
9、添加multiport模块,设置只能使用访问本机的22和80端口的服务
[root@localhost~]# iptables -I INPUT -d 172.16.25.1 -p tcp -m multiport --dports 22,80 -jACCEPT
[root@localhost~]# iptables -R OUTPUT 1 -s 172.16.25.1 -p tcp -m multiport --sports 22,80 -jACCEPT
10、添加iprange模块,设置只能某个网段使用telnet来访问本主机
[root@localhost~]# iptables -I INPUT -d 172.16.25.1 -p tcp --dport 23 -m iprange --src-range172.16.25.1-172.16.25.210 -j ACCEPT
[root@localhost~]# iptables -I OUTPUT  -s 172.16.25.1 -ptcp --sport 23 -m iprange --dst-range 172.16.25.1-172.16.25.210
11、添加string模块,设置只要出现所设定的字符就会出现拒绝访问
[root@localhost ~]# iptables -I OUTPUT-m string --algo kmp --string "game" -j DROP
12、添加time模块,设定在工作日的9点到17点拒绝访问本主机的web服务
[root@localhostwordpress]# iptables -I INPUT -d 172.16.25.1 -p tcp --dport 80 -m time--timestart 09:00 --timestop 17:00 --weekdays Tue,Thur -j DROP


13、添加connlimit模块,限制连接数
[root@localhostwordpress]# iptables -A INPUT -d 172.16.25.1 -p tcp --dport 22 -m connlimit--connlimit-above 2 -j DROP
14、添加limit模块,限制速率
[root@localhostwordpress]# iptables -A INPUT -d 172.16.25.1 -p icmp --icmp-type 8 -m limit--limit 20/m --limit-burst 7 -j ACCEPT
15、state的使用
1)使用state模块设置ssh和web的出入策略
[root@localhost~]# iptables –A INPUT –d 172.16.25.1 –p tcp –m multiport --dports 22,80 –mstate –state NEW –j ACCPET
[root@localhost~]#iptables –I INPUT –d 172.16.25.1 –p tcp –m state –state ESTABLISHED –jACCEPT
[root@localhost~]#iptables –I OUTPUT –s 172.16.25.1 –p tcp –m state –state ESTABLISHED –jACCEPT
2)设置被动连接的ftp服务
[root@localhost~]# modprobe nf_conntrack_ftp
[root@localhost~]# iptables -AINPUT -d 172.16.25.1 -p tcp -m state --state RELATED -j ACCEPT
[root@localhost~]#iptables-R OUTPUT 1 -s 172.16.25.1 -m state --state ESTABLISHED,RELATED -j ACCEPT