前言:
iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫netfilter
一、iptables整体图
所以,根据上图,我们能够想象出某些常用场景中,报文的流向:
到本机某进程的报文:PREROUTING –> INPUT
由本机转发的报文:PREROUTING –> FORWARD –> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT –> POSTROUTING
二、表和链
一共有4张表5张链
每个”链”中的规则都存在于哪些”表”中。
PREROUTING 的规则可以存在于:raw表,mangle表,nat表。
INPUT 的规则可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)。
FORWARD 的规则可以存在于:mangle表,filter表。
OUTPUT 的规则可以存在于:raw表mangle表,nat表,filter表。
POSTROUTING 的规则可以存在于:mangle表,nat表。
表(功能)<–> 链(钩子):
raw 表中的规则可以被哪些链使用:PREROUTING,OUTPUT
mangle 表中的规则可以被哪些链使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat 表中的规则可以被哪些链使用:PREROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有)
filter 表中的规则可以被哪些链使用:INPUT,FORWARD,OUTPUT
三、常用规则
filter:常用三个链:
INPUT(policy Accept)
FORWARD(policy DROP)
OUPUT(policy Accept)
1、查看filter表所有链
iptables -t filter -L -n
-t:指定表,filter,filter表为默认表,可不写
-L:列出
-n:添加行号
2、添加规则
iptables -t filter -A INPUT -j DROP -p tcp --dport 8081
-j DROP: 将表丢弃 -- dport: 指定8081端口 - p:指定TCP 协议
3、删除第一条规则
iptables -t filter -D INPUT 1
4、FORWARD
iptables -t filter -I FORWARD -j ACCEPT
5、OUTPUT
将发往192.168.0.144的TCP包全部丢弃
iptables -t filter -A OUTPUT -j DROP -p tcp -d 192.168.0.144
开放18086端口
iptables -I INPUT -p tcp --dport 18080 -j ACCEPT
6、REJECT 拒绝
例:拒绝来自85主机的tcp类型的请求
iptables -t filter -I INPUT -s 192.168.2.85 -d 192.168.2.93 -p tcp -j REJECT
7、ACCEPT 允许
-s: 匹配源地址 # 源 IP,可以有多个,使用逗号隔开,有多少个地址就有多少条规则
-d:匹配目的地址 目的 IP,可以有多个,使用逗号隔开,有多少个地址就有多少条规则
-i:匹配入站网卡地址
#以下两行允许某些调用 localhost 的应用访问
iptables -A INPUT -i lo -j ACCEPT #规则1 iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #规则2
#以下两行分别允许所有来源访问 TCP 80,443 端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #规则5 iptables -A INPUT -p tcp --dport 443 -j ACCEPT #规则6
四、增删改查
查找:
1.INPUT——进来的数据包应用此规则链中的策略
2.OUTPUT——外出的数据包应用此规则链中的策略
iptables -t nat -nvL OUTPUT //查找nat表中的出去的规则
iptables -A INPUT -i lo -j ACCEPT 允许来自于lo接口的数据包
iptables -A OUTPUT -o lo -j ACCEPT 允许向lo接口发送数据包
2、增加 append
命令语法:iptables -t 表名 -A 链名 匹配条件 -j 动作 示例:iptables -t filter -A INPUT -s 192.168.1.146 -j DROP
3、删除
1、 具体匹配规则删除
命令语法:iptables -t 表名 -D 链名 匹配条件 -j 动作 示例:iptables -t filter -D INPUT -s 192.168.1.146 -j DROP
2、 按--line按删除规则,-D表示删除对应链中的规则
命令语法:iptables -t 表名 -D 链名 规则序号 示例:iptables -t filter -D INPUT 3
五、NAT常用规则
NAT表三个链:PREROUTING,POSTROUTING,OUTPUT
1、利用iptables将目的地址为192.168.1.189的80端口的数据包更改目的地址为内网机器的IP1.1.1.2,目的端口为80.
iptables -t nat -A PREROUTING -d 192.168.1.189 -p tcp --dport 80 -j DNAT --to-destination 1.1.1.2:80 iptables -t nat -A PREROUTING -d 192.168.1.189 -j DNAT --to-destination 1.1.1.2 将所有流量转发到内网主机
2、# 配置源地址转换 SNAT
#将 192.168.2.0/24 转换成 192.168.1.63 iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to 192.168.1.63 #规则11
3、# 配置目的地址转换 DNAT
#将 192.168.1.63 的 80 端口请求转发到 192.168.2.2 的 80 端口 iptables -t nat -A PREROUTING -d 192.168.1.63 -p tcp --dport 80 -j DNAT --to 192.168.2.2:80 #规则12
4、列出所有规则
iptables -t nat -L
5、目的地址转换
例子:访问本机的数据包,如果目的端口是7788,则转到192.168.0.11的7799端口
iptables -t nat -A PREROUTING -P tcp --dport 7788 -j DNAT --to 192.168.0.11:7799
6、源地址转换
例子:发往192.168.0.11的7799端口的数据包SNAT到本机
iptables -t nat -A Postrouting -p tcp -d 192.168.0.11 --dport 7799 -j SNAT --to 192.168.0.12