Linux学习笔记之---IPtables

iptables的结构
iptables -> Tables -> Chains -> Rules. 简单地讲,tables由chains组成,而chains又由rules组成。如下图所示。

图: IPTables Table, Chain, and Rule Structure

iptables规则表从上到下匹配,头一个规则如果匹配了,下一个相关规则无效, iptables 的表和链中都规则是从上到下都顺序来匹配的,优先级   上 > 下

如果用iptables命令写好规则后,运行 service iptables save 来保存.否则重启无效

iptables命令使用原则:
链名  必须  大写
表名  必须  小写
动作  必须  大写
匹配  必须  小写

iptables重启
1)重启后生效
开启: chkconfig iptables on
关闭: chkconfig iptables off
2)即时生效,重启后失效
开启: service iptables start
关闭: service iptables stop

启动脚本:/etc/rc.d/init.d/iptables
规则文件:/etc/sysconfig/iptables
配置文件:/etc/sysconfig/iptables-config

iptables命令格式
iptables  [-t 表名]  管理选项  [链名]  [条件匹配]  [-j 目标动作或跳转]


表选项用于指定命令应用于哪个iptables内置,iptables内置包括filter表、nat表、mangle表和Raw表

一、iptables的表与链:

1. Filter表---------- 过滤作用

Filter表示iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,它具有以下三种内建链:

  • INPUT链 �C 处理来自外部的数据。匹配目的ip是本机的数据包

  • OUTPUT链 �C 处理向外发送的数据。匹配从本机出去的数据包

  • FORWARD链 �C 将数据转发到本机的其他网卡设备上。匹配通过本机的数据包,从外部来,通过本机,又转发到外部

2. NAT表------------ 做网络地址转换的.network address translator

NAT表有三种内建链:

  • PREROUTING链 �C 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。用于修改目的地址 destination nat

  • POSTROUTING链 �C 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。用于修改源地址 source nat

  • OUTPUT链 �C 处理本机产生的数据包。

3. Mangle表

Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链:

  • PREROUTING

  • OUTPUT

  • FORWARD

  • INPUT

  • POSTROUTING

4. Raw表

Raw表用于处理异常,它具有2个内建链:

  • PREROUTING chain

  • OUTPUT chain

下图展示了iptables的三个内建表:

表查看:

 iptables -t mangle --list     查看mangle表 
 iptables -t nat --list           查看nat表 注意:如果不指定-t选项,就只会显示默认的filter表。

二、IPTABLES 规则(Rules):

iptables规则:
   Rules包括一个条件和一个目标(target)
   如果满足条件,就执行目标(target)中的规则或者特定值。
   如果不满足条件,就判断下一条Rules。

目标值(Target Values)


执行目标参数:
-j(jump to target)

-j指定了当与规则(Rule)匹配时如何处理数据包,可能的值是ACCEPT, DROP, QUEUE, RETURN,还可以指定其他链(Chain)作为目标
ACCEPT �C 允许防火墙接收数据包
DROP �C 防火墙丢弃包
QUEUE �C 防火墙将数据包移交到用户空间
RETURN �C 防火墙停止执行当前链中的后续Rules,并返回到调用链(the calling chain)中。
REDIRECT -将数据包重新转向到本机或另一台主机的某个端口,通常用功能实现透明代理或对外开放内网某些服务
SNAT -源地址转换,即改变数据包的源地址
DNAT -目标地址转换,即改变数据包的目的地址
如:... -j DNAT    



条件值
添加规则参数:
-A或―append <链名> 在规则列表的最后增加1条规则
-I或--insert <链名> 在指定的位置插入1条规则,根据给出的规则序号向所选链中插入规则。如果序号为1,规则会   被插入链的头部,默认序号就是1。
-D或--delete <链名> 从规则列表中删除1条规则
-R或--replace <链名> 替换规则列表中的某条规则
-P或--policy <链名> 定义默认策略
-F或--flush <链名> 删除表中所有规则,如果没有指定链,则清空指定表中的所有链。如果什么都没有指定,就清    空默认表所有的链。
-Z或--zero <链名> 将表中数据包计数器和流量计数器归零
-L或--list <链名> 查看iptables规则列表,显示所选链的所有规则。如果没有指定链,则显示指定表中的所有链。如    果什么都没有指定,就显示默认表所有的链。
例:
iptables -I FORWARD -s 192.168.1.0/24 -p tcp --dport 21 -j DROP
在表filter的FORWARD链序号为1的位置插入一条致敬来源IP地址为192.168.1.0网段通过tcp协议访问的目标端口为21的数据包
如:... -A INPUT  ;   -A OUTPUT

描述规则参数:

-p 协议(protocol)

  • 指定规则的协议,如tcp, udp, icmp等,可以使用all来指定所有协议。

  • 如果不指定-p参数,则默认是all值。这并不明智,请总是明确指定协议名称。

  • 可以使用协议名(如tcp),或者是协议值(比如6代表tcp)来指定协议。映射关系请查看/etc/protocols

  • 还可以使用�Cprotocol参数代替-p参数
    如:... -p tcp  ; -p udp

-s 源地址(source)

  • 指定数据包的源地址

  • 参数可以使IP地址、网络地址、主机名

  • 例如:-s 192.168.1.101指定IP地址

  • 例如:-s 192.168.1.10/24指定网络地址

  • 如果不指定-s参数,就代表所有地址

  • 还可以使用�Csrc或者�Csource

-d 目的地址(destination)

  • 指定目的地址

  • 参数和-s相同

  • 还可以使用�Cdst或者�Cdestination
    如:... -d 192.168.1.101

-i 输入接口(input interface)

  • -i代表输入接口(input interface)

  • -i指定了要处理来自哪个接口的数据包

  • 这些数据包即将进入INPUT, FORWARD, PREROUTE链

  • 例如:-i eth0指定了要处理经由eth0进入的数据包

  • 如果不指定-i参数,那么将处理进入所有接口的数据包

  • 如果出现! -i eth0,那么将处理所有经由eth0以外的接口进入的数据包

  • 如果出现-i eth+,那么将处理所有经由eth开头的接口进入的数据包

  • 还可以使用�Cin-interface参数

-o 输出(out interface)

  • -o代表”output interface”

  • -o指定了数据包由哪个接口输出

  • 这些数据包即将进入FORWARD, OUTPUT, POSTROUTING链

  • 如果不指定-o选项,那么系统上的所有接口都可以作为输出接口

  • 如果出现! -o eth0,那么将从eth0以外的接口输出

  • 如果出现-i eth+,那么将仅从eth开头的接口输出

  • 还可以使用�Cout-interface参数

-m(multiport):表示启用多端口扩展,之后我们就可以启用比如 --dports21,23,80
可以使用扩展模块来进行数据包的匹配,语法就是 -m module_name, 如:-m tcp 的意思是使用 tcp 扩展模块的功能 (tcp扩展模块提供了 --dport, --tcp-flags, --sync等功能)

--state :指定要匹配数据包的状态,
             4种状态:INVALID、ESTABLISHED、NEW和RELATED。这个匹配操作必须                   由-mstate明确指定才能使用

-�Csport 源端口(source port)针对 -p tcp 或者 -p udp

  • 缺省情况下,将匹配所有端口

  • 可以指定端口号或者端口名称,例如”�Csport 22″与”�Csport ssh”。

  • /etc/services文件描述了上述映射关系。

  • 从性能上讲,使用端口号更好

  • 使用冒号可以匹配端口范围,如”�Csport 22:100″

  • 还可以使用”�Csource-port”
    如:... -p tcp --sport 22

�C-dport 目的端口(destination port)针对-p tcp 或者 -p udp

  • 参数和�Csport类似

  • 还可以使用”�Cdestination-port”
    如:... -p udp --dport 53

-�Ctcp-flags TCP标志 针对-p tcp

  • 可以指定由逗号分隔的多个参数

  • 有效值可以是:SYN, ACK, FIN, RST, URG, PSH

  • 可以使用ALL或者NONE

-�Cicmp-type ICMP类型 针对-p icmp

  • �Cicmp-type 0 表示Echo Reply

  • �Cicmp-type 8 表示Echo

三、清空、查看所有iptables规则

在配置iptables之前,你通常需要用iptables --list命令或者iptables-save命令查看有无现存规则,因为有时需要删除现有的iptables规则:

iptables --flush 或者 iptables -F 

这两条命令是等效的。但是并非执行后就万事大吉了。你仍然需要检查规则是不是真的清空了,因为有的linux发行版上这个命令不会清除NAT表中的规则,此时只能手动清除:

