记一次认真学习iptables(汇总)


一、通过什么方式管理你的iptables

1、通过iptables 自带的工具

# iptables 安装
yum -y install iptables
# iptables 自带  iptables 、iptables-save、iptables-restore等工具
iptables -F # 清空iptables
iptables-save > /etc/sysconfig/iptables # 将现有的iptables保存到指定文件
iptables-restore < /etc/sysconfig/iptables #将文件中的iptables还原到现有的iptables

2、通过服务的方式

# iptables-services 安装
yum -y install iptables-services
# 安装完后默认生成 /etc/sysconfig/iptables,默认配置如下
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

systemctl start iptables
systemctl enable iptables # 可以设置开机启动

3、文件说明

/etc/sysconfig/iptables 策略文件
/etc/sysconfig/iptables-config  配置文件

二、iptables 配置

我是比较喜欢用iptables 自带的工具进行管理。

1、规则说明

#使用filter表
*filter
#下面四条内容定义了内建的INPUT、FORWAARD、OUTPUT链,还创建了一个被称为RH-Firewall-1-INPUT 的新链
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0] 
#将所有流入的数据写入到日志文件中
-A INPUT -j LOG --log-level crit
#下面这条规则将添加到INPUT链上,所有发往INPUT链上的数据包将跳转到RH-Firewall-1 链上。
-A INPUT -j RH-Firewall-1-INPUT
#下面这条规则将添加到FORWARD链上,所有发往FORWARD链上的数据包将跳转到RH-Firewall-1 链上。
-A FORWARD -j RH-Firewall-1-INPUT
#下面这条规则将被添加到RH-Firewall-1-input链。它可以匹配所有的数据包,其中流入接口(-i)是一个环路接口(lo)。
#匹配这条规则的数据包将全部通过(ACCEPT),不会再使用别的规则来和它们进行比较
-A RH-Firewall-1-INPUT -i lo -j ACCEPT

2、常用命令

-A 追加规则-->iptables -A INPUT
-D 删除规则-->iptables -D INPUT 1(编号)
-R 修改规则-->iptables -R INPUT 1 -s 192.168.12.0 -j DROP 取代现行规则,顺序不变(1是位置)
-I 插入规则-->iptables -I INPUT 1 --dport 80 -j ACCEPT 插入一条规则,原本位置上的规则将会往后移动一个顺位
-L 查看规则-->iptables -L INPUT 列出规则链中的所有规则
-N 新的规则-->iptables -N allowed 定义新的规则

3、通用参数:

-p 协议  例:iptables -A INPUT -p tcp
-s源地址 例:iptables -A INPUT -s 192.168.1.1
-d目的地址 例:iptables -A INPUT -d 192.168.12.1
--sport源端口 例:iptables -A INPUT -p tcp --sport 22
--dport目的端口 例:iptables -A INPUT -p tcp --dport 22
-i指定入口网卡 例:iptables -A INPUT -i eth0  可以是回环接口lo,可以是其他接口eth0、eth1、em1、em2等
-o指定出口网卡 例:iptables -A FORWARD -o eth0

-j (jump)指定要进行的处理动作
##常用的ACTION(开始):
DROP:丢弃
REJECT:明示拒绝
ACCEPT:接受
SNAT:基于原地址的转换
--to-source指定原地址
    比如我们现在要将所有192.168.10.0网段的IP在经过的时候全都转换成172.16.100.1这个假设出来的外网地址:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1(外网有效ip)
这样,只要是来自本地网络的试图通过网卡访问网络的,都会被统统转换成172.16.100.1这个IP.
MASQUERADE: (动态伪装)--家用带宽获取的外网ip,就是用到了动态伪装
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
DNAT:目标地址转换
--to-destination-指定目标地址
iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --to-destination 172.16.100.2
访问192.168.10.18的80端口转换到100.2上
MASQUERADE:源地址伪装
REDIRECT:重定向:主要用于实现端口重定向
MARK:打防火墙标记的
RETURN:返回 在自定义链执行完毕后使用返回,来返回原规则链。

##常用的ACTION(结束):

4、链和表的关系

(chain)
每个表都有自己的一组内置链,可以对链进行自定义,这样就可以建立一组规则,
filter表中的input、output和forward链

5、匹配(match)

每个iptables规则都包含一组匹配以及一个目标,iptables匹配指的是数据包必须匹配的条件,只有当
数据包满足所有的匹配条件时,iptables才能根据由该规则的目标所指定的动作来处理该数据包
匹配都在iptable的命令行中指定
source--匹配源ip地址或网络
destination (-d)--匹配目标ip地址或网络
protocol (-p)--匹配ip值
in-interface (-i)--流入接口(例如,eth0)
out-interface (-o)--流出接口
state--匹配一组连接状态
string--匹配应用层数据字节序列
comment--在内核内存中为一个规则关联多达256个字节的注释数据

6、目标(target)

iptables支持一组目标,用于数据包匹配一条规则时触发一个动作
ACCEPT--允许数据包通过
DROP--丢弃数据包,不对该数据包做进一步的处理,对接收栈而言,就好像该数据包从来没有被接收一样
LOG--将数据包信息记录到syslog
REJECT--丢弃数据包,同时发送适当的响应报文(针对TCP连接的TCP重要数据包或针对UDP数据包的ICMP端口不可达消息)
RETURN--在调用链中继续处理数据包

7、链管理命令(这都是立即生效的)

-P :设置默认策略的(设定默认门是关着的还是开着的)
    默认策略一般只有两种
    iptables -P INPUT (DROP|ACCEPT)
    默认是关的/默认是开的
    比如:
    iptables -P INPUT DROP
这就把默认规则给拒绝了。并且没有定义哪个动作,所以关于外界连接的所有规则包括Xshell连接之类的,远程连接都被拒绝了
-F: FLASH,清空规则链的(注意每个链的管理权限)
    iptables -t nat -F PREROUTING
    iptables -t nat -F 清空nat表的所有链
    -N:NEW 支持用户新建一个链
    iptables -N inbound_tcp_web 表示附在tcp表上用于检查web的。
-X: 用于删除用户自定义的空链
    使用方法跟-N相同,但是在删除之前必须要将里面的链给清空昂了
-E:用来Rename chain主要是用来给用户自定义的链重命名
    -E oldname newname
-Z:清空链,及链中默认规则的计数器的(有两个计数器,被匹配到多少个数据包,多少个字节)
    iptables -Z :清空

8、规则管理命令

-A:追加,在当前链的最后新增一个规则
-I num : 插入,把当前规则插入为第几条。
   -I 3 :插入为第三条
-R num:Replays替换/修改第几条规则
   格式:iptables -R 3 …………
-D num:删除,明确指定删除第几条规则

9、查看管理命令 “-L”

附加子命令
-n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名。
-v:显示详细信息
-vv
-vvv :越多越详细
-x:在计数器上显示精确值,不做单位换算
--line-numbers : 显示规则的行号
-t nat:显示所有的关卡的信息

10、扩展匹配

10.1隐含扩展:对协议的扩展

-p tcp :TCP协议的扩展。一般有三种扩展
--dport XX-XX:指定目标端口,不能指定多个非连续端口,只能指定单个端口,比如
--dport 21  或者 --dport 21-23 (此时表示21,22,23)
--sport:指定源端口
--tcp-fiags:TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)
    对于它,一般要跟两个参数:
    1.检查的标志位
    2.必须为1的标志位
    --tcpflags syn,ack,fin,rst syn   =    --syn
    表示检查这4个位,这4个位中syn必须为1,其他的必须为0。所以这个意思就是用于检测三次握手的第一次包的。对于这种专门匹配第一包的SYN为1的包,还有一种简写方式,叫做--syn
-p udp:UDP协议的扩展
    --dport
    --sport
-p icmp:icmp数据报文的扩展
    --icmp-type:
    echo-request(请求回显),一般用8 来表示
    所以 --icmp-type 8 匹配请求回显数据包
    echo-reply (响应的数据包)一般用0来表示

10.2显式扩展(-m)

扩展各种模块
  -m multiport:表示启用多端口扩展
  之后我们就可以启用比如 --dports 21,23,80

三、使用技巧

##anti-spoofing rules
$INI_NET=192.168.10.0/24
$IPTABLES -A INPUT -i eth1 -s ! $INI_NET -j LOG --log-prefix "SPOOFED PKT"
$IPTABLES -A INPUT -i eth1 -s ! $INT_NET -j DROP