iptables防火墙的使用


iptables 防火墙的使用

一、简介

iptables 是一个配置 Linux 内核防火墙的命令行工具,它基于内核的 netfilter 机制。iptables 可以检测、修改、转发、重定向和丢弃 IPv4 数据包。

netfilter

netfilter 是 Linux 内核的包过滤框架,它提供了一系列的钩子(Hook)供其他模块控制包的流动。这些钩子包括:

  • NF_IP_PRE_ROUTING:刚刚通过数据链路层解包进入网络层的数据包通过此钩子,它在路由之前处理
  • NF_IP_LOCAL_IN:经过路由查找后,送往本机(目的地址在本地)的包会通过此钩子
  • NF_IP_FORWARD:不是本地产生的并且目的地不是本地的包(即转发的包)会通过此钩子
  • NF_IP_LOCAL_OUT:所有本地生成的发往其他机器的包会通过该钩子
  • NF_IP_POST_ROUTING:在包就要离开本机之前会通过该钩子,它在路由之后处理

image.png

二、原理

表(Tables)

解释:相同规则的集合叫做 表(Tables)

iptables包含 5 张表(tables):

  1. raw 用于配置数据包,raw 中的数据包不会被系统跟踪。
  2. filter 是用于存放所有与防火墙相关操作的默认表。
  3. nat 用于 网络地址转换(例如:端口转发)。
  4. mangle 用于对特定数据包的修改(参考 损坏数据包)。
  5. security 用于 强制访问控制 网络规则

大部分情况仅需要使用filternat

链 (Chains)

表由链组成,链是一些按顺序排列的规则的列表。默认的 filter 表包含 INPUT, OUTPUT 和 FORWARD 3 条内建的链,这 3 条链作用于数据包过滤过程中的不同时间点,如下图所示。nat 表包含 PREROUTING, POSTROUTING 和 OUTPUT 链。
使用 iptables(8) 查看其他表中内建链的描述。
默认情况下,任何链中都没有规则。可以向链中添加自己想用的规则。链的默认规则通常设置为 ACCEPT,如果想确保任何包都不能通过规则集,那么可以重置为 DROP。默认的规则总是在一条链的最后生效,所以在默认规则生效前数据包需要通过所有存在的规则。
用户可以加入自己定义的链,从而使规则集更有效并且易于修改。

规则 (Rules)

根据指定的匹配条件来尝试匹配每个流经此处的报文,匹配成功,则由规则指定的动作来处理。

匹配条件

  • 基本匹配条件
  • 拓展匹配条件

处理动作

  • ACCEPT:允许数据包通过。
  • DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
  • REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
  • SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
  • MASQUERADE:是 SNAT 的一种特殊形式,适用于动态的、临时会变的 ip 上。
  • DNAT:目标地址转换。
  • REDIRECT:在本机做端口映射。
  • LOG:在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。
  • RETURN:防停止执行当前链的后续 rules,并返回到调用链中


图中可以看到如下

  • 有哪些类型的表,黄色的表示表
  • 有哪些类型的链,红色的表示链
  • 链的规则可以存放在哪些表中
  • 表的规则可以应用到哪些链中
  • 链中表的执行优先级

三、语法

iptables 命令的一般格式

iptables [-t 表] -命令 匹配 操作

-t 表

表选项用于指定命令应用于哪个 iptables 内置表。

命令

命令选项用于指定 iptables 的执行方式,包括插入规则,删除规则和添加规则,如下表所示

-P  --policy        <链名>  定义默认策略
-L  --list          <链名>  查看iptables规则列表
-A  --append        <链名>  在规则列表的最后增加1条规则
-I  --insert        <链名>  在指定的位置插入1条规则
-D  --delete        <链名>  从规则列表中删除1条规则
-R  --replace       <链名>  替换规则列表中的某条规则
-F  --flush         <链名>  删除表中所有规则
-Z  --zero          <链名>  将表中数据包计数器和流量计数器归零
-X  --delete-chain  <链名>  删除自定义链
-v  --verbose       <链名>  与-L他命令一起使用显示更多更详细的信息

匹配规则

匹配选项指定数据包与规则匹配所具有的特征,包括源地址,目的地址,传输协议和端口号,如下表所示

-i --in-interface    网络接口名>     指定数据包从哪个网络接口进入,
-o --out-interface   网络接口名>     指定数据包从哪个网络接口输出
-p ---proto          协议类型        指定数据包匹配的协议,如TCP、UDP和ICMP等
-s --source          源地址或子网>   指定数据包匹配的源地址
   --sport           源端口号>       指定数据包匹配的源端口号
   --dport           目的端口号>     指定数据包匹配的目的端口号
-m --match           匹配的模块      指定数据包规则所使用的过滤模块

动作

