netfilter/iptables 分别是内核态模块和用户态工具,netfilter位于Linux内核中的包过滤功能体系,iptables位于/sbin/iptables,用来管理防火墙规则的工具,管理员通过iptables给netfilter变更规则实现防火墙作用。
表作用:容纳各种规则链
划分依据:根据防火墙对数据的处理方式
raw表:确定是否对该数据包进行状态跟踪
mangle表:为数据包设置标记
nat表:修改数据包中的源、目标IP地址或端口
filter表:确定是否放行该数据包(过滤)
规则的作用:对数据包进行过滤或处理
链的作用:容纳各种防火墙规则
链的分类依据:处理数据包的不同时机
INPUT:处理入站数据包
OUTPUT:处理出站数据包
FORWARD:处理转发数据包
POSTROUTING链:在进行路由选择后处理数据包
PREROUTING链:在进行路由选择前处理数据包
raw—mangle—nat—filter
入站:PREROUTING INPUT
出站:OUTPUT POSTROUTING
转发:PREROUTING FORWARD POSTROUTING
按自上而下顺序依次检查,匹配即停止(LOG策略例外)
若找不到相匹配规则,则按该链的默认策略处理
语法构成:
iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
#不指定表名时,默认指filter表
#不指定链名时,默认指表内的所有链
#除非设置链的默认策略,否则必须指定匹配条件
#选项、链名、控制类型使用大写字母,其余均为小写
数据包的常见控制类型:
ACCEPT:允许通过
DROP:直接丢弃,不给出任何回应
REJECT:拒绝通过,必要时会给出提示
LOG:记录日志信息,然后传给下一条规则继续匹配
SNAT:源地址转换,将符合条件的数据包的源地址进行修改
--to-source ip
MASQUERADE:将数据包的源地址修改为本机的动态公网IP
DNAT:目标地址转换,将符合条件的数据包的目标地址进行修改
--to-destination ip:port
REDIRECT:将符合条件的请求转发到本机的指定端口上
--to-ports port
第一种方法:
防火墙规则只在计算机处于开启状态时才有效。如果系统被重新引导,这些规则就会自动被清除并重设。要保存规则以便今后载入,请使用以下命令:
service iptables save
保存在 /etc/sysconfig/iptables 文件中的规则会在服务启动或重新启动时(包括机器被重新引导时)被应用。
注意:save保存是覆盖式保存
第二种方法:
iptables–save > /etc/iptables/iptables.rules
#使用命令备份iptables规则
iptables–restore < /etc/iptables/iptables.rules
#使用命令恢复iptables规则
iptables服务
脚本位置:/etc/init.d/iptables
规则文件位置:/etc/sysconfig/iptables
-A:在链的末尾追加一条规则
-I:在链的开头(或指定序号)插入一条规则
例:
iptables -t filter -A INPUT -p tcp -j ACCEPT
#如果不指定-t,则默认往fileter表里写,如果指定,则写入指定表里
iptables -I INPUT -p udp -j ACCEPT
#在默认fileter表的INPUT链第一行添加,如果是udp协议,则允许通过。
iptables -I INPUT 2 -p icmp -j ACCEPT
#在默认fileter表的INPUT链第二行添加,如果是ICMP协议,则允许通过。
iptables -nvL --line-numbers
-L:列出所有的规则条目
-n:以数字形式显示地址、端口等信息
-v:以更详细的方式显示规则信息
--line-numbers:查看规则时,显示规则的序号
例:
iptables -L INPUT --line-numbers
#查看默认fileter表中INPUT链的规则,列出所有规则条目,并显示规则的序号。
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- anywhere anywhere
2 ACCEPT icmp -- anywhere anywhere
3 REJECT icmp -- anywhere anywhere reject-with icmp-port-unreachable
4 ACCEPT tcp -- anywhere anywhere
iptables
-D:删除链内指定序号(或内容)的一条规则
-F:清空所有的规则
例:
iptables -D INPUT 3
#删除INPUT表中,序号为3的规则
iptables -F
#清空所有表中的所有规则
iptables -t fileter -P FORWARD DROP
#为fileter表的FORWARD链添加默认拒绝DROP规则
#-P为指定的链设置默认规则
iptables -P OUTPUT ACCEPT
#为fileter表的OUTPUT链添加默认放行ACCEPT规则
可直接使用,不依赖于其他条件或扩展
包括网络协议、IP地址、网络接口等条件
常见的通用匹配条件:
协议匹配:-p(小) 协议名
地址匹配:-s 源地址、-d 目的地址
接口匹配:-i 入站网卡、-o 出站网卡
例:
iptables -A FORWARD -s 192.168.1.11 -j REJECT
#在fileter表中FORWARD链中添加规则,拒绝源IP为192.168.1.11的请求,并给出相应提示。
iptables -I INPUT -s 10.20.30.0/24 -j DROP
iptables -I INPUT -p icmp -j DROP
iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
要求以特定的协议匹配作为前提
包括端口、TCP标记、ICMP类型等条件
常用的隐含匹配条件:
端口匹配:--sport 源端口、--dport 目的端口
ICMP类型匹配:--icmp-type ICMP类型
例:
iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A INPUT -p icmp -j DROP
要求以“-m 扩展模块”的形式明确指出类型
包括多端口、MAC地址、IP范围、数据包状态等条件
常用的显式匹配条件
多端口匹配:-m multiport --sport 源端口列表
-m multiport --dport 目的端口列表
IP范围匹配:-m iprange --src-range IP范围
-m iprange --dst-range IP范围
MAC地址匹配:-m mac --mac-source MAC地址
状态匹配:-m state --state 连接状态
例:
iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT
iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
iptables -P INPUT DROP
iptables -I INPUT -p tcp -m multiport --dport 80 -j ACCEPT
iptables -I INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
局域网主机共享单个公网IP地址接入Internet
SNAT策略的原理
源地址转换,Source Network Address Translation
修改数据包的源地址
源地址转换的目的:
为了让目标服务器认为数据包是来自于一个公网IP,而不是一个私有IP地址,不再是仅仅为了通信。
未启用SNAT
启用SNAT
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 218.29.30.31
#若检查数据包在路由后(经过路由走的时候),经过eth0网卡的请求,检查如果以192.168.1.0/24为源地址,则将源地址改成218.29.30.31。
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
#MASQUERADE地址伪装
#适用于外网IP地址非固定的情况
#对于ADSL拨号连接,接口通常为 ppp0、ppp1
#将SNAT规则改为MASQUERADE即可
DNAT策略的典型应用环境
在Internet中发布位于企业局域网内的服务器
DNAT策略的原理
目标地址转换,Destination Network Address Translation
修改数据包的目标地址
iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.6
#检查eth0网卡的数据包,在路由前,检查如果以218.29.30.31为目标地址,80为目标端口,则将目的地址改为192.168.1.6
iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 2346 -j DNAT --to-destination 192.168.1.6:22
#检查eth0网卡的数据包,在路由前,检查如果以218.29.30.31为目标地址,2346为目标端口,则将目的地址改为192.168.1.6:22端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3128
#检查路由前的tcp数据包,目标端口为80的请求,将该请求转发到本机的3128端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 111.111.111.20:3128
#检查路由前的tcp数据包,目标端口为80的请求,将该请求的目的地址和端口改为111.111.111.20:3128