iptables是Linux下自带的开源的一款免费的基于包过滤的防火墙工具,可以对
流入、流出、流经服务器的数据包进行精细的控制
iptables的工作流程
iptables是采用数据包过滤机制工作的,所以他会对请求的数据包的包头进行
分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机
iptables的五表
filter***
过滤功能,确定是否放行该数据包,属于真正的主机防火墙(默认)
nat***
网络地址转换功能,修改数据包中的源、目标IP地址或端口
mangle
对数据包进行重新封装功能,为数据包设置标记
raw
确定是否对数据包进行跟踪
security
是否定义强制访问控制规则(后加上的)
iptables的五链
INPUT
处理入站数据包
OUTPUT
处理出站数据包
FORWARD
处理转发数据包(流经本机)
PREROUTING
在进行路由选择前处理数据包,适用于外网访问内网,修改到达防火墙的数据包的目的IP
POSTROUTING
在进行路由选择后处理数据包,适用于内网访问外网,修改要离开防火墙的数据包的源IP
iptables中表链之间的关系
这里只对常用的表进行记录
优先级:nat>filter
filter
nat
INPUT
PREROUTING
OUTPUT
POSTROUTING
FORWARD
OUTPUT
数据包流经iptables的流程
iptables语法结构
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 动作]注意:
不指定表名时,默认表示filter表
不指定链名时,默认表示该表内所有链
除非设置链的默认策略,否则需要指定匹配条件
管理选项
链管理
-F:清空指定的链上的规则-P:制定链的默认策略(ACCEPT|DROP)
-N:新建一个自定义的规则链
-X:删除用户自定义的引用计数为0的空链
-E:重命名链
-Z:置零计数器
规则管理
-A:追加新规则于指定链的尾部-I:插入新规则于指定链的首部
-R:替换指定的规则为新的规则
-D:删除规则
可以根据规则编号删除规则,也可以根据规则本身删除规则
规则显示
-L:列出规则-v:详细信息
-n:数字格式显示主机地址和端口号
--line-numbers:列出规则时,显示其在链上的相应的编号
-vv:更详细的信息
-x:显示计数器的精确值,而非圆整后的数据
-S:显示指定链的所有规则
匹配条件
基本匹配条件
匹配协议,源目IP,出入接口
-p 指定规则协议,tcp udp icmp all-s 指定数据包的源地址
-d 指定目的地址
-i 输入接口
-o 输出接口
! 取反
扩展匹配条件
隐式匹配
匹配源目端口
-p tcp--sport 匹配报文源端口;可以给出多个端口,但只能是连续的端口范围
--dport 匹配报文目标端口;可以给出多个端口,但只能是连续的端口范围
--tcp-flags mask comp 匹配报文中的tcp协议的标志位
-p udp
--sport 匹配报文源端口;可以给出多个端口,但只能是连续的端口范围
--dport 匹配报文目标端口;可以给出多个端口,但只能是连续的端口范围
--icmp-type
0/0:echo reply 允许其他主机ping
8/0:echo request 允许ping其他主机
显式匹配
multiport 多端口
iptables -I INPUT -d 192.168.2.10 -p tcp -m multiport --dports 22,80 -j ACCEPT#在INPUT链中开放本机tcp 22,tcp80端口
iptables -I OUTPUT -s 192.168.2.10 -p tcp -m multiport --sports 22,80 -j ACCEPT
#在OUTPUT链中开放源端口tcp 22,tcp80
iprange 多ip地址
iptables -A INPUT -d 192.168.2.10 -p tcp --dport 23 -m iprange --src-range 192.168.2.11-192.168.2.21 -j ACCEPTiptables -A OUTPUT -s 192.168.2.10 -p tcp --sport 23 -m iprange --dst-range 192.168.2.11-192.168.2.21 -j ACCEPT
time 指定访问时间范围
iptables -A INPUT -d 192.168.2.10 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --time-stop 18:00:00 -j ACCEPTiptables -A OUTPUT -s 192.168.2.10 -p tcp --sport 901 -j ACCEPT
动作
ACCEPT:允许数据包通过DROP:直接丢弃数据包,不给任何回应信息
REJECT:拒绝数据包通过,发送回应信息给客户端
SNAT:源地址转换
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth1 -j SNAT --to-source 202.12.10.100
MASQUERADE:伪装,类似于SNAT,适用于动态的、临时会变的ip地址上
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth1 -j MASQUERADE
DNAT:目标地址转换
iptables -t nat -A PREROUTING -i eth1 -d 202.12.10.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.11:8080
REDIRECT:在本机做端口映射
LOG:在/var/log/message文件中记录日志信息,然后将数据包传递给下一条规则
iptables规则的保存与重载
保存
iptables-save > /etc/sysconfig/iptables重载
iptables-restore < /etc/sysconfig/iptablesiptables范例
清空现有规则
清空所有链的规则iptables -F
清空具体链的规则
iptables -F INPUT
查看规则
iptables -nL详细查看
iptables -nvL
查看规则的时候显示编号
iptables -nL --line-numbers
设置链的默认规则
iptables -P INPUT ACCEPTiptables -P FORWARD DROP
iptables -P OUTPUT DROP
删除规则
根据规则编号删除iptables -D INPUT 2
根据规则本身删除
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
禁止来自10.0.0.188 ip地址访问80端口的请求
iptables -A INPUT -p tcp -s 10.0.0.188 --dport 80 -j DROP实现把访问10.0.0.3:80的请求转到172.16.1.17:80(DNAT)
iptables -t nat -A PREROUTING -d 10.0.0.3 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.17:80实现172.16.1.0/24段所有主机通过124.32.54.26外网IP共享上网(SNAT)
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 124.32.54.26只允许远程主机访问本机的80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT 允许80端口访问iptables -P INPUT DROP 默认拒绝所有服务、端口访问
允许通过本地回环网卡访问本机
[root@localhost ~]# iptables -I INPUT -d 127.0.0.1 -p tcp --dport=9000 -i lo -j ACCEPT[root@localhost ~]# iptables -I INPUT -i lo -j ACCEPT
允许连接态产生的衍生态
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT实现共享主机上网
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE
内网机器:tcpdump|grep -i icmp(两台机器上分别监测)