mangle表
建议不要在此表作任何过滤
表中仅有的几种操作
TOS 设置或改变数据包的服务类型域
TTL 数据包的生存时间域
MARK 设置特殊的标记
nat表
转换包的源或目标地址,只有流的第一个包会匹配,其后的包会自动处理
DNAT destination network address translation
SNAT source network address translation
MASQUERADE 与SNAT作用一样,但会查找可用的IP,负载比SNAT高
filter表
包过滤工作的主要地方
状态机制
一种连接跟踪机制,有 NEW, ESTABLISHED, RELATED, INVALID,使用--state匹配操作
除本地产生的包由OUTPUT链处理外,所有连接跟踪都是在PREROUTING链处理
(NAT表)
tcp SYN是NEW,SYN/ACK就是ESTABLISHED
udp 发送数据包是NEW,收到回复数据就是ESTABLISHED
ICMP同上
TCP发送的SYN包和UDP的数据包到目标网络有问题不可达时,数据包最后经过的一个路由会返回一个ICMP信息提示网络不可达,这种数据包是RELATED
FTP连接建立 的信息在协议数据包的数据域内,而不是在可分析的协议头里,因此,防火墙不知如何处理相应的数据包,解决的方法是为连接跟踪模拟加一个特殊的helper,以便能检测到那些信息,这样连接可以被跟踪,状态是RELATED.
conntrack helper可以编入内核,也可编为模块,用下面命令加载
modprobe ip_conntrack_*
连接跟踪不处理NAT
iptables-save iptables-restore
若用脚本增减iptables规则,每一次都会将iptables的规则集从内核空间提取出来,增删或修改后再插入内核空间,会花费更多的时间.
save一次将内核空间的规则集保存,restore一次将规则集载入内核空间.可以节省时间,但缺点不够脚本灵活.
iptables-save [-c] [-t table]
-c 保存包和字节计数器的值
-t 后面加上表名,保存特定表的规则集
iptables-restore [-c] [-n]
-c 同save
-n 不覆盖己有的规则
语法格式
iptables [ -t table] command [match] [target/jump]
target放在
,若不指定表名,默认为filter表,command是增删或修改一个规则
match描述包的特点,可以指定IP,接口,协议类型等等
若数据包匹配match的描述,内核用target来处理,或把包发往target
Tables
nat 网络地址转换
mangle 改变不同的包的包头的内容,如TTL,TOS,或MARK,mangle有五个链:PREROUTING,POSTROUTING,OUTPUT,INPUT,FORWARD.在mangle表内不能做任何NAT
filter 专门过滤包,INPUT,OUTPUT,FORWARD
command
-A --append
末尾添加规则
-D --delete
删除规则,一是完整写出规则,二是指定规则的序号(由1开始)
-I --insert
根据序号插入规则,默认序号是1
-R --replace
替换规则,要指定序号
-L --list
显示所选链的所有规则
-F --flush
清空所选的链,不指定链会清空表的所有链
-Z --zero
把指定链(不指定是所有链)的计数器清零
-N --new-chain
根据指定的名字建新链
-X --delete-chain
删除指定的自定义链(不指定删除默认表的所有非内建链)
-P --policy
默认的target,所有不符合规则的包被强制使用这个策略.只有内建的链可以使用策略
-E --rename-chain
对自定义的链重命名
option
-v --verbose(详细的)
可以使用此选项的命令:--list --append --insert --delete --replace
-x --exact(精确的)
--list
-n --numeric(数值)
--list
--line-numbers(序号)
--list
-c --set-counters(设置计数器)
--insert --append --replace
--modprobe(探测并加载模块)
ALL
matches
五类:通用匹配,TCP匹配,UDP匹配,ICMP匹配,特殊匹配(state,owner limit等)
通用匹配:可以直接使用,不需要前提条件
-p --protocol 协议名
例:iptables -A INPUT -p tcp
1,名字不分大小写,但是/etc/protocols中定义的
2,可以使用相应的数值,ICMP是1,TCP是6,UDP是17
3,缺省是ALL,只匹配TCP,UDP,ICMP
4,可以是列表,以逗号分隔,如tcp,udp
5,可以加!取反,值范围是TCP,UDP,ICMP
-s --source --src 来源地址
iptables -A INPUT -s 192.168.1.1
1,单个地址
2,网络,192.168.1.0/24 192.168.1.0/255.255.255.0
3,加!取反
4,缺省是所有地址
-d --dst --destination 目的地址
iptables -A INPUT -d 192.168.1.1
同 -s一样
-i --in-interface 网络接口
iptables -A INPUT -i eth0
只能用于INPUT,FORWARD,PREROUTING
1,指定接口名称
2,可使用通配符,如 号匹配所有包,不考虑接口,eth 表示所有ethernet接口
3,加!取反
-o --out-interface
同 -i
-f --fragment
iptables -A INPUT -f
匹配被分片的包的第二片及以后的部分
隐含匹配
TCP matches 只能匹配TCP,有 -p tcp为前提
--sport --source-port
1,不指定表示所有端口
2,可以用服务名或端口号,服务名从/etc/services中查找,用端口号装载规则会更快
3,连续端口号,22:80=>20到80的端口号, :80 =>0到80的端口号,80: =>80到65535的端口号
4,可以加!号取反, -sport ! 22
5,不匹配连续的端口列表
--dport --destination-port
用法同sport,目的地端口
--tcp-flags
iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 表示匹配仅SYN标记被设置的包
iptables -p tcp --tcp-flags ALL NONE 匹配所有标记都未设置1的包
iptables -p tcp --tcp-flags ! SYN,FIN,ACK SYN 表示FIN,ACK被设置的包
--syn
为ipchain兼容
--tcp-option
iptables -p tcp --tcp-option 16
根据TCP表头匹配
UDP matches
只有--sport --dport,用法与TCP一样
ICMP matches
--icmp-type
iptables -A INPUT -p icmp --icmptype 8
icmp类型匹配 ,可以加!取反
显式匹配
--limit
iptables -A INPUT -m limit --limit 3/hour
单位时间内可匹配的包
--limit-burst
iptables -A INPUT -m limit 3/hour --limit-burst 5
单位时间内可匹配包的峰值
--mac-source
iptables -A INPUT -m --mac-source AA:BB:00:11:CC:DD
mac地址匹配,只能用于以太网,可用!取反,只能用在PREROUTING,FORWARD,INPUT链中
多端口匹配
可以指定不连续的多个端口,不能同时使用标准端口匹配和多端口匹配.
iptables -A INPUT -p tcp -m multiport --source-port 22,53,80
iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80
iptables -A INPUT -p tcp -m multiport --port 22,53,80 同端口匹配,如80到80的包
owner match
基于包的生成者的ID来匹配包,只能用于OUTPUT
--uid-owner 用户名ID
--gid-owner 组ID
--pid-owner 进程号
--sid-owner 生成包的会话ID(SID)
iptables -A OUTPUT -m --pid-owner 100
state match 连接状态跟踪机制匹配
--state
iptables -A INPUT -m --state RELATED,ESTABLISHED
TOS match
TOS是IP头的一部分,由8个二进制位组成,包括一个3 bit的优先权子字段(现在已被忽略),4 bit的TOS子字 段和1 bit未用位(置0).它一般用来把当前流的优先权和需要的服务(比如,最小延时、最大吞吐量 等)通知路由器.但路由器和管理员对这个值的处理相差很大,有的根本就不理会,而有的就会尽量满足要 求.
--tos
iptables -A INPUT -p tcp -m --tos 0x16
TTL match
根据IP头里的time to live来匹配
--ttl
iptables -A OUTPUT -m ttl --ttl 60
Target/jump
target/jump决定包的处理,语法是--jump target 或 -j target ,target分两类,一是具体的操作,如ACCEPT和DROP,另一个是发送到同一个表内的链
如:
iptables -N newchain
iptables -A INPUT -p tcp -j newchain
包从INPUT跳入newchain,到了newchain的结尾会退回INPUT链的下一条规则,如果在子链中ACCEPT,父链中也ACCEPT,相当于跳过父链中的其它规则
ACCEPT
-j ACCEPT ACCEPT后,当前链与表不再匹配,但还要接受其它表中的链的处理
DNAT
只能用在nat表的PREROUTING和OUTPUT链中,包含DNAT target的链不能被其它链调用
iptables -t nat -A PREROUTING -p tcp -d 172.16.1.1 --dport 80 -j DNAT --to-destination 192.168.1.1
DROP
丢掉包,不向发送者和路由返回信息
LOG
记录包的信息
iptables -A FORWARD -p tcp -j LOG --log-level debug
log-level分为:debug,info,notice warning,warn,err,error,crit,alert,emerg,panic
--log-prefix
log信息的前缀
--log-tcp-sequence
TCP序列号和其它日志信息一起记录
--log-ip-option
记录IP包头中字段大小不变的选项
MASQUERADE
与SNAT作用一样,但不需要指定--to-source,用于动态获取IP地址的连接,如拨号上网DHCP等,只能用于nat表的POSTROUTING,有一个选项--to-ports(非必须)
iptables -t nat POSTROUTING -p tcp -j MASQUERADE --to-ports 80
MARK
设置mark值
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
MIRROR
反转目的地址与来源地址
QUEUE
为软件管理包队列
REDIRECT
防火墙所在的主机内部转发包到另一个端口.
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
REJECT
与DROP作用一样,还会返回错误信息,只能用在INPUT,OUTPUT,FORWARD
iptables -A FORWARD -p tcp --dport 22 -j REJECT --reject-with tcp-reset
可用的信息类型:1,icmp-net-unreachable 2,icmp-host-unreachable 3,icmp-port-unreachable 4,icmp-proto-unreachable 5,icmp-net-prohibited 6,icmp-host-prohibited,默认是3,还有 echo-reply tcp-reset
RETURN
返回上一层,顺序是子链--父链--默认策略
SNAT
只能用在nat表的POSTROUTING
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 192.168.10.10
可以指定单独或连续的地址,也可指定端口
TOS
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j TOS --set-tos 0x10
TTL
若ISP通过判断包的TTL来禁止共享连接,可以设置TTL为相同的数值来冲过封锁
iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-set 64
--ttl-dec 减少1
--ttl-inc 加1
注意TTL每通过一个路由都会减1
ULOG
ULOG可以在用户空间记录被匹配的包的信息,这些信息和整个包都会通过netlink socket被多播。然 后,一个或多个用户空间的进程就会接受它们。换句话说,ULOG是至今iptables和Netfilter下最成熟、最 完善的日志工具,它包含了很多更好的工具用于包的记录。这个target可以是我们把信息记录到MySQL或其 他数据库中。这样,搜索特定的包或把记录分组就很方便了。
iptables -A INPUT -p tcp --dport 22 -j ULOG --ulog-nlgroup 2
--ulog-prefix
--ulog-cprange
--ulog-qtreshold