iptables的基本使用
四表五链
四表
filter表——过滤数据包(确定是否放行数据包)
Nat表——用于网络地址转换(IP、端口)(修改数据包的源/目标地址或端口)
Mangle表——修改数据包的服务类型、TTL、并且可以配置路由实现QOS(为数据包设置标记)
Raw表——决定数据包是否被状态跟踪机制处理(确定是否对数据包进行状态跟踪)

五链
INPUT链——进来的数据包应用此规则链中的策略
OUTPUT链——外出的数据包应用此规则链中的策略
FORWARD链——转发数据包时应用此规则链中的策略
PREROUTING链——对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
POSTROUTING链——对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)

包过滤匹配流程
规则顺序对比,匹配则停止(LOG除外),没有匹配按默认规则处理。
表之间的顺序:
raw ——> mangle ——> nat ——> filter
链之间的顺序
入站:PREROUTING ——> INPUT
出站:OUTPUT ——> POSTROUTING
转发:PREROUTING ——> FORWARD ——> POSTROUTING
目标动作:
ACCEPT 允许通过
DROP 直接丢弃,不给出任何回应
REJECT 拒绝通过,会给出提示
LOG 记录日志(匹配则停止规则的唯一例外)
iptables常用选项
添加规则
-A 在链的末尾追加一条规则
-I 在链的开头或者指定序号插入一条规则
查看规则
-L 列出所有规则
-n 以数字形式显示地址、端口等信息
--line-numbers 显示规则的序号(iptables -nL --line)
删除规则
-D 删除指定序号的一条规则
-F 清空所有的规则
默认策略
-P 为指定的链设置默认规则
iptables基本匹配条件
通用匹配
协议匹配 -p 协议名
地址匹配 -s 源地址、-d 目标地址
接口匹配 -i 接收数据的网卡、-o 发送数据的网卡
隐含匹配
端口匹配 --sport 源端口、-dport目标端口
ICMP类型匹配 --icmp-type ICMP类型
TCP标记匹配 --tcp-flags 检查哪些位被设置
扩展匹配
状态匹配 -m state --state状态值
MAC地址匹配 -m mac --mac-source MAC地址
多端口匹配 -m multiport --sports 源端口列表
-m multiport --dports 目标端口列表
IP范围匹配 -m iprange --src-range IP1-IP2
-m iprange --dst-range IP1-IP2
扩展匹配的状态跟踪机制
网络连接的物种状态:
NEW 请求建立连接的包,完全陌生的包。
ESTABLISHED 将要或已经建立连接的包。
RELATED 与已知某个连接相关联的包。
INVALID 无对应连接,以及连接无效的包。
UNTRACKED 未跟踪状态包。
开启内核路由转发功能
sysctl -w net.ipv4.ip_forward=1
或者
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables基本使用示例
iptables [-t 表名] 选项 [链名] [条件] [-j目标动作]
不指定表默认为filter表
不指定链默认为所有链
设置默认规则
所有链初始默所有规则为ACCEPT
iptables -t filter -P INPUT DROP(设置为默认拒绝所有,此规则慎用......)
主机防护,针对入站访问的源地址
iptables -A INPUT -s 172.30.1.53 -j DROP
iptables -A INPUT -s 192.168.1.0/24 -j DROP
网络防护,针对转发访问的原地址
iptables -A FORWARD -s 172.30.1.53 -i eth1 -j DROP
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -j DROP
允许特定的IP访问80端口
iptables -A INPUT -s 172.30.1.53 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT
允许所有访问80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
拒绝所有访问80端口
iptables -A INPUT -p tcp --dport 80 -j DROP
插入一条规则在第二行 (如果不指序号,则默认插入到第一行)
iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT
删除第二行
iptables -D INPUT 2
禁ping策略限制
禁止其他主机ping本机
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
iptables -A INPUT -p icmp ! --icmp-type echo-request -j ACCEPT
允许本机ping其他主机
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp ! --icmp-type echo-request -j DROP
丢弃陌生的TCP响应包
iptables -A INPUT -m state --state NEW -p tcp ! --syn -j DROP
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
识别FTP数据连接,
iptables -A FORWARD -d 172.30.1.53 -p tcp --dport 20:21 -j ACCEPT
iptables -A FORWARD -s 172.30.1.53 -p tcp --dport 20:21 -j ACCEPT
针对FTP被动模式
iptables -A FORWARD -d 172.30.1.53 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 172.30.1.53 -m state --state ESTABLISHED,RELATED -j ACCEPT
根据MAC地址封锁主机
iptables -A INPUT -m mac --mac-source 00:0C:29:74:BE:21 -j DRIP
一条规则开放多个端口
iptables -A INPUT -p tcp -m multiport --dports 20:25,80,110,143,3306,10051, -j ACCEPT
(21:25 代表21到25 冒号表示连续 ,21,25代表 21和25 逗号则为分隔符 )
根据IP范围封锁主机
iptables -A INPUT -p tcp --dport 3306 -m iprange --src-range 192.168.1.10-192.168.1.20 -j DROP
NAT 防火墙,
需要打开内核 ip 转发 (sysctl -w net.ipv4.ip_forward=1)
POSTROUTING 源地址伪装
通过伪装 192.168.4.0 网段的机器上网,首先防火墙本机可以访问互联网
iptables -t nat -A POSTROUTING -s 192.168.4.0 -j SNAT --to-source 防火墙外网ip地址
PERROUTING 目的地址转换
所有访问防火墙 10022 端口的请求都转发给后端的 192.168.4.15 的 22 端口
iptables -t nat -A PREROUTING -p tcp --dport 10022 -j DNAT --to-destination 192.168.4.15:22
注意:
iptables 不是服务,只是生效规则或者清空规则,规则关机重置。
把它定义成service 是为了让他开机自动生效规则,
想要永久生效保存规则:service iptables save
规则会被保存至/etc/sysconfig/iptables 文件中,start 时会读取此文件中的规则,

iptables-save > /path/to/some_rulefile 保存iptables规则至别的位置,
iptables-restore < /path/to/some_rulefile 从自定义的位置读取iptables规则并使之生效。
所有链初始默所有规则为ACCEPT
iptables -t filter -P INPUT DROP(设置为默认拒绝所有,此规则慎用......)
在设置此规则之前应该先允许重要的规则,比如ssh的端口。
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

iptables -F 若不指定表,默认只清空filter表,(默认规则为DROP时,此规则慎用......)
在默认规则为DROP时,默认为拒绝所有,如果这个时候再iptables -F 清空filter开放的规则,这个时候会断开所有连接。

记住iptables 匹配即停止的特性,不然一不小心就掉坑里了.........