iptables -F INPUT   #清空filter表INPUT链中的所有规则
iptables -t nat -F PREROUTING
iptables -t nat vxnL PREROUTING
--# v: 显示详细信息
--# x: 在v的基础上,禁止自动单位换算
--# n: 只显示IP地址和端口号码,不显示域名和服务名称
iptables -L                   查看规则

四、永久生效
当你删除、添加规则后,这些更改并不能永久生效,这些规则很有可能在系统重启后恢复原样。为了让配置永久生效,根据平台的不同,具体操作也不同。下面进行简单介绍:

1.Ubuntu

首先,保存现有的规则:


iptables-save > /etc/iptables.rules 

然后新建一个bash脚本,并保存到/etc/network/if-pre-up.d/目录下:
#!/bin/bash iptables-restore < /etc/iptables.rules
这样,每次系统重启后iptables规则都会被自动加载。

/!\
注意:不要尝试在.bashrc或者.profile中执行以上命令,因为用户通常不是root,而且这只能在登录时加载iptables规则。

2.CentOS, RedHat

# 保存iptables规则 service iptables save  # 重启iptables服务 service iptables stop service iptables start 

查看当前规则:

cat  /etc/sysconfig/iptables

iptables技巧实例
1、禁止客户机访问不健康网站
【例1】添加iptables规则禁止用户访问域名为
www.playboy.com的网站,然后查看filter表的FORWARD链规则列表。
-命令 匹配 操作
#iptables -I FORWARD -d
www.playboy.com -j DROP
#iptables -t filter -L FORWARD
【例2】添加iptables规则禁止用户访问IP地址为202.17.61.4的网站,然后查看filter表的FORWARD链规则列表。
-命令 匹配 操作
#iptables -I FORWARD -d 202.17.61.4 -j DROP
#iptables -t filter -L FORWARD
2、禁止某些客户机上网
【例1】添加iptables规则禁止IP地址为192.168.1.200的客户机上网,然后查看filter表的FORWARD链规则列表。
-命令 匹配 操作
#iptables -A FORWARD -s 192.168.1.200 -j DROP
#iptables -t filter -L FORWARD
【例2】添加iptables规则禁止192.168.2.0子网里所有的客户机上网,然后查看filter表的FORWARD链规则列表。
-命令 匹配 操作
#iptables -I FORWARD -s 192.168.2.0/24 -j DROP
#iptables -t filter -L FORWARD
3、禁止客户机访问某些服务
【例1】禁止192.168.1.0子网里所有的客户机使用FTP协议下载(即封闭TCP协议的21端口),然后查看filter表的FORWARD链规则列表。
#iptables -I FORWARD -s 192.168.1.0/24 -p tcp --dport 21 -j DROP
#iptables -t filter -L FORWARD
【例2】禁止192.168.1.0子网里所有的客户机使用Telnet协议连接远程计算机(即封闭TCP协议的23端口),然后查看filter表的FORWARD链规则列表。
#iptables -I FORWARD -s 192.168.1.0/24 -p tcp --dport 23 -j DROP
#iptables -t filter -L FORWARD
4、强制访问指定的站点
【例】强制所有的客户机访问210.21.118.68这台Web服务器,然后查看nat表的PREROUTING链规则列表。
表 -命令 匹配
#iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 80 操作(转换)
-j DNAT --to 210.21.118.68:80
#iptables -t nat -L PREROUTING
5、禁止客户机使用QQ
#iptables -I FORWARD -p tcp --dport 8000 -j DROP
#iptables -I FORWARD -p udp --dport 8000 -j DROP
#iptables -I FORWARD -d tcpconn.tencent.com -j DROP
#iptables -I FORWARD -d tcpconn2.tencent.com -j DROP
#iptables -I FORWARD -d tcpconn3.tencent.com -j DROP
#iptables -I FORWARD -d tcpconn4.tencent.com -j DROP
#iptables -I FORWARD -d http.tencent.com -j DROP
#iptables -I FORWARD -d http2.tencent.com -j DROP
6、禁止使用ICMP协议
【例】禁止Internet上的计算机通过ICMP协议ping到NAT服务器的ppp0接口,但允许内网的客户机通过ICMP协议ping的计算机,然后查看filter表的INPUT链规则列表。
#iptables -I INPUT -i ppp0 -p icmp -j DROP
#iptables -t filter -L INPUT
7、发布内部网络服务器
【例1】发布内网192.168.16.200主机的Web服务,Internet用户通过访问ppp0的IP地址即可访问该主机的Web服务。
#iptables -t nat -I PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to-destination 192.168.16.200:80
#iptables -t nat -L PREROUTING
【例2】发布内网192.168.16.100主机的终端服务(使用的是TCP协议的3389端口),Internet用户通过访问ppp0的IP地址访问该机的终端服务。
#iptables -t nat -I PREROUTING -i ppp0 -p tcp --dport 3389 -j DNAT --to-destination 192.168.1.100:3389
#iptables -t nat -L PREROUTING
8、智能DNS服务
【例】将所有从eth0接口进入的DNS请求都发送到IP地址为61.144.56.101这台服务器解析,然后查看nat表的PREROUTING链规则列表。
#iptables -t nat -I PREROUTING -i eth0 -p udp --dport 53 -j DNAT --to-destination 61.144.56.101:53
#iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 53 -j DNAT --to-destination 61.144.56.101:53
#iptables -t nat -L PREROUTING

