banner
NEWS LETTER

IPTABLES详解

Scroll down
Avatar
一根儿狗
I`m
  • Residence:
    JiNan
  • City:
    ShanDong
  • Age:
    25

08/12

10:00

一根儿狗

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
2
3
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
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443
其他文章
© 2022- 2022 · 一根儿狗
博客已萌萌哒运行: