iptables 能够理解为包过滤型防火墙,严格来讲iptbles就是规则管理工具web
Firewall: 防火墙,隔离工具;安全
防火墙:工做于主机或网络的边缘,对于进出本主机或网络的报文根据事先定义好的检查规则做匹配检测,对于可以被规则所匹配到的报文作出相应处理的组件;服务器
防火墙按工做的位置能够分为:网络
主机防火墙:就是对进入本机的报文进行检查和过滤并发
网络防火墙:是工做于一个网络的边缘,对进入本网络的报文进行检查和过滤的app
iptables的功能(也叫表):ssh
filter:过滤,防火墙
curl
nat:网络地址转换,转换源地址(SNAT),转换目的地址(DNAT)
tcp
mangle:拆解报文,作出修改,封装报文
ide
raw:关闭nat表上启用的链接追踪机制
链(内置的):
PREROUTING:报文最开始进入主机的位置
INPUT:报文进入主机的用户空间
FORWARD:在主机的内核空间,
OUTPUT:由内核准备发出的
POSTROUTING:出本机的最后一个位置
链还能够自定义,但报文不会通过自定义链,只能在内置链上经过规则进行引用后生效
iptables有四表五链
各功能的实现:
filter:INPUT, FORWARD, OUTPUT
nat: PREROUTING(DNAT), OUTPUT, POSTROUTING(SNAT)
mangle:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
raw:PREROUTING, OUTPUT
添加规则的时候须要注意:
(1) 要实现哪一种功能:判断添加在哪张表上;
(2) 报文流经的路径:判断添加在哪一个链上;
链:链上规则的次序,即为检查的次序;所以隐含必定的法则
(1) 同类规则(访问同一应用),匹配范围小的放上面;
(2) 不一样类规则(访问不一样应用),匹配到报文频率较大的放上面;
(3) 将那些可由一条规则描述的多个规则合并为一个;
(4) 设置默认策略;
规则的组成部分:报文的匹配条件,匹配到以后的动做
iptables的经常使用命令格式:
iptables [-t table] {-A|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
-t table:
filter, nat, mangle, raw
链管理:
-F:flush,清空规则链;省略链,表示清空指定表上的全部的链;
-N:new, 建立新的自定义规则链; 例:iptables -t filter -N IN_public
-X:drop, 删除用户自定义的空的规则链;
-Z:zero,清零,置零规则计数器;
-P:Policy,为指定链设置默认策略;对filter表中的链而言,默认策略一般有ACCEPT, DROP, REJECT;
-E: rEname,重命令自定义链;引用计数不为0的自定义链,没法更名,也没法删除;
规则管理:
-A:append,将新规则追加于指定链的尾部;
-I:insert,将新规则插入至指定链的指定位置;
-D:delete,删除指定链上的指定规则;
有两种指定方式:
(1) 指定匹配条件;
(2) 指定规则编号;
-R:replace,替换指定链上的指定规则;
查看:
-L:list,列出指定链上的全部规则;
-n: numberic,以数字格式显示地址和端口号;
-v: verbose,显示详细信息;
--line-numbers:显示规则编号;
-x: exactly, 显示计数器计数结果的精确值;
匹配条件:
基本匹配:(!是取反的)
[!] -s, --src, --source IP|Netaddr:检查报文中源IP地址是否符合此处指定的地址范围;
[!] -d, --dst, --destination IP|Netaddr:检查报文中目的IP地址是否符合此处指定的地址范围;
[!] -p, --protocol {tcp|udp|icmp}:检查报文中的协议,即ip首部中的协议位所标识的协议;
[!] -i, --in-interface IFACE:数据报文的流入接口;仅能用于PREROUTING, INPUT及FORWARD链上;
[!] -o, --out-interface IFACE:数据报文的流出
扩展匹配:-m macth_name(模块名) --spec_options(选项)
例如:-m tcp --dport 22
扩展匹配分为隐式扩展和显示扩展
隐式扩展:对-p protocol指明的协议进行的扩展,可省略-m选项;
-p tcp:
--dport PORT[-PORT]:目标端口,能够是单个端口或连续多个端口;
--sport PORT[-PORT]
--tcp-flags LIST1 LIST2:检查LIST1所指明的全部标志位,且这其中,LIST2所表示出的全部标记位必须为1,而余下的必须为0;没有LIST1中指明的,不做检查;
通常经常使用的标志位为SYN, ACK, FIN, RST, PSH, URG
--tcp-flags SYN,ACK,FIN,RST SYN 这个式子等于--syn,这个式子表明的是TCP创建链接的第一个报文
-p udp:--dport;--sport
-p icmp:--icmp-type
可用数字表示其类型:0:echo-reply (ping的响应报文)8: echo-request(ping的请求报文)
显式扩展: 必须使用-m选项指定使用的扩展;
一、multiport扩展:以离散方式定义多端口匹配;最多指定15个端口;
[!] --source-ports,--sports port[,port|,port:port]...:指明多个源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指明多个离散的目标端口;
[!] --ports port[,port|,port:port]...
二、iprange扩展:指明连续的(但通常是不能扩展为整个网络)ip地址范围时使用;
[!] --src-range from[-to]:指明连续的源IP地址范围;
[!] --dst-range from[-to]:指明连续的目标IP地址范围;
三、string扩展:检查报文中出现的字符串;
四、time扩展:根据报文到达的时间与指定的时间范围进行匹配;
五、connlimit扩展:根据每客户端IP(也能够是地址块)作并发链接数数量匹配;
六、limit扩展:基于收发报文的速率作检查;
七、state扩展:根据链接追踪机制检查链接的状态;
可追踪的链接状态:
NEW:新发出的请求;链接追踪模板中不存此链接相关的信息条目,所以,将其识别为第一次发出的请求;
ESTABLISHED:NEW状态以后,链接追踪模板中为其创建的条目失效以前期间内所进行的通讯的状态;
RELATED:相关的链接;如ftp协议的命令链接与数据链接之间的关系;
INVALIED:没法识别的链接;
目标(动做):
-j TARGET:jump至指定的TARGET
TARGRT经常使用的有如下:
ACCEPT: 接受
DROP: 丢弃
REJECT: 拒绝
RETURN: 返回调用链
REDIRECT:端口重定向
LOG: 记录日志
MARK:作防火墙标记
DNAT:目标地址转换
SNAT:源地址转换
MASQUERADE:地址假装
...
自定义链:由自定义链上的规则进行匹配检查
保存及重载规则:
保存规则至指定文件:
iptables-save > /PATH/TO/SOMEFILE(路径)
从指定文件重载规则:
iptables-restore < /PATH/FROM/SOMEFILE(路径)
下面作几个实例来演示iptables的命令(是在CentOS6下实现的)
1、主机防火墙
就是在一个主机的内部作iptables
在主机内部放行,ssh(端口22/tcp),telnet(端口23/tcp),web服务(端口80/tcp),dns服务(53/udp,53/tcp)dns直接查询使用的是53/udp,若是是作区域传送使用的是53/tcp
首先打开虚拟机,而后查看规则 iptables -L -n
一、而后在这个虚拟机上作好ftp服务,web服务,而后进行测试
从图中能够看出,ftp telnet http访问都没有问题,远程链接ssh也没有问题
二、打开防火墙,修改默认规则为DROP,可是这更改以前先把ssh的规则作好再更改,避免你连不上主机
必定要先加入ssh的规则以后再把默认的规则改成DROP
iptables -A INPUT -p tcp -d 172.16.249.110 --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp -s 172.16.249.110 --sport 22 -j ACCEPT
在你更改默认规则时,远程链接没断开,证实你这两条规则是正确的
三、如今在测试ftp,telent,http,ping都是不通的
四、写入让http能访问的规则
iptables -A INPUT -p tcp -d 172.16.249.110 --dport 80 -j ACCEPT
iptables -A OUTPUT -ptcp -s 172.16.249.110 --sport 80 -j ACCEPT
写入让http能访问的规则
iptables -A INPUT -p tcp -d 172.16.249.110 --dport 23 -j ACCEPT
iptables -A OUTPUT -ptcp -s 172.16.249.110 --sport 23 -j ACCEPT
能够把这几条规则合并到一块儿
iptables -A INPUT -p tcp -d 172.16.249.110 -m multiport --dports 22,23,80 -j ACCEPT
iptables -A OUTPUT -ptcp -s 172.16.249.110 -m multiport --sports 22,23,80 -j ACCEPT
删除第一条规则,而后查看规则,测试通不通
写入规则让ping能通,规则以下
iptables -A INPUT -p icmp -d 172.16.249.110 -j ACCEPT
iptables-A OUTPUT -p icmp -s 172.16.249.110 -jACCEPT
这样ping,telnet,ssh,http均可以正常通讯了,
还能够只让本身能ping同别的主机,别的主机ping不通你
规则以下:
首先把作的icmp的规则删掉,而后添加以下规则
iptables -A INPUT -d 172.16.249.110 -p icmp --icmp-type 0 -j ACCEPT 这是只让响应的icmp报文进入,
iptables-A OUTPUT -s 172.16.249.110 -p icmp --icmp-type 8 -j ACCEPT 这是只让请求的icmp报文出去,
能够看到本身的主机能够ping通别的主机,别的主机不能ping通本身
五、下面作ftp的规则
ftp访问比较麻烦,须要借助扩展模块还须要安装一个内核模块,由于ftp访问是两条链接,一条命令链接(端口21),一条数据链接(端口随机)
(1) 装载ftp追踪时的专用的模块:
modprobe nf_conntrack_ftp
(2)放行请求报文:
命令链接:状态为 NEW,ESTABLISHED
数据链接:RELATED,ESTABLISHED
iptables -A INPUT -d 172.16.249.110 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -d 172.16.249.110 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
(3)放行响应报文:
iptables -A OUTPUT -s 172.16.249.110 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
OUTPUT加入RELATED状态是为了,若是本身的主机去访问别的ftp服务器会不通,只有加上这个状态你才能访问别的ftp服务
这样ftp的iptanble规则就作好了
六、DNS就只作查询了,
首先作好dns,而后本身测试下
用别的主机进行dns查询,
而后在作规则,若是想让本身能查询到,别的主机也能查到,规则要写成下面这样
iptables -A INPUT -p udp -d 172.16.249.124 --sport 53 -j ACCEPT
iptables -A INPUT -p udp -d 172.16.249.124 --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp -s 172.16.249.124 --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp -s 172.16.249.124 --dport 53 -j ACCEPT
能够看到本身和别的主机都能查询了
若是本身主机查询不行,别的主机能够查询,规则只须要写下面两条就好了
iptables -A INPUT -p udp -d 172.16.249.124 --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp -s 172.16.249.124 --sport 53 -j ACCEPT
查询结果,能够看到本身不能查询,别的主机能够
若是是区域传送须要打开tcp的53端口,规则跟上面的相似,这里再也不演示了
二 网络防火墙
须要打开三台虚拟机,一台模拟外网即互联网上的web服务,另外一台作内网主机,剩下的一台作路由器使用,要打开它的核心转发功能,并且要有两块网卡,一块链接内网网络,一块链接外网网络。
外网主机的地址为172.16.249.110 作路由器的链接外网的网卡地址为172.16.249.123,链接内网的网卡地址为192.168.36.1;内网的主机地址为192.168.36.2;
ftp,telnet,http,dns能正常访问,这个跟上面的主机防火墙相似,这是把规则写在作转发的那个主机上,规则内容与上面作的主机防火墙同样,只是写在FORWARD链上;
而后作SNAT和DNAT
NAT:
SNAT: 只修改请求报文的源地址;
DNAT:只修改请求报文的目标地址;
nat表有三条链:
PREROUTING:DNAT
OUTPUT
POSTROUTING:SNAT
源地址转换:iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE(这是自动给分配一个能够去外网的地址)
目标地址转换:iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]
先给作转发的这台主机添加一块网卡类型选择VMnet2类型,地址添加为192.168.36.1;而后把内网的这一台主机的网卡类型也改成VMnet2类型,而后给内网主机添加地址192.168.36.2,而后网关指向192.168.36.1;或者配一条默认路由指向192.168.36.1
而后从内网主机测试下ping192.168.36.1 是否通
而后给转发主机开启核心转发功能
而后ping172.16.249.123 能通,ping外网主机发现不通,是由于有去的但没有回来的报文,须要给外网主机配一条默认路由,而后在ping就通了
默认路由 route add -net 192.168.36.0/24 gw 172.16.249.123
这样外部网络就作好了,下面开始写iptables规则,ftp和http,ping都能正常访问
一、把转发主机的FORWARD的默认规则改成DROP
iptables -P FORWARD DROP
这个时候再从内网主机ping外网主机就不通了,web也不能访问
加上规则,放行web服务
iptables -A FORWARD -d 172.16.249.110 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s 172.16.249.110 -p tcp --sport 80 -j ACCEPT
测试一下,这个时候能访问http服务,但仍是ping不通,由于咱们没有作规则
添加这一条iptables -A FORWARD -p icmp -j ACCEPT或者下面两条
iptables -A FORWARD -d 172.16.249.110 -p icmp -j ACCEPT
iptables -A FORWARD -s 172.16.249.110 -p icmp -j ACCEPT
能够ping通了,而后在把tcp的23号端口加入前面写的规则里,telnet也就能经过了
iptables -A FORWARD -d 172.16.249.110 -p tcp -m multiport --dports 23,80 -j ACCEPT
iptables -A FORWARD -s 172.16.249.110 -p tcp -m multiport --sports 23,80 -j ACCEPT
可是会自动关闭,由于telent认为这是不安全的,就强制关闭了,经过抓包能够看到三次握手创建成功了
以ssh为例,把22端口加进去,
iptables -R FORWARD 2 -d 172.16.249.110 -p tcp -m multiport --dports 22,23,80 -j ACCEPT
iptables -R FORWARD 3 -s 172.16.249.110 -p tcp -m multiport --sports 22,23,80 -j ACCEPT
能够经过,
下面作ftp ,
(1) 装载ftp追踪时的专用的模块:
modprobe nf_conntrack_ftp
(2)放行请求报文:
命令链接:状态为 NEW,ESTABLISHED
数据链接:RELATED,ESTABLISHED
iptables -A FORWARD -d 172.16.249.110 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -d 172.16.249.110 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
(3)放行响应报文:
iptables -A FORWARD -s 172.16.249.110 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
能够看到能够访问,
咱们--dport在192.168.36.2上作的DNS,
须要在172.16.249.110上能查询须要写以下规则
iptables -A FORWARD -p udp -d 192.168.36.2 --dport 53 -j ACCEPT
iptables -A FORWARD -p udp -s 192.168.36.2 --sport 53 -j ACCEPT
能够看到能访问
若是是区域传送须要打开tcp的53端口,规则跟上面的相似,这里再也不演示了
下面作SNAT和DNAT
首先在外网主机上启用抓包命令,tcpdump -i eth0 dst host 172.16.249.110,而后在内网主机192.168.36.2上使用curl http://172.16.249.110访问如下,抓的包以下
能够清晰看到这个包的源地址是192.168.36.2
而后在外网主机172.16.249.110上把刚才加的默认路由删掉,让内外网主机不能通讯
这个时候内网主机在访问,抓到的包,能够看到,请求过来了,可是没响应成功
下面在作转发的主机上,写入SNAT,把来至192.168.36.0这一网段的地址转换为172.16.249.123;
转换规则为iptables -t nat -A POSTROUTING -s 192.168.36.0/24 ! -d 192.168.36.0/24 -j SNAT --to-source 172.16.249.123
查看下转发主机上nat表中有没有规则
而后加入上面的规则
而后让内网主机访问外网主机,而后抓包
能够看到能正常访问,能够看到是172.16.249.123这个地址过来访问的
从日志中也能够看到,请求是172.16.249.123而不是192.168.36.2
这样SNAT就作好了,
下面作DNAT,就是把SNAT的过程反转过来,内网主机来提供web服务,外网主机来访问
首先把nat中的规则清掉,而后在内网主机上开启httpd服务,写一个测试页,
内容为Hello , This is 192.168.36.2;这个时候外网主机是访问不到的,它们之间是不通的,外网主机能够访问到网关地址即172.16.249.123,因此咱们宣称172.16.249.123这个上有web服务
而后写入规则
iptables -t nat -A PREROUTING -d 172.16.249.123 -p tcp --dport 80 -j DNAT --to-destination 192.168.36.2:80(这个端口若是相同能够省略,若是不一样必须加上)
而后在外网主机上进行访问,访问172.16.249.123
这样就能够访问到web服务了,其实172.16.249.123的web服务是没启动的
这样DNAT就作好了,就是把访问的目标地址改变
在内网主机192.168.36.2上抓包能够看到,请求是172.16.249.110发过来的,
这样DNAT就作好了
这样iptables的经常使用的配置就大体上作完了,若有不对和建议请写入评论。