1、安装iptables防火墙

如果没有安装iptables需要先安装,CentOS执行:


yum install iptables


Debian/Ubuntu执行:


apt-get install iptables



2、清除已有iptables规则


iptables -F
iptables -X
iptables -Z



3、开放指定的端口

#允许本地回环接口(即运行本机访问本机)


iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT


# 允许已建立的或相关连的通行


iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


#允许所有本机向外的访问


iptables -A OUTPUT -j ACCEPT


# 允许访问22端口


iptables -A INPUT -p tcp --dport 22 -j ACCEPT


#允许访问80端口


iptables -A INPUT -p tcp --dport 80 -j ACCEPT



#允许访问UDP 33433端口


iptables -A INPUT -p udp --dport 33433 -j ACCEPT


#允许FTP服务的21和20端口


iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT


#如果有其他端口的话,规则也类似,稍微修改上述语句就行

#禁止其他未允许的规则访问


iptables -A INPUT -j REJECT
iptables -A FORWARD -j REJECT



4、屏蔽IP


#如果只是想屏蔽IP的话“3、开放指定的端口”可以直接跳过。
#屏蔽单个IP的命令是
iptables -I INPUT -s 123.45.6.7 -j DROP
#封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP
#封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP
#封IP段即从123.45.6.1到123.45.6.254的命令是
iptables -I INPUT -s 123.45.6.0/24 -j DROP



5、查看已添加的iptables规则

iptables -L -n

v:显示详细信息,包括每条规则的匹配包数量和匹配字节数

x:在 v 的基础上,禁止自动单位换算(K、M) vps侦探

n:只显示IP地址和端口号,不将ip解析为域名


6、删除已添加的iptables规则

将所有iptables以序号标记显示,执行:

iptables -L -n --line-numbers

比如要删除INPUT里序号为8的规则,执行:

iptables -D INPUT 8


7、iptables的开机启动及规则保存

CentOS上可能会存在安装好iptables后,iptables并不开机自启动,可以执行一下:


chkconfig --level 345 iptables on


将其加入开机启动。

CentOS上可以执行:service iptables save 保存规则。

另外更需要注意的是Debian/Ubuntu上iptables是不会保存规则的。

需要按如下步骤进行,让网卡关闭是保存iptables规则,启动时加载iptables规则:

创建/etc/network/if-post-down.d/iptables 文件,添加如下内容:

#!/bin/bash

iptables-save > /etc/iptables.rules

执行:chmod +x /etc/network/if-post-down.d/iptables 添加执行权限。

创建/etc/network/if-pre-up.d/iptables 文件,添加如下内容:

#!/bin/bash

iptables-save < /etc/iptables.rules

执行:chmod +x /etc/network/if-pre-up.d/iptables 添加执行权限。

关于更多的iptables的使用方法可以执行:iptables --help或网上搜索一下iptables参数的说明。


来源:http://edu.58tech.com/20110514/1286.html

http://www.linuxso.com/linuxpeixun/38157.html



SNAT、DNAT和MASQUERADE的区别

