<服务>iptables基础使用
目录:
iptables防火墙
Linux下的自带的基于包过滤的开源防火墙,主要工作在OSI的二三四层,如果编译内核也可以支持七层,不过效果不好,可以用squid进行7层过滤。iptabls由表和表中包含的链组成,包括FILTER表,NAT表,MANGLE表和RAW表(不常用)四张表和INPUT,OUTPUT,FORWARD(转发), PREROUTING(预路由)和POSTROUTING五种链,链中包含着一条条的过滤语句。
表包含链
iptables表 | 表内包含链 |
---|---|
FILTER |
INPUT,FORWARD和OUTPUT |
NAT |
OUTPUT,PREROUTING和POSTROUTIN |
MANGLE |
INPUT,FORWARD,OUTPUT,PREROUTING和POSTROUTIN |
常用表的作用
FILTER表与主机本身有关,主要负责防火墙功能负责过滤流入流出主机的数据包,iptables默认就使用这张表,INPUT负责过滤所有目标地址是本机地址的数据包,FORWARD负责转发流经主机的数据包,起转发的作用,和NAT关系比较大,OUTPUT处理所有源地址是本机地址的数据包,通俗讲就是处理从主机发出去的数据包
NAT表负责网络地址转换,即来源与目的ip地址与port的转换,应用与主机无关,一般用于局域网共享上网或特殊端口转换服务相关,OUTPUT为主机发出的数据包,可以改变主机发出的数据包的目的地址,PREROUTING在数据包到达防火墙的时候进行路由规则判断,作用是改变包的目的地址和目的端口等,POSTROUTING是在数据包离开防火墙时进行路由判断之后执行的规则,作用是改写数据包的源地址和源端口等,共享上网就是通过这个实现的
数据包经过防火墙时,根据规则一层层的由上至下过滤,如果规则匹配,不会继续向下匹配,而执行Accept或drop,如果所有规则都不匹配,就会根据默认的数据包规则进行处理.
每个表的链所在位置示意图:
我们一般常用的是FILTER表的INPUT和NAT的POSTROUTING,其次是NAT表的PREROUTING和FILTER表的FORWARD
iptables使用
[root@h1 ~]# iptables -V
iptables v1.4.7
[root@h1 ~]# iptables -h
iptables v1.4.7
Usage: iptables -[AD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)
Commands:
Either long or short options are allowed.
--append -A chain Append to chain #添加规则到结尾
--delete -D chain Delete matching rule from chain #删除规则
--delete -D chain rulenum
Delete rule rulenum (1 = first) from chain
--insert -I chain [rulenum] ##添加规则到开头(一般封IP都用-I)
Insert in chain as rulenum (default 1=first)
--replace -R chain rulenum
Replace rule rulenum (1 = first) in chain
--list -L [chain [rulenum]] #列表
List the rules in a chain or all chains
--list-rules -S [chain [rulenum]]
Print the rules in a chain or all chains
--flush -F [chain] Delete all rules in chain or all chains #清除所有规则
--zero -Z [chain [rulenum]] #链的计数器清零
Zero counters in chain or all chains
--new -N chain Create a new user-defined chain #添加自定义的链
--delete-chain
-X [chain] Delete a user-defined chain #删除自定义的链
--policy -P chain target #默认规则
Change policy on chain to target
--rename-chain
-E old-chain new-chain
Change chain name, (moving any references)
Options:
[!] --proto -p proto protocol: by number or name, eg. `tcp'
[!] --source -s address[/mask][...]
source specification
[!] --destination -d address[/mask][...]
destination specification
[!] --in-interface -i input name[+]
network interface name ([+] for wildcard)
--jump -j target #处理规则
target for rule (may load target extension)
--goto -g chain
jump to chain with no return
--match -m match
extended match (may load extension)
--numeric -n numeric output of addresses and ports #显示数量
[!] --out-interface -o output name[+]
network interface name ([+] for wildcard)
--table -t table table to manipulate (default: `filter')
--verbose -v verbose mode
--line-numbers print line numbers when listing #规则序号
--exact -x expand numbers (display exact values)
[!] --fragment -f match second or further fragments only
--modprobe=<command> try to insert modules using this command
--set-counters PKTS BYTES set the counter during insert/append
[!] --version -V print package version. #查看版本
这个是通过-h获得的,博客最下面有根据百度文库整理的iptables指令。
启动防火墙
[root@h1 ~]# service iptables start
iptables: Applying firewall rules: [ OK ]
[root@h1 ~]# service iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[root@h1 ~]# lsmod | egrep "nat|filter" #iptables模块
iptable_filter 2793 1
ip_tables 17831 1 iptable_filter
ip6table_filter 2889 1
ip6_tables 18732 1 ip6table_filter
如果无法启动防火墙,可以在setup中选择Firewall configuration选择enable
显示默认表的规则
[root@h1 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
当然也可以加-v -x参数
清除所有规则
[root@h1 ~]# iptables -F
[root@h1 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
生成新规则
[root@h1 ~]# ss -lnptu | grep ssh
tcp LISTEN 0 128 :::22 :::* users:(("sshd",1709,4))
tcp LISTEN 0 128 *:22 *:* users:(("sshd",1709,3))
[root@h1 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
[root@h1 ~]#
- 然后就我们的ssh登录就断开了,如果想恢复就需要清楚规则
- -t参数可以不加,默认为filter
- -dport为发送端口,-sport是源端口,不过源端口用的比较少
- 链和规则都必须要大写
- 基本处理规则为DROP(丢弃),REJECT(拒绝)和APPECT(接受),不过DROP(丢弃)比REJECT(拒绝)好一些
查看规则顺序
[root@h1 ~]# iptables -t filter -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
规则顺序
[root@h1 ~]# iptables -t filter -A INPUT -p tcp --dport 80 -j DROP
[root@h1 ~]# iptables -t filter -A INPUT -p tcp --dport 81 -j DROP
[root@h1 ~]# iptables -t filter -A INPUT -p tcp --dport 82 -j DROP
[root@h1 ~]# iptables -t filter -I INPUT -p tcp --dport 79 -j DROP
[root@h1 ~]# iptables -t filter -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:79
2 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
3 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:81
4 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:82
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[root@h1 ~]# iptables -t filter -I INPUT 2 -p tcp --dport 78 -j DROP
[root@h1 ~]# iptables -t filter -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:79
2 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:78
3 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
4 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:81
5 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:82
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
-A为插入到结尾,-I为插入到开头,对于封IP都是用-I参数,因为放在后边会不生效,也可以在INPUT等后边加上数字,代表插入为第几个规则
禁止目的IP网络接入
[root@h1 ~]# iptables -t filter -A INPUT -i eth0 -s 192.168.174.102 -j DROP
[root@h1 ~]# iptables -L -n -v
Chain INPUT (policy ACCEPT 33 packets, 2208 bytes)
pkts bytes target prot opt in out source destination
148 12432 DROP all -- eth0 * 192.168.174.102 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 21 packets, 2300 bytes)
pkts bytes target prot opt in out source destination
通过-i指定接入网卡,同理-o为指定发出网卡,不过出就一般是用FORWARD链,-s指定ip,也可以是网段,例如192.168.174.0/24,防火墙禁止后,192.168.174.102就无法访问192.168.174.101的主机了。还有一个'!'用于非,即匹配非-s参数进行允许 CentOS5.X版本
[root@h1 ~]# iptables -t filter -A INPUT -i eth0 -s ! 192.168.174.102 -j ACCEPT
CentOS6.X版本
[root@h1 ~]# iptables -t filter -A INPUT -i eth0 ! -s 192.168.174.102 -j ACCEPT
禁止ICMP协议,禁ping
[root@h1 ~]# iptables -t filter -A INPUT -p icmp --icmp-type 8 -s 192.168.174.102 -j DROP
一般VPN服务,对外体统服务的机器的SSH端口都做禁止外部IP访问限制,这个8是数据包的大小,也可以指定为any
封范围端口
[root@h1 ~]# iptables -A INPUT -dport 50:80 -j DROP
[root@h1 ~]# iptables -A INPUT -m multiport -dport 21,22,23,24 -j DROP
根据连接状态进行匹配
[root@h1 ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
一般用于FTP
指定请求速率
[root@h1 ~]# iptables -A INPUT -s 192.168.174.0/24 -d 192.168.0.101 -p icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 6 -j ACCEPT
--limit用法是n/{second/minute/hour}指定时间内的请求数为n ----limit-burst限制在同一时间内允许通过的请求数为n,默认为5
企业防火墙配置
基本配置
清除默认规则
[root@h1 ~]# iptables -F #清除所有规则
[root@h1 ~]# iptables -X #清除自定义链
[root@h1 ~]# iptables -Z #计数器清零
添加ssh登录和本地回环
[root@h1 ~]# iptables -A INPUT -p tcp --dport 22 -s 192.168.174.0/24 -j ACCEPT #允许ssh登录,可以根据需要修改端口号及网段
[root@h1 ~]# iptables -A INPUT -i lo -j ACCEPT #允许本地回环
[root@h1 ~]# iptables -A OUTPUT -o lo -j ACCEPT
添加默认规则
[root@h1 ~]# iptables -P INPUT DROP #默认规则,不允许进入
[root@h1 ~]# iptables -P OUTPUT ACCEPT #默认规则,允许离开
[root@h1 ~]# iptables -P FORWARD DROP #默认规则,不允许转发
根据自身配置
添加网段访问
一般是允许办公网的IP,IDC机房内网网段,IDC机房外网网段,以及其他所属机房的网段或固定IP地址访问 例如:
[root@h1 ~]# iptables -A INPUT -s 192.168.0.0/24 -p all -j ACCEPT
添加服务端口
允许web服务访问,同理mysql服务,hdfs服务等 例如:
[root@h1 ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
是否允许ping通
ping默认为8字节,禁止的话为DROP,允许的话为ACCEPT,也可以按照上面的限制次数和并发的访问
[root@h1 ~]# iptables -t filter -A INPUT -p icmp --icmp-type 8 -j DROP
允许FTP关联的包通过
[root@h1 ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@h1 ~]# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
检验
[root@h2 ~]# nmap 192.168.174.101 -p 1-65535
Nmap scan report for A (192.168.174.101)
Host is up (0.00038s latency).
Not shown: 65533 closed ports
Port STATE SERVICE
22/tcp open ssh
80/tcp open http
[root@h1 ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT tcp -- 192.168.174.0/24 0.0.0.0/0 tcp dpt:22
2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 192.168.0.0/24 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
5 DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 8
6 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
Chain FORWARD (policy DROP)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
保存防火墙配置
上述配置都是存放在在内存中,当前生效,重启后就失效了,需要保存到iptables文件中
[root@h1 ~]# /etc/init.d/iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
[root@h1 ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Tue Jan 24 20:48:37 2017
*filter
:INPUT DROP [12:936]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [191:25372]
-A INPUT -s 192.168.174.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 192.168.0.0/24 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Tue Jan 24 20:48:37 2017
也可以用
iptables-save>/etc/sysconfig/iptables
防止syn攻击
[root@h1 ~]# iptables -N syn-flood
[root@h1 ~]# iptables -A INPUT -i eth0 -p tcp --syn -j syn-flood
[root@h1 ~]# iptables -A syn-flood -m limit --limit 5000/s --limit-burst 200 -j RETURN
[root@h1 ~]# iptables -A syn-flood -j DROP
RETURN,结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自定义规则链看成是一个子程序,那么这个动作,就相当于提前结束子程序并返回到主程序中。
日后添加或删除规则
日后添加或删除规则需要通过直接修改/etc/sysconfig/iptables配置文件实现,然后保存后通过service iptables reload生效
iptables tcp-flags过滤
# prevent all Stealth Scans and TCP State Flags
$IPT -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
# All of the bits are cleared
$IPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
$IPT -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
#SYN and RST are both set
$IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# SYN and FIN are both set
$IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# FIN and RST are both set
$IPT -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
# FIN is the only bit set, without the expected accompanying ACK
$IPT -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
# PSH is the only bit set, without the expected accompanying ACK
$IPT -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
# URG is the only bit set, without the expected accompanying ACK
$IPT -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP
定时脚本
提供一个简单的加墙脚本,仅提供一个思路
#!/bin/sh
/bin/netstat -na | grep ESTABLISHED | awk '{print $5}' | awk -F':' '{print $1}' | sort | uniq -c | sort -rn | head -10 | egrep -v '192.168|127.0' | awk '{if ($2!=null && $1<4) {print $2}}' > /why/dropip
for i in $(cat /why/dropip)
do
/sbin/iptables -I INPUT -s $i -j DROP
echo "$i kill at `date`">>/var/log/ddos
done
iptables 指令语法
以下内容摘自百度文库链接
iptables [-t table] command [match] [-j target/jump]
[-t table] 指定规则表
-t 参数用来指定规则表,内建的规则表有三个,分别是:nat、mangle和filter,当未指定规则表时,则一律视为是filter。
三个规则表的功能
- filter:这是默认的表,包含了内建的链INPUT(处理进入的包)、FORWORD(处理通过的包)和OUTPUT(处理本地生成的包)。这个规则表顾名思义是用来进行封包过滤的处理动作(例如:DROP、LOG、ACCEPT 或 REJECT),我们会将基本规则都建立在此规则表中;
- nat:这个表被查询时表示遇到了产生新的连接的包,由三个内建的链构成:PREROUTING(修改到来的包)、OUTPUT(修改路由之前本地的包)、POSTROUTING(修改准备出去的包)。这个规则表除了作网址转换外,请不要做其它用途;
- mangle:此规则表拥有PREROUTING、FORWARD和POSTROUTING三个规则链。除了进行网址转换工作会改写封包外,在某些特殊应用可能也必须去改写封包(TTL、TOS)或者是设定 MARK(将封包作记号,以进行后续的过滤),这时就必须将这些工作定义在 mangle 规则表中,由于使用率不高,我们不打算在这里讨论 mangle 的用法。
command常用命令列表
命令 | 范例 | 说明 |
---|---|---|
-A, --append |
iptables -A INPUT ... |
新增规则到某个规则链中,该规则将会成为规则链中的最后一条规则 |
-D, --delete |
iptables -D INPUT --dport 80 -j DROP iptables -D INPUT 1 |
说明从某个规则链中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除 |
-R, --replace |
iptables -R INPUT 1 -s 192.168.0.1 -j DROP |
取代现行规则,规则被取代后并不会改变顺序 |
-I, --insert |
iptables -I INPUT 1 --dport 80 -j ACCEPT |
插入一条规则,原本该位置上的规则将会往后移动一个顺位 |
-L, --list |
iptables -L INPUT |
列出某规则链中的所有规则 |
同上 | iptables -t nat -L |
列出nat表所有链中的所有规则 |
-F, --flush |
iptables -F INPUT |
删除filter表中INPUT链的所有规则 |
-Z, --zero |
iptables -Z INPUT |
将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。 |
-N, --new-chain |
iptables -N allowed |
定义新的规则链 |
-X, --delete-chain |
iptables -X allowed |
删除某个规则链 |
-P, --policy |
iptables -P INPUT DROP |
定义过滤政策。也就是未符合过滤条件之封包,默认的处理方式。可以是:ACCEPT:未经禁止全部许可,DROP:未经许可全部禁止 |
-E, --rename-chain |
iptables -E allowed disallowed |
修改某自定义规则链的名称 |
-h --Help |
iptables -h | 帮助。给出当前命令语法非常简短的说明 |
附加选项(OTHER OPTIONS)
-v --verbose
详细输出。这个选项让list命令显示接口地址、规则选项(如果有)和TOS(Type of Service)掩码。包和字节计数器也将被显示,分别用K、M、G(前缀)表示1000、1,000,000和1,000,000,000倍(不过请参看-x标志改变它),对于添加,插入,删除和替换命令,这会使一个或多个规则的相关详细信息被打印。-n --numeric
数字输出。IP地址和端口会以数字的形式打印。默认情况下,程序试显示主机名、网络名或者服务(只要可用)。-x -exact
扩展数字。显示包和字节计数器的精确值,代替用K,M,G表示的约数。这个选项仅能用于-L命令。--line-numbers
当列表显示规则时,在每个规则的前面加上行号,与该规则在链中的位置相对应。[match] 常用封包匹配参数
参数 | 范例 | 说明 |
---|---|---|
-p, --protocol |
iptables -A INPUT -p tcp |
匹配通讯协议类型是否相符,可以使用"!"运算符进行反向匹配,例如:-p !tcp,意思是指除 tcp 以外的其它类型,如udp、icmp ...等。如果要匹配所有类型,则可以使用all关键词,例如:-p all |
-s, --src, --source |
iptables -A INPUT -s 192.168.1.1 |
用来匹配封包的来源 IP,可以匹配单机或网络,匹配网络时请用数字来表示 子网掩码,例如:-s 192.168.0.0/24;匹配IP 时可以使用 ! 运算符进行反向匹配,例如:-s !192.168.0.0/24 |
-d, --dst, --destination |
iptables -A INPUT -d 192.168.1.1 |
用来匹配封包的目的地 IP,设定方式同上。 |
-i, --in-interface |
iptables -A INPUT -i eth0 |
用来匹配封包是从哪块网卡进入,可以使用通配字符 + 来做大范围匹配,例如:-i eth+表示所有的ethernet网卡,也可以使用!运算符进行反向匹配,例如:-i !eth0 |
-o, --out-interface |
iptables -A FORWARD -o eth0 |
用来匹配封包要从哪 块网卡送出,设定方式同上 |
对应的扩展(MATCH EXTENSIONS)
iptables能够使用一些与模块匹配的扩展包。以下就是含于基本包内的扩展包,而且他们大多数都可以通过在前面加上!来表示相反的意思。
tcp
当--protocol tcp
被指定,且其他匹配的扩展未被指定时,这些扩展被装载。它提供以下选项:
参数 | 范例 | 说明 |
---|---|---|
--sport, --source-port |
iptables -A INPUT -p tcp --sport 22 |
用来匹配封包的源端口,可以匹配单一端口,或是一个范围,例如:--sport 22:80 表示从22到80端口之间都算是符合条件,如果要匹配不连续的多个端口,则必须使用--multiport 参数,详见后文。匹配端口号时,可以使用"!"运算符进行反向匹配。 |
--dport, --destination-port |
iptables -A INPUT -p tcp --dport 22 |
用来匹配封包的目的地端口号,设定方式同上 |
--tcp-flags |
iptables -p tcp --tcp-flags SYN,FIN,ACK,SYN |
说明匹配TCP封包的状态标志,参数分为两个部分,第一个部分列举出相匹配的标志,第二部分则列举前述标志中哪些有被设置,未被列举的标志必须是空的。TCP 状态标志包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)、PSH(强迫推送)等均可使用于参数中,除此之外还可以使用关键词ALL和NONE进行匹配。匹配标志时,可以使用"!"运算符行反向匹配 |
--syn |
iptables -p tcp --syn |
用来表示TCP通信协议中,SYN位被打开,而ACK与FIN位关闭的分组,即TCP的初始连接,与iptables -p tcp --tcp-flags SYN,FIN,ACK,SYN 的作用完全相同,如果使用!运算符,可用来匹配非要求连接封包。 --tcp-option [!] number 匹配设置了TCP选项的 |
udp
当--protocol udp
被指定,且其他匹配的扩展未被指定时,这些扩展被装载,它提供以下选项:
参数 | 范例 | 说明 |
---|---|---|
--sport |
--source-port [!] [port:[port]] |
源端口或端口范围指定。详见 TCP扩展的--source-port 选项说明 |
--dsport |
--destination-port |
目标端口或端口范围指定。详见 TCP扩展的--destination-port 选项说明 |
icmp
当--protocol icmp
被指定,且其他匹配的扩展未被指定时,该扩展被装载。它提供以下选项:
参数 | 范例 | 说明 |
---|---|---|
--icmp-type |
iptables -A INPUT -p icmp --icmp-type 8 |
用来匹配ICMP的类型编号,可以使用代码或数字编号来进行匹配。请打iptables -p icmp --help 来查看有哪些代码可用 |
-m mac --mac-source |
iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01 |
用来匹配封包来源网络接口的硬件地址,这个参数不能用在OUTPUT和POSTROUTING规则链上,这是因为封包要送到网卡后,才能由网卡驱动程序透过ARP通讯协议查出目的地的MAC地址,所以iptables在进行封包匹配时,并不知道封包会送到哪个网络接口去 |
m参数选项
multiport模块
这个模块匹配一组源端口或目标端口,最多可以指定15个端口。只能和-p tcp 或者 -p udp 连着使用
参数 | 范例 | 说明 |
---|---|---|
-m multiport --source-port |
iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110 | 用来匹配不连续的多个源端口,一次最多可以匹配 15 个端口,可以使用"!"运算符进行反向匹配 |
-m multiport --destination-port |
用来匹配不连续的多个目的地端口号,设定方式同上 | |
-m multiport --port |
iptables -A INPUT -p tcp -m multiport --port 22,53,80,110 |
这个参数比较特殊,用来匹配源端口和目的端口号相同的封包,设定方式同上。注意:在本范例中,如果来源端口号为80目的地端口号为110,这种封包并不算符合条件 |
limit模块
这个模块匹配标志用一个标记桶过滤器一一定速度进行匹配,它和LOG目标结合使用来给出有限的登陆数.当达到这个极限值时,使用这个扩展包的规则将进行匹配.(除非使用了"!"标记)
参数 | 范例 | 说明 |
---|---|---|
-m limit --limit |
iptables -A INPUT -m limit --limit 3/hour |
用来匹配某段时间内封包的平均流量,上面的例子是用来匹配:每小时平均流量是否超过一次3个封包。除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后: /second、 /minute、/day,除了进行封包数量的匹配外,设定这个参数也会在条件达成时,暂停封包的匹配动作,以避免因骇客使用洪水攻击法,导致服务被阻断 |
--limit-burst |
iptables -A INPUT -m limit --limit-burst 5 |
用来匹配瞬间大量封包的数量,上面的例子是用来匹配一次同时涌入的封包是否超过5个(这是默认值),超过此上限的封包将被直接丢弃。使用效果同上 |
mark模块
这个模块和与netfilter过滤器标记字段匹配(就可以在下面设置为使用MARK标记)
参数 --mark
范例 iptables -t mangle -A INPUT -m mark --mark 1
说明 用来匹配封包是否被表示某个号码,当封包被 匹配成功时,我们可以透过 MARK 处理动作,将该封包标示一个号码,号码最大不可以超过 4294967296
owner模块
此模块试为本地生成包匹配包创建者的不同特征。只能用于OUTPUT链,而且即使这样一些包(如ICMP ping应答)还可能没有所有者,因此永远不会匹配。
参数 | 范例 | 说明 |
---|---|---|
-m owner --uid-owner |
iptables -A OUTPUT -m owner --uid-owner 500 |
用来匹配来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用root或其它身分将敏感数据传送出,可以降低系统被骇的损失。可惜这个功能无法匹配出来自其它主机的封包 |
-m owner --gid-owner |
iptables -A OUTPUT -m owner --gid-owner 0 |
用来匹配来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上 |
-m owner --pid-owner |
iptables -A OUTPUT -m owner --pid-owner 78 |
用来匹配来自本机的封包,是否为某特定进程所产生的,使用时机同上 |
-m owner --sid-owner |
iptables -A OUTPUT -m owner --sid-owner 100 |
用来匹配来自本机的封包,是否为某特定 连接(Session ID)的响应封包,使用时机同上。 |
state模块
此模块,当与连接跟踪结合使用时,允许访问包的连接跟踪状态;
参数 -m state --state
范例 iptables -A INPUT -m state --state RELATED,ESTABLISHED
说明 用来匹配连接状态, 连接状态共有四种:INVALID、ESTABLISHED、NEW和RELATED。
- INVALID 表示该封包的连接编号(Session ID)无法辨识或编号不正确。
- ESTABLISHED 表示该封包属于某个已经建立的连接。
- NEW 表示该封包想要起始一个连接(重设连接或将连接重导 向)。
- RELATED 表示该封包是属于某个已经建立的连接,所建立的新连接。例如:FTP-DATA连接必定是源自某个FTP连接。
tos模块
此模块匹配IP包首部的8位tos(服务类型)字段(也就是说,包含在优先位中)
--tos tos
这个参数可以是一个标准名称(iptables -m tos -h 察看该列表),或者数值。
[-j target/jump] 常用的处理动作:
-j 参数用来指定要进行的处理动作,常用的处理动作包括: ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,分别说明如下:
ACCEPT: 将封包放行,进行完此处理动作后,将不再匹配其 它规则,直接跳往下一个规则链(natostrouting)。
REJECT: 作为对匹配的包的响应,返回一个错误的包:其他 情况下和DROP相同。 此目标只适用于INPUT、FORWARD和OUTPUT链,和调用这些链的用户自定义链。这几个选项控制返回的错误包的特性:
--reject-with type
Type可以是icmp-net-unreachable、icmp-host-unreachable、icmp-port-unreachable,icmp-proto-unreachable、 icmp-net-prohibited或者icmp-host-prohibited
,该类型会返回相应的ICMP错误信息(默认是port-unreachable)。选项echo-reply也是允许的;它只能用于指定ICMP ping包的规则中,生成ping的回应。最后,选项tcp-reset可以用于在INPUT链中,或自INPUT链调用的规则,只匹配TCP协议:将回应一个TCP RST包。DROP: 丢弃封包不予处理,进行完此处理动作后,将不再匹 配其它规则,直接中断过滤程序。
REDIRECT: 只适用于nat表的PREROUTING和OUTPUT链, 和只调用它们的用户自定义链。将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续匹配其它规则。 这个功能可以用来实现透明代理或用来保护 web 服务器。它包含一个选项: --to-ports
[ ] 指定使用的目的端口或端口范围:不指定的话,目标端口不会被修改。只能用于指定了-p tcp 或 -p udp的规则。 例如: iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
MASQUERADE:只用于nat表的POSTROUTING链。只能用于动态获取IP(拨号)连接:如果你拥有静态IP地址,你要用SNAT。伪装相当于给包发出时所经过接口的IP地址设置一个映像,当接口关闭连接会终止。这是因为当下一次拨号时未必是相同的接口地址(以后所有建立的连接都将关闭)。它有一个选项:
--to-ports <port>[-port]
指定使用的源端口范围,覆盖默认的SNAT源地址选择(见上面)。这个选项只适用于指定了-p tcp或者-p udp的规则。 范例如下:iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
LOG: 为匹配的包开启内核记录。当在规则中设置了这一选项后,linux内核会通过printk()打印一些关于全部匹配包的信息(诸如IP包头字段等)
--log-level level
记录级别(数字或参看 syslog.conf(5))。--log-prefix prefix
在纪录信息前加上特定的前缀:最多14个字母长,用来和记录中其他信息区别。 例如:iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
--log-tcp-sequence
记录TCP序列号。如果记录能被用户读取那么这将存在安全隐患--log-tcp-options
记录来自TCP包头部的选项。--log-ip-options
记录来自IP包头部的选项。SNAT:这个目标只适用于nat表的POSTROUTING链。改写封包来源IP为某特定IP或IP范围,可以指定port对应的范围,进行完此处理动作后,将直接跳往下一个规则(mangleostrouting),它包含选项:
--to-source <ipaddr>[-ipaddr][:port-port]
可以指定一个单一的新的IP地址,一个IP地址范围,也可以附加一个端口范围(只能在指定-p tcp 或者-p udp的规则如果未指定端口范围,源端口中512以下的(端口)会被安置为其他的512以下的端口;512到1024之间的端口会被安置为1024以下的,其他端口会被安置为1024或以上。如果可能,端口不会被修改。--to-destiontion<ipaddr>[-ipaddr][:port-port]
可以指定一个单一的新的IP地址,一个IP地址范围,也可以附加一个端口范围(只能在指定-p tcp 或者-p udp的规则里)。如果未指定端口范围,目标端口不会被修改。 范例如下:iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000
DNAT: 改写封包目的地IP为某特定IP或IP范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则链(filter:input 或 filter:forward)。 范例如下:
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100
MIRROR: 镜射封包,也就是将来源IP与目的地IP对调后,将封包送回,并只适用于INPUT、FORWARD和OUTPUT链,以及只调用它们的用户自定义链。
QUEUE: 中断过滤程序,将封包放入队列,交给其它程序处理。通过自行开发的处理程序,可以进行其它应用,例如:计算连接费用等。
RETURN: 结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自定义规则链看成是一个子程序,那么这个动作,就相当于提前结束子程序并返回到主程序中。
MARK: 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续匹配其它规则,只适用于mangle表。范例如下
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
TOS: 用来设置IP包的首部八位tos。只能用于mangle表。
--set-tos tos
你可以使用一个数值型的TOS值,或者用iptables -j TOS -h
来查看有效TOS名列表;
常见攻击方式
刺探和扫描
刺探是企图连接到一个单独的服务端口或获得该端口的响应.扫描是到一个不同服务端口的集合的一系列的刺探
拒绝服务攻击
- TCP SYN洪水攻击消耗你的系统资源直到不可能再接受入站的TCP连接为止。这个攻击结合了IP源地址欺骗,同时还利用了连接时进行的基本TCP三次握手协议,解决方法:一、对源地址进行过滤;二、启用内核的SYN cookie模块,当资源紧张时可释放队列。用命令echo 1 > /proc/sys/net/ipv4/tcp_syncookies来完成
- ping洪水攻击和ping of Death(现在不常用)
- UDP洪水攻击
- 碎片炸弹
- 缓冲区溢出 主要通过重写系统的数据区域或运行时堆栈(是在函数调用进程中所使用的一种暂存空间)来使系统或服务器崩溃
- ICMP重定向炸弹 告诉目标系统改变其内存中的路由表以选用更短的路径
- 拒绝服务攻击和其他系统资源 如:系统被迫向错误日志文件中写入大量的消息,那么你的文件系统将溢出