linux上的iptables是基于其kernel内建的netfilter,netfilter工作在核心。因此用户一般无法直接跟内核打交道,为了解决这个问题,提供了iptables这个软件来设定netfilter。也就是说,当我们设定规则时,要通过iptables。iptables会检查我们设定的语法有没有错误,如果没有错误,这个规则会立即生效。为了实现不同的功能,iptables提供4个表,分别为raw,mangle,filter,nat。在这几个表中的,由raw的优先级最大,依次类推。由于raw,mangle用得少,因此这里就不讨论raw,只讨论后面三个。filter表主要设定跟本主机的安全性,也是iptables中默认指定的表。在linux中提供了五个链,分别分input,output,forword,postrouting,prerouting。input表示请求访问本机的资源必须经过的链,output表示响应客户端的请求资源,必须经过的链。forword,表示要通过这个台主机去访问另外一个网络必须经过的链。postrouting和prerouting这个两个链表示,一个做snat,一个做dnat。snat表示,当内网的客户机去访问公网时,将客户机的IP替换成linux外网的ip,从而达到连上互联网的目的;dnat表示,当内网的主机提供一些服务时,而外网的客户机要想访问内网提供的资源,需要将linux与外网相连的ip替换成linux与内网相连的IP,这样外面的客户机才能访问内网提供的服务。
1,表与链的关系,filte表用于过滤,因此应用于input,output,forward这三个链。而nat主要用于做地址替换,应用prerouting,postrouting,output。如下图
2,iptables语法
iptables [-t table] command chain [criteria] -j action
(1) table :主要用filter,nat,mangle(比较少用),如果不指定表,则默认表示filter表。
(2)command:比较常用有以下几个,
-A(append):追加,默认追加到链的最后
-I(insert): 插入,如果不指定插入到第几条,则默认会变成链的第一条
-D(delete): 删除链中的第几条
-R(replace): 替换链的哪一条规则
-F(flush): 清空链的规则,如果不指定链,所有的链中的规则都会被清空
-N (new) :新建链,自己定义一个链
-X (delete):删除自定义的空链,链中没有规则和没有被使用时,才能被删除
-E(rename):重命名自定义链
-P(policy):定义链的默认处理动作
-Z(zero): 清空链的计数器
-L(list):查看链中的规则 下面-n,-v,-x,--line-numbers是-L的子选项
-n(numeric):不做解析以数字的方式来显示
-v(verbors):显示详细信息
-x(exactly):精确匹配,对计数器中的数据包大小不做单位换算
--line-numbers 编号显示链中的规则
(3)chain链:默认有INPUT,OUTPUT,FORWARD,PROROUTING,PREROUTING。必须大写
(4)Criteria:匹配条件有两类,基本匹配和扩展匹配
一,基本匹配:
-s (source):源ip地址或网段,如果是网段要指定网段的掩码
-d (destination):目标IP地址或网段
-p(protocol): {tcp|udp|icmp}
-i(interface):数据包的流入接口 OUTPUT,FORWARD,POSTROUTING
-o(interface): 数据包的流出接口 INPUT,FORWARD,PREROUTING
二,扩展匹配,包括隐含扩展和显示扩展
(一)隐含扩展
-p tcp
--sport port 22:80表示(22到80的端口)
--dport port
--tcp-flags
-p udp
--sport port 可以指定连续的端口
--dport port
-p icmp
--icmp-type 类型
8:(echo-request)请求
0:(echo-reply)回应
(二)显式扩展
-m state --state (state状态有以下常用四种)
NEW:TCP三次握手的第一次请求的状态
ESTABLISHED:TCP三次握手从第二次开始以后的状态
INVALID:无效的状态,当不符合TCP三次握手的状态
RELATE:当一 个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。
(1) -m multiport 可以指定多个单独的端口,还可以取反
--source-port 22,53,80(表示指定22,23,80端口)
--destination-port
(2) -m iprange 对地址范围取值也可以取反
(!)--src-range 192.168.0.10-192.168.0.20
(!)--dst-range
(3) -m connlimit 连接限制
(!) connlimit-above 最大限制
(4) -m limit 限制速率
--limit :单位时间发送过来的数据包个数
--limit-burst:同一时刻最多能发达多少个数据包
(5)-m string 做字符串匹配
--algo bm|kmp (一定要指定一个两个是一种算法,随便指定哪一个) --string pattern
(6)-m time 时间限制
--timestart 启始时间
--timestop 停止时间
(5) -j action(动作有以下几中)
ACCEPT:接受
DROP:拒绝
REJECT:拒绝(这个两个拒绝区别在于,DROP语气没那么强烈)
SNAT --to-source ip 将源地址转换成后面的ip
DNAT --to-destination ip 将目标地址转换成后面ip
LOG 记录日志,可以将某些规则记录下来。
3,现在举例说明上面的用法:
(1)查看表中的已经定义好的规则:
iptables -L -n 或iptables -L --line-numbers 由于没有指定查看哪个表,默认是filter表。
iptables -t nat -L -n 查个nat表中的规则,如果要查看更详细的信息则加-v
iptables -t nat -L -n -vv(v越多越详细,表要指定)
(2)定义链的默认规则
iptables -P INPUT DROP(定义filter表的INPUT链默认规则这DROP)
(3)允许任意客户端通过ssh连接本机(192.168.0.130是我linux的ip)
iptables -A INPUT -d 192.168.0.130 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -s 192.168.0.130 -p tcp --sport 22 -j ACCEPT
第一条表示允许访问linux,第二条表示linux允许出去。由于-j 为ACCEPT,则INPUT和OUTPUT默认规则要设置为DROP才有作用。
(4)允许某些客户端通过ssh连接本机
iptables -A INPUT -d 192.168.0.130 -p tcp --dport 22 -m iprange --src-range 192.168.0.240-192.168.0.241 -j ACCEPT
iptables -A OUTPUT -s 192.168.0.130 -p tcp --sport 22 -m iprange --src-range 192.168.0.240-192.168.0.241 -j ACCEPT
(5)不允许客户ping这台主机
iptables -A INPUT -d 192.168.0.130 -p icmp --icmp-type 8 -j DROP当执行这条命令后,本机回环测试也会无法ping通。由于规则匹配是从上往下,因此下面将使用-I命令插入到INPUT和OUTPUT链的最前面。
iptables -I INPUT -i lo -j ACCEPT 默认将会插在INPUT链规则的前面
iptables -I OUTPUT -o lo -j ACCEPT此时ping 自己就OK了。
(6)利用状态检测来放行。
iptables -I INPUT -m state --state NEW,ESTABLISHED -j ACCEPT表示如果客户端为第一个新发起的请求时和已建立连接的状态则接受,当然也要放行OUTPUT链
iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT 在OUTPUT链上,只放行已经建立连接的请求,绝不允许服务端主动发起NEW状态。
(7)放行多个端口
iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80 -j ACCEPT
当对多个服务开放端口时,由于(6)规则,所以会只需添加INPUT链