SNAT是source network address translation的缩写,即源地址目标转换
比如,多个PC机使用ADSL路由器共享上网,每个PC机都配置了内网IP
PC机访问外部网络的时候,路由器将数据包的报头中的源地址替换成路由器的ip
当外部网络的服务器比如网站web服务器接到访问请求的时候
他的日志记录下来的是路由器的ip地址,而不是pc机的内网ip
这是因为,这个服务器收到的数据包的报头里边的“源地址”,已经被替换了
所以叫做SNAT,基于源地址的地址转换

  DNAT是destination network address translation的缩写
即目标网络地址转换
典型的应用是,有个web服务器放在内网配置内网ip,前端有个防火墙配置公网ip
互联网上的访问者使用公网ip来访问这个网站
当访问的时候,客户端发出一个数据包
这个数据包的报头里边,目标地址写的是防火墙的公网ip
防火墙会把这个数据包的报头改写一次,将目标地址改写成web服务器的内网ip
然后再把这个数据包发送到内网的web服务器上
这样,数据包就穿透了防火墙,并从公网ip变成了一个对内网地址的访问了
即DNAT,基于目标的网络地址转换

  MASQUERADE,地址伪装,在iptables中有着和SNAT相近的效果,但也有一些区别
但使用SNAT的时候,出口ip的地址范围可以是一个,也可以是多个,例如:
如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3的ip然后发出去
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3
如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3/192.168.5.4/192.168.5.5等几个ip然后发出去
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3-192.168.5.5
这就是SNAT的使用方法,即可以NAT成一个地址,也可以NAT成多个地址
但是,对于SNAT,不管是几个地址,必须明确的指定要SNAT的ip
假如当前系统用的是ADSL动态拨号方式,那么每次拨号,出口ip192.168.5.3都会改变
而且改变的幅度很大,不一定是192.168.5.3到192.168.5.5范围内的地址
这个时候如果按照现在的方式来配置iptables就会出现问题了
因为每次拨号后,服务器地址都会变化,而iptables规则内的ip是不会随着自动变化的
每次地址变化后都必须手工修改一次iptables,把规则里边的固定ip改成新的ip
这样是非常不好用的
MASQUERADE就是针对这种场景而设计的,他的作用是,从服务器的网卡上,自动获取当前ip地址来做NAT
比如下边的命令:
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
如此配置的话,不用指定SNAT的目标ip了
不管现在eth0的出口获得了怎样的动态ip,MASQUERADE会自动读取eth0现在的ip地址然后做SNAT出去
这样就实现了很好的动态SNAT地址转换



一、查看IP连接数

[root@localhost shell]# cat iptables-cc-ip
#!/bin/bash
num=100   //设置最高连接的值
IP=`netstat -an |grep ^tcp.*:80|egrep -v 'LISTEN|127.0.0.1'|awk -F"[ ]+|[:]" '{print $6}'|sort|uniq -c|sort -rn|awk '{if ($1>$num){print $2}}'`
for i in $IP
do
      echo $i
done

获得结果可以重定向一个文件里保存出来


二、查看SYN连接

[root@localhost shell]# cat iptables-cc-syn
#!/bin/bash
conn=`netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr |head -n20`//查找出前二十个连接最多的
for i in $conn
do
echo $i
done

同样,获得结果可以重定向一个文件里保存出来


三、查看访问日志

[root@localhost shell]# cat log-cc
#!/bin/bash
access=`cat /var/log/httpd/access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -n20`
for i in $access
do
    echo $i
done

不用说,获得结果可以重定向一个文件里保存出来


四、分析

        根据以上的结果看看哪个IP访问比较多(这里要注意,并非访问多的IP就是攻击的IP,有些也会正常访问,不注意分析的话会封了正常访问IP,所以还得跟后面两方面的因素一起考虑、排查),SYN连接数比较(一般SYN最多的就是攻击IP),访问日志记录最多,然后一个一个分析,最后,也是最重要的,要看些这些IP访问是否是正常的,这个根据日志可以看得出来(要耐心、细心查看)


五、分析后的动作

      排查出来的IP,要立刻封掉

      iptables -I INPUT -sIP(排查出来的IP)--dport80-j DROP
      service iptables save


六、总结

       DDOS和CC攻击就是拒绝服务和非法访问,让被攻击目标处理能力的海量数据包消耗可用系统,带宽资源,致使网络服务瘫痪的一种攻击手段,最好是使用CDN和黑洞防火墙来防,前者是带宽方面抗得起,后者是判断后引用这些流量到黑洞


文章中如有错误,欢迎大家留言指出!

你可能感兴趣的:(iptables)