前面我们说过 iptables 处理动作除了 ACCEPT、REJECT、DROP、REDIRECT 、MASQUERADE 以外,还多出 LOG、ULOG、DNAT、RETURN、TOS、SNAT、MIRROR、QUEUE、TTL、MARK 等。我们只说明其中最常用的动作:

  • REJECT 拦阻该数据包,并返回数据包通知对方,可以返回的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(这个数据包包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。范例如下:
iptables -A  INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply
  • DROP 丢弃数据包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
  • REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。这个功能可以用来实作透明代理 或用来保护 web 服务器。例如:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8081
  • MASQUERADE 改写封包来源 IP 为防火墙的 IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则链(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000
  • LOG 将数据包相关信息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 配置文件,进行完此处理动作后,将会继续比对其它规则。例如:
iptables -A INPUT -p tcp -j LOG --log-prefix "input packet"
  • SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则炼(mangle:postrouting)。范例如下:
iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200
  • DNAT 改写数据包包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则链(filter:input 或 filter:forward)。范例如下:
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.10.1-192.168.10.10:80-100
  • MIRROR 镜像数据包,也就是将来源 IP 与目的地 IP 对调后,将数据包返回,进行完此处理动作后,将会中断过滤程序。
  • QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费用等。
  • RETURN 结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。
  • MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下:
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 22

其它参数说明

iptables [-t表名]  <链名> <动作>
-t table :指定设置的表:filter nat mangle  不指定默认为filter
COMMAND:定义如何对规则进行管理
chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,可以省略
CRETIRIA:指定匹配标准
-j ACTION :指定如何进行处理
COMMAND详解:
-P :设置默认策略(设定默认门是关着的还是开着的)
     iptables -P INPUT DROP 这就把默认规则给拒绝了
-F: FLASH,清空规则链
     iptables -t nat -F PREROUTING
     iptables -t nat -F 清空nat表的所有规则
-Z:清空链   iptables -Z :清空

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

-L 查看规则,下面包含子命令:
     -n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名。
     -v:显示详细信息
     --line-numbers : 显示规则的行号
CRETIRIA 详解:
1.通用匹配:源地址目标地址的匹配
     -s:指定作为源地址匹配,这里不能指定主机名称,必须是IP,地址可以取反,加一个“!”表示除了哪个IP之外
     -d:表示匹配目标地址
     -p:用于匹配协议的(这里的协议通常有3种,TCP/UDP/ICMP)
     -i eth0:从这块网卡流入的数据   (流入一般用在INPUT和PREROUTING上)
     -o eth0:从这块网卡流出的数据  (流出一般在OUTPUT和POSTROUTING上)
2.扩展匹配(隐含扩展:对协议的扩展 和显式扩展(-m))
     -p tcp :TCP协议的扩展
       --dport XX-XX:指定目标端口,不能指定多个非连续端口,只能指定单个端口
       --sport:指定源端口
       --tcp-fiags:TCP的标志位匹配(SYN,ACK,FIN,PSH,RST,URG)(使用相对较少)
       --tcpflags syn,ack,fin,rst syn  用于检测三次握手的第一次包,可简写为--syn
     -p udp:UDP协议的扩展  (与tcp相似)
     -p icmp:icmp数据报文的扩展
     -m multiport:表示启用多端口扩展  --dports 21,23,80
-j ACTION 详解:
     DROP:表示丢弃
     REJECT:明示拒绝
     ACCEPT:接受
     custom_chain:转向一个自定义的链
     MASQUERADE:源地址伪装
     REDIRECT:重定向:主要用于实现端口重定向
     RETURN:返回:在自定义链执行完毕后使用返回,来返回原规则链

四、实例

启动/停止/重启防火墙

service iptables stop
service iptables start
service iptables restart

systemctl stop iptables
systemctl start iptables
systemctl restart iptables

查看规则

列出默认表 filter 所有链上的规则

iptables -L

列出 nat 表中所有链上的规则

iptables -t nat -L

列出 nat 表中 PREROUTING 链上的规则

iptables -t nat -L PREROUTING

查看防火墙的状态

iptables -L -n -v --line-numbers

删除一条规则

将所有 iptables 以序号标记显示

iptables -L INPUT -n --line-numbers
iptables -L OUTPUT -n --line-numbers
iptables -L OUTPUT -n --line-numbers | less
iptables -L OUTPUT -n --line-numbers | grep 202.54.1.1

删除 INPUT 里序号为 8 的规则

iptables -D INPUT 8

允许特定规则

允许特定端口(TCP 22)

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

允许来自 192.168.0.4 的包

iptables -A INPUT -s 192.168.0.4 -j ACCEPT

允许现有连接或与现有连接关联的包

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

拦截特定流量

拦截来自特定 IP 地址 11.11.11.11 对本地服务全部流量

iptables -t filter -A INPUT -s 11.11.11.11 -j DROP

删除上一条拦截规则

iptables -t filter -D INPUT -s 11.11.11.11 -j DROP

封锁特定端口(TCP 445)

iptables -t filter -A INPUT -p tcp -sport 445 -j DROP

禁止 ICMP (ping)

iptables -t filter -A INPUT -p icmp --icmp-type echo-request -j REJECT ---reject-with icmp-host-prohibited

禁止从 80 端口发起新的 TCP 连接但允许 80 端口响应 TCP 连接

iptables -t filter -A OUTPUT -p tcp --dport 80 -m state --state NEW -j DROP

禁止所有其他包

iptables -P INPUT DROP
iptables -P FORWARD DROP

作为网关提供 NAT 服务

将来自 192.168.2.0/24 子网数据包源地址改写为 192.168.1.1

iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to-source 192.168.1.1

将来自 192.168.2.0/24 子网数据包源地址改写为防火墙地址

iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE

将对 192.168.1.1:80 的数据包发送到 192.168.1.11:80

iptables -t nat -A PREROUTING -d 192.168.1.1/24 --dport 80 -j DNAT --to-destination 192.168.1.11:80

将对本地 80 端口 的数据包重定向到 8080 端口

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

五、固化操作

配置文件

iptables 的配置文件: /etc/sysconfig/iptables

保存防火墙规则

iptables-save 是将规则追加到一个文件,主要是配合 iptables-restore 命令

iptables-save > /etc/sysconfig/iptables

加载防火墙规则

iptables-restore < /root/my.active.firewall.rules

文章作者: Truda
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Truda !
评论
  目录