IPTABLES详解
iptables 是 Linux 内核集成的防火墙系统, 几乎所有 Linux 发行版都会内置 iptables。
Linux防火墙主要包括两个部分:
一部分是 netfilter ,一部分是 iptables 。
很多人知道iptables却不知道netfilter,其实iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables
。真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构。
关系图解:
Netfileter是表(tables)的容器
表(tables)是链的容器、表属于Netfileter
链(chains)是规则(Policys)的容器、链属于表
规则(policy)属于链(chains)
默认 Iptables 防火墙有 4 个表,优先级从高到低:
- raw 表(实现数据包跟踪功能)
- mangle 表(修改数据包的 TOS、TTL 等信息)
- nat 表(实现地址转换功能)
- filter 表(实现过滤功能)
默认使用filter表,raw基本用不上,mangle也不常用
每个表中又有多个数据链,以下是每个表中的默认链:
表 | 链 |
---|---|
filter 表 | INPUT 链(入站数据过滤)、FORWARD 链(转发数据过滤)、OUTPUT 链(出站数据过滤) |
nat 表 | PREROUTING 链、POSTROUTING 链、OUTPUT 链 |
mangle表 | PREROUTING 链、POSTROUTING 链、INPUT 链、OUTPUT 链、FORWARD 链 |
raw 表 | OUTPUT 链、PREROUTING 链 |
规则链说明:
PREROUTING: 从网络接口(网卡)接收来的数据包首先会经过 PREROUTING 链,经过 raw、mangle、 nat 表中规则的处理然后进行路由判断。
若数据包的目的地址为本机则会进入INPUT链
若数据包的目的地址为其它地址则进入FORWARD链进行转发
INPUT: 处理目标为本机的数据包, 经过 mangle、filter 表中规则的处理然后发给 nginx、mysql等上层进程处理
FORWARD: 处理转发的数据包,经过 mangle、 filter 表中规则处理后进入POSTROUTING链
OUTPUT: 处理本地进程发出的数据包, 经过 raw、mangle,、nat、 filter 表中规则的处理然后进入POSTROUTING链
POSTROUTING: 处理来自 FORWARD 和 OUTPUT 链的数据包并发送给网络接口发出,可在 raw、mangle、nat 表中配置规则
再重复一遍!!!
INPUT——进来的数据包应用此规则链中的策略
OUTPUT——外出的数据包应用此规则链中的策略
FORWARD——转发数据包时应用此规则链中的策略
PREROUTING——对数据包作路由选择前应用此链中的规则
(所有的数据包进来的时侯都先由这个链处理)
- POSTROUTING——对数据包作路由选择后应用此链中的规则
(所有的数据包出去的时侯都先由这个链处理)
使用场景:
- 入站数据流: 网络接口 -> PREROUTING -> INPUT -> 本地
- 转发数据流: 网络接口 -> PREROUTING -> FORWARD -> POSTROUTING -> 网络接口
- 出站数据流: 本地 -> OUTPUT -> POSTROUTING -> 网络接口
iptables常用动作:
ACCEPT 允许数据包通过
DROP 直接丢弃数据包,不给任何回应信息
REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息。
保存规则:
iptables 命令修改后规则只存在于内存中, 使用service iptables save
保存规则到配置文件。
默认配置文件地址一般为/etc/sysconfig/iptables
。
iptables-save:
将 netfilter 内核模块中的规则导出到标准输出。
我们可以使用iptables-save
查看所有规则, 或将其备份到文件中。
iptables-save 命令执行读取操作,不会更改 iptables 配置。
iptables-save -t <table>
仅导出指定表的内容。
常用命令参数:
参数 | |
---|---|
-L | 列出(list)指定链中所有的规则进行查看 |
-A | 在指定链的末尾添加(append)一条新的规则 |
-I | 在指定链中插入(insert)一条新的规则,默认在第一行添加 |
-D | 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除 |
-F | 清空(flush) |
-N | 新建(new-chain)一条用户自己定义的规则链 |
-P | 设置指定链的默认策略(policy) |
-v | 使用数字形式(numeric)显示输出结果 |
-n | 查看规则表详细信息(verbose)的信息 |
-p | 协议(tcp/udp/icmp)iptables -A INPUT -p tcp |
-s | 匹配原地址,加” ! “表示除这个IP外 iptables -A INPUT -s 1.1.1.1 |
-d | 匹配目的地址 iptables -A INPUT -d 1.1.1.1 |
–sport | 匹配源端口流入的数据iptables -A INPUT -p tcp –sport 80 |
–dport | 匹配目的端口流出的数据 iptables -A INPUT -p tcp –dport 80 |
-i | 匹配入口网卡流入的数据iptables -A INPUT -i eth1 |
-o | 匹配出口网卡流出的数据iptables -A FORWARD -o eth1 |
-j | 要进行的处理动作:DROP(丢弃)、REJECT(拒绝)、ACCEPT(接受)、SANT(基于原地址的转换) 、MASQUERADE (类似动态源地址转换)iptable -A FORWARD -s 192.168.120.0 -j DROP |
-t | 表名(raw、mangle、nat、filter) iptables -t nat |
–to-source | 指定SANT转换后的地址iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SANT –to-source 10.0.0.1 |
-m state –state | 针对不同数据包状态进行动作执行INVLID:不可用的。数据包不能被识别。ESTABLISHED:已经建立了连接的NEW:这个包已经开始新连接了。RELATED:这个包开始了一个新连接。并且和已经存在的连接已经有关联。 |
示例规则:
列出默认表 filter 所有链上的规则。
iptables -nvL
列出 nat 表中所有链上的规则
iptables -t nat -nvL
删除所有现有规则
iptables -F
设置默认的 chain 策略
iptables -P INPUT DROP
阻止某个特定的 IP 地址
BLOCK_THIS_IP=”x.x.x.x”iptables -A INPUT -s "$BLOCK_THIS_IP" -j DROP
允许全部进来的SSH
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
允许指定ip访问数据库服务
iptables –A INPUT –s 1.1.1.1 –p tcp --dport 3306 –j ACCEPT
允许从外部向内部 Ping
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
NAT服务:
- 将来自2.2.2.2/24子网数据包源地址改写为1.1.1.1
iptables -t nat -A POSTROUTING -s 2.2.2.2/24 -j SNAT --to-source 1.1.1.1
- 将对2.2.2.2:80的数据包发送到 1.1.1.1:80
iptables -t nat -A PREROUTING -d 2.2.2.2/24 --dport 80 -j DNAT --to-destination 1.1.1.1:80
- 将对本地80端口的数据包重定向到8080
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
对进来的流量做负载均衡
【暂不了解,从未用过】
1 | iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443 |