Linux iptables完结篇

一直没有整明白iptables的功能及操作,也不清楚与firewall的关系与区别,考虑到未来自己仍然会从事it行业,那为啥不彻底整清楚了呢,遇到不会的知识可以暂时避开或了解个大概,但是如果超过3次遇到这个问题就不应该逃避了,而应该彻底搞清楚它,iptables我遇到过不少于5次的问题,今天打算彻底搞懂它,计划耗时2小时。

一、简介

iptables一般工作在OSI的二、三、四层,也不算是真正的防火墙,真正的防火墙是叫netfilter(位于内核空间),所以iptables可以理解为一个客户端代理,是一个命令行的工具,位于用户空间,配置iptables的过程其实是配置netfilter
Netfilter是Linux操作系统核心层内部的一个数据包处理模块,功能如下:

  • 网络地址转换Network Address Translat(NAT)
  • 数据包内容修改从定向
  • 数据库过滤

二、 iptables介绍

1、规则、链、表

iptables中由表、链、规则的概念,他们之间属于包含关系,从小到大介绍如下:

规则:

iptables是按照规则办事的,规则就是管理员预定义的条件,与判断的句式类似:if … do … 匹配的条件有:源地址、目的地址、源端口、目的端口、传输协议、服务类型。执行的操作有:

  • 放行(ACCEPT):允许数据包通过
  • 拒绝(REJECT):拒绝数据包通过,必要时会给发送一个响应的信息,客户端收到拒绝的消息。
  • 丢弃(DROP):直接丢弃数据包,不给任何回应信息。
  • 源地址转换(SNAT):解决内网用户用同一个公网地址上网的问题。
  • MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
  • DNAT:目的地址转换
  • REDIRECT:在本机做端口映射
  • LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给吓一跳规则,支队数据包进行记录不做其他操作,由下一跳规则去匹配。

拒绝和丢弃的区别:拒绝会有明确的提示,丢弃则没有,以ICMP为例
拒绝:iptables -A INPUT -p ICMP -j REJECT
当执行的操作是REJECT时,ping会提示无法连接到端口
丢弃:iptables -A INPUT -p ICMP -j DROP
当执行的操作是DROP时,ping没有反应最终会显示请求超时
注意:”INPUT”和“REJECT”必须大写,“ICMP”可以小写

链:

上面命令中的“INPUT”就是一个链,链相当于一个关卡,每个关卡里有多个规则,这些规则实际上在一条链上,每个经过这个关卡的报文都要将这条链上的所有规则都匹配一遍,符合条件的执行对应的动作。
共有五个链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
不同表的拥有不同链,但最多有5个(见表的介绍)
链
用户的访问拓扑图如下:
用户访问拓扑图
到本机某进程的报文:用户–>PREROUTING–>INPUT
由本机转发的报文:用户–>PREROUTING–>FORWARD–>POSTROUTING
由本机的某进程发出的报文(通常为响应):OUTPUT–>POSTROUTING

表:

将不同功能的链放到不同的表中进行管理,iptables共定义了4种表:

  • filter表:默认表,负责过滤功能
  • nat表:网络地址转换功能
  • mangle表:拆解报文,修改报文,重新封装
  • raw表:关闭nat表上启用的连接追踪机制

日常工作中主要是使用filter表和nat表,本节主要对此两个表进行描述
不同的表有不同的链:
表与链的关系

filter表:

和主机自身相关、负责防火墙(过滤本机流入、流出数据包)。是iptables默认使用的表、这个表定义了以下三个链:

INPUT负责过滤所有目标地址是主机(防火墙)地址的数据包、通俗的讲、就是过滤进入主机的数据包
FORWARD负责转发流经主机但不进入本机的数据包、起转发作用、和NAT表关系很大、后面会详细介绍
OUTPUT处理所有原地址是本机地址的数据包、通俗的讲就是处理从主机发出去的数据包。
nat表:

负责来源与目的IP地址和port的转换、和主机本身无关。一般用于局域网多人共享上网或者内网IP映射外网IP及不同端口转换服务等功能。Nat表的功能很重要、这个表定义了以下三个链:

OUTPUT与主机发出的数据包有关,在数据包路由之前改变主机产生的数据库的目的地址
PREROUTING在数据包刚到达防火墙时进行路由判断之前执行的规则,多用于将外部ip地址端口映射为内部ip地址及端口,相当于pat
POSTROUTING数据包离开防火墙时进行路由判断之后执行的规则,多用于局域网共享上网,把所有局域网地址转换为公网地址,相当于nat
mangle表:

负责修改数据包中特殊的路由标记,如TTL、TOS、MATK等,定义了所有的五个链:INPUT、FORWARD、OUTPUT、PREROUTING、POSTROUTING,作用与filter表和nat表中的链一样。

四个表的优先级为(从高到低):
raw>mangle>nat>filter

三、总结

表、链、规则的关系:
iptables中表、链及规则的关系
为便于理解,类比成房子:

Netfilter/iptables表(tables)链(chains)规则(policy)
一栋楼apartment衣柜摆放规则

四、日常操作

1、查看当前的策略

#查看filter表的规则有哪些
iptables -nvL --line
#--line 可以看到序号

#查看nat表的规则有哪些
iptables -t nat -nvL --line

2、配置端口转发策略

需求:使用docker安装jumpserver后,nginx对外提供的端口是8080,运行新的nginx镜像将80映射为80后,在服务器上可以看到80端口已经被监听了,但是本地和远程都访问不了,经查看两个nginx的docker容器参数发现位于不同的网段,重新运行nginx镜像使用jms_net的网络后虽然容器间网络可以互通但是外部仍然无法访问80端口,至今还未解决,所以想到一个折扣方案,使用iptables将所有访问80端口的流量转至8080端口

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

此时服务器使用netstat -tnlp 并没有开启80端口,但是远程可以正常访问,相当于远程用户可以同时访问80和8080,。
又产生一个新的想法,打算查看一下都有哪些请求访问了80被转发到了8080端口,类似于在路由器上查看show nat translations转换的记录
实现过程如下:
1、开启内核日志
vim /etc/rsyslog.conf

kern.*     /var/log/iptables.log

2、重启rsyslog

systemctl restart rsyslog

3、配置iptables的nat表:
使用以下脚本创建:

#!/bin/bash
for table in raw filter nat mangle
do
    for chain in PREROUTING OUTPUT FORWARD INPUT POSTROUTING
    do
        for port in 8080 80
        do
            iptables -t ${table} -A ${chain} -p tcp -m tcp --dport $port -j LOG --log-prefix "[debug]-${table}-${chain}:" --log-level 7 || true
            iptables -t ${table} -A ${chain} -p tcp -m tcp --sport $port -j LOG --log-prefix "[debug]-${table}-${chain}:" --log-level 7 || true
        done
    done
done

4、发起请求后查看/var/log/iptables.log,就能看到转换的记录

3、删除规则

iptables -t nat -nvL --line
#删除nat表中INPUT链中num为1的规则
iptables -t nat -D INPUT 1

#删除filter表中所有规则:
iptables -F  ##清楚所有规则
iptables -X  ##清楚用户自定的链
iptables -Z  ##链的计数器清零

#清楚nat表中的所有规则:
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z

其他的实例未来随着工作需求再逐步补充

参考内容:https://www.zsythink.net/archives/1199

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值