Iptables
Iptables是属于网络层的防火墙,但是并不正真意义上是防火墙,因为iptables/netfilter是一个组件,iptables只是负责编写规则并提交给netfilter做执行的规则生成器。Netfiter是在linux内核中TCP/IP协议栈中工作的一个框架,从软件的角度来将是在TCP/IP协议栈中做了五个钩子函数,这五个钩子函数可非常准确的执行iptables所编写的规则并实现规则中相关的拦截和放行。规则的功能分别为raw,mangle,nat,filter四种,这些规则统称为表;而钩子函数分为PREROUTING、INPUT、FORWARD、OUTPUT、POSTOUTING五种,这些钩子函数统称为链
钩子函数是指:
PREROUTING:马上就要到本机时,简称为路由前
INPUT:到达本机内部的报文必经之路
FORWARD:由本机转发的报文必经之路
OUTPUT:由本机发出的报文的必经之路
POSTROUTING:马上就要离开本机,简称为路由后
规则的功能是指:
filter:过滤,定义是否允许通过防火墙
nat:地址转换,用于转换源地址和源端口或目标地址和目标端口
mangle:用于修改报文首部某些特性但不修改IP
raw:目标是为nat表上启用的连接追踪功能
表和链的对应关系:
filter:INPUT, FORWARD, OUTPUT
nat:PREROUTING(SNAT),POSTROUTING(DNAT),OUTPUT
mangle:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
raw:PREROUTING, OUTPUT
下为图解:
使用iptables编辑完规则后是可以直接生效的,因为iptables编辑完成以后会自动发往netfilter内,netfilter接收到以后便立即执行
下面说下iptables编写规则的基本使用
Iptables的基本语法
iptables[-t TABLE] COMMAND CHAIN CRETIRIA -jTARGET
-t TABLE: 表示指定规则
nat, mangle, raw, filter
默认为filter
COMMAND: 链中的命令
-F:flush,清空规则链
-N: new,自建一条链
-X: delete, 删除一条自定义的空链
-Z:zero, 计数器归零
-P:policy,设置默认策略,对filter表来讲,默认规则为ACCEPT或DROP;
-E:重命名自定义链
链中的规则:
-A:增加
-I:插入
-D:删除
-R:修改、替换
查询:
-L:
-n:数字格式显示主机地址和端口;
-v:详细格式
-line--numbers: 显示规则编号
匹配条件分为通用匹配和扩展匹配,扩展匹配又分为隐式匹配和显示匹配,下面是匹配条件的具体命令
通用匹配:
-s 地址: 指定报文源IP地址的匹配的范围,可以是IP也可以是网络地址;可使用!取反, --src,--source和-s表达的意思一样
-d 地址:指定报文目标IP地址匹配的范围,--dst,--destination和-d表达的意思一样
-p 协议:指定匹配报文的协议类型,一般有三种tcp,udp和icmp;
-i INTERFACE: 数据报文流入的接口;PREROUTING,INPUT, FORWARD
-oINTERFACE: 数据报文流出的接口;OUTPUT, FORWARD, POSTROUITING
扩展匹配:
隐式扩展:
-ptcp [-m tcp]
--sportPORT[-PORT]:指定源端口
--dport:指定目标端口
--tcp-flag要检查标志位列表(用逗号分隔)必须为1的标志位列表(逗号分隔)
-p udp [-m udp]
--sport:指定源端口
--dport:指定目标端口
-picmp [-m icmp]
--icmp-type
0: echo-reply,ping响应
8:echo-request, ping请求
显示扩展:
-m扩展模块名称(模块:是iptables,netfilter各拥有的一部分代码;在添加模块时可使用“,”和“:” ,表示离散的、:表示连续的)
multiport:多端口匹配(可用于匹配非连续或连续端口;最多指定15个端口;在添加模块时可使用,和: ,表示离散的,:表示连续的)
专用选项:
--source-ports, --sportsport[,port,port:port]
--destination-ports, --dports
--ports
iprange:匹配指定范围内的地址;匹配一段连续的地址而非整个网络时有用;
专用选项:
[!]--src-range:源地址或地址段[!表示可以取反]
--dst-range:目标地址或地址段
string:字符串匹配,能够检测报文应用层中的字符串(字符匹配检查高效算法kmp, bm)
专用选项:
--algo {kmp|bm}:比较时的算法
--string "STRING"
--hex-string "HEX_STRING":HEX_STRING为编码成16进制格式的字串;
(注:string和hex-string中选其一使用就可以)
time:基于时间做访问控制
专用选项:
--datestart:起始时间 YYYY[-MM][-DD[Thh[:mm[:ss]]]]
--datestop :结束时间
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--weekdays:设定以星期为单位 day[,day] Mon.Tues.Wed.Thur.Fri.Sat.Sun
connlimit:连接数限制,对每IP所能够发起并发连接数做限制;
专用选项:
--connlimit-above [n]:大于所设定的数字就拒绝,小于就允许
limit:速率限制
专用选项:
--limit n[/second|/minute|/hour|/day]
--limit-burst n(n表示个数)
state:状态检查
专用选项:
--state
连接追踪中的状态:
NEW: 新建立一个会话
ESTABLISHED:已建立的连接
RELATED: 有关联关系的连接
INVALID: 无法识别的连接
调整连接追踪功能所能容纳的连接的最大数目:
/proc/sys/net/nf_conntrack_max
记录当前追踪的所有连接
/proc/net/nf_conntrack
不同协议或连接类型追踪时的属性:
/proc/sys/net/netfilter目录:
处理目标:
内置目标:
DROP:表示拒绝
REJECT:有状态的拒绝
ACCEPT:允许
自定义链:为自己根据需求所设定的链
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 �Cv 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 �CA INPUT �Cd 172.16.25.1 �Cp tcp �Cm multiport --dports 22,80 �Cmstate �Cstate NEW �Cj ACCPET [root@localhost~]#iptables �CI INPUT �Cd 172.16.25.1 �Cp tcp �Cm state �Cstate ESTABLISHED �CjACCEPT [root@localhost~]#iptables �CI OUTPUT �Cs 172.16.25.1 �Cp tcp �Cm state �Cstate ESTABLISHED �CjACCEPT 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