iptables笔记

简介:

iptables的前身叫ipfirewall (内核1.x时代,当内核发展到2.x系列的时候,软件更名为ipchains,现在更名iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。

工作在用户空间中,定义规则的工具,本身并不算是防火墙。它们定义的规则,让在内核空间当中的netfilter来读取,并且实现让防火墙工作。

内核空间中共有5个位置,用以执行用户空间的规则:

1.内核空间中:从一个网络接口进来,到另一个网络接口去的

2.数据包从内核流入用户空间的

3.数据包从用户空间流出的

4.进入/离开本机的外网接口

5.进入/离开本机的内网接口

这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链:

PREROUTING (路由前):

    在进入 IP 路由之前触发,就意味着只要接收到的数据包,无论是否真的发往本机,也都会触发这个钩子。它一般是用于目标网络地址转换(Destination NAT,DNAT)。

INPUT (数据包流入口):

    报文经过 IP 路由后,如果确定是发往本机的,将会触发这个钩子,它一般用于加工发往本地进程的数据包。

FORWARD (转发管卡):

    报文经过 IP 路由后,如果确定不是发往本机的,将会触发这个钩子,它一般用于处理转发到其他机器的数据包。

OUTPUT (数据包出口):

    从本机程序发出的数据包,在经过 IP 路由前,将会触发这个钩子,它一般用于加工本地进程的输出数据包。

POSTROUTIN (路由后):

    从本机网卡出去的数据包,无论是本机的程序所发出的,还是由本机转发给其他机器的,都会触发这个钩子,它一般是用于源网络地址转换(Source NAT,SNAT)

将使用场景和功能类似的规则组合在一起,通称为表:(security表不常用,所以一般都说4表5链)

raw表:

        用于去除数据包上的连接追踪机制(Connection Tracking)。

mangle表:

        修改报文原数据,修改数据包的报文头信息,比如服务类型(Type Of Service,ToS)、生存周期(Time to Live,TTL)。

nat表:

        定义地址转换的,用于修改数据包的源或者目的地址等信息,典型的应用是网络地址转换(Network Address Translation)。

filter表:

        定义允许或者不允许的,用于对数据包进行过滤,控制到达某条链上的数据包是继续放行、直接丢弃或拒绝(ACCEPT、DROP、REJECT),典型的应用是防火墙。

security表:

        用于在数据包上应用SELinux,这张表并不常用

表优先级:raw→mangle→nat→filter→security

其中

raw表 可作用在:PREROUTING、OUTPUT链

mangle表 可作用在:PREROUTING、FORWARD、INPUT、OUTPUT、POSTROUTING

nat表需要分情况:

        SNAT 可作用在: INPUT、POSTROUTING

        DNAT 可作用在: OUTPUT、PREROUTING

filter表 可作用在:INPUT、FORWARD、OUTPUT

写法:

格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION

其中:

-t table :filter nat mangle等

COMMAND chain:定义如何对规则进行管理

-n 不进行反向解析,直接使用IP

-L 列出规则

    iptables -t filter -nL

-A 追加

    iptables -t filter -A INPUT -j ACCEPT

-I 插入

    iptables -t filter -I OUTPUT 3 -j ACCEPT 插入后作为第三条规则

-D 删除

    iptables -t filter -D INPUT 3 删除第三条

-R 替换

    iptables -t filter -R INPUT 3 -p tcp --dport 22 -j ACCEPT 将第3条规则替换成接下来的规则

-S 打印

    iptables -t filter -S [OUTPUT] 打印OUTPUT的链

-F 清空

    iptables -t filter -F [OUTPUT] 清空OUTPUT链的规则,如果不加链,则并清空表的规则

-Z 清空并置零

    iptables -t filter -Z [INPUT] 清空规则并将统计计数置零

-N 创建自定义链

    iptables -t filter -N docker-user

-X 删除自定义链

    iptables -t filter -X docker-user 要求先清空规则

-P 设置默认规则

    iptables -t filter -P INPUT ACCEPT

CRETIRIA:指定匹配标准

根据IP地址匹配:-s xxx.xxx.xxx.xxx/xx -d xxx.xxx.xxx.xxx/xx

根据端口匹配:-p tcp --dport 80 --sport 8888

根据协议匹配:-p icmp/http/tcp/udp

根据进出网口:-i ethX -o ethX

-j ACTION :指定如何进行处理,匹配到规则之后,需要做什么动作

DROP:

        直接将数据包丢弃。

REJECT:

        跟DROP类似,但会给请求方返回一些拒绝信息,给客户端返回 Connection Refused 或 Destination Unreachable 报文。

RETURN:

        跳出当前链,该链里后续的规则不再执行。一般用以自定义链

ACCEPT:

        同意数据包通过,继续执行后续的规则。

JUMP:

        跳转到其他用户自定义的链继续执行。

REDIRECT:

        在本机做端口映射。

        iptables -t nat -A PREROUTING -p tcp --dport 4444 -j REDIRECT --to-ports 6666

MASQUERADE:

        地址伪装,自动用修改源或目标的 IP 地址来做 NAT。

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

LOG :

        跟RETURN不同,LOG只是记录日志,并不会改变数据包的处理流程或导致数据包跳出当前链,系统日志路径为:/var/log/syslog or /var/log/messages

        iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH connection: "

-m 显示扩展

multiport 模块 :可以在一条规则中匹配多端口,指定多个端口用逗号分隔,连续端口用冒号

iptables -t filter -A INPUT -p TCP -m multiport --dports 22,80,443 -j ACCEPT 

iprange 模块可以指定一段连续ip地址范围:

iptables -t filter -A INPUT -p TCP -m iprange --src-range 192.168.15.1-192.168.15.10 -j ACCEPT 

string 模块:匹配数据包内容

    数据包中包含Hellworld 的数据不允许通过

iptables -t filter -A INPUT -p TCP -m string --string "Hellworld" --alog kmp -j DROP

time 模块:可以指定可访问的时间

    每天1 到 3 时之间不允许访问

iptables -t filter -A INPUT -p TCP -m time --timestart 1:00 --timestop 3:00 -j DROP

icmp 模块:可以限制icmp的包类型

iptables -t filter -A INPUT -p icmp -m icmp --icmp-type "echo-request" -j DROP

connlimit 模块:可以限制同时连接数

iptables -t filter -A INPUT -p TCP --dport 22 -m connlimit --connlimit-above 2 -j DROP

limit 模块:可以限制速率

    每秒限制333个连接

   

iptables -t filter -A INPUt -p TCP -m limit 333/s -j ACCEPT

    每分钟只允许 5 个新的连接尝试,防止暴力破解攻击   

iptables -A INPUT -p tcp --dport 22 -m limit --limit 5/min -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

示例:

本地端口转发:

        通过PREROUTING链,将外网访问4444端口转发到本机6666端口,此时本机访问4444并不进行转发

iptables -t nat -A PREROUTING -p tcp --dport 4444 -j REDIRECT --to-ports 6666

通过OUTPUT链,将本机访问4444端口转发到本机6666端口,此时外网访问4444并不进行转发

iptables -t nat -A OUTPUT -p tcp --dport 4444 -j REDIRECT --to-ports 6666

分流:通过PREROUTING链,将192.168.10.0/24网段访问4444端口的包转发到本机6666端口,其他网段则正常访问4444端口

iptables -t nat -A PREROUTING -p tcp -s 192.168.10.0/24 --dport 4444 -j REDIRECT --to-ports 6666

远程端口转发

1.开启Linux内核的转发功能,编辑 /etc/sysctl.conf文件

将net.ipv4.ip_forward = 0

修改为:net.ipv4.ip_forward = 1

2.修改完成后执行:

sysctl -p 使配置修改生效

DNAT模式:

        是用来做目的网络地址转换, 可以做某种类型地负载平衡。只能用在nat表的PREROUTING和OUTPUT链,并且有一个--to-destination选项指定要写入IP头的地址,可以是一个ip范围192.168.10.141-192.168.10.151

SNAT模式:

        用来源网络地址转换的,就是重写包的源IP地址。如果直接转发包的话,网络响应包上就不知道往哪儿发送应答,所以需要改为防火墙的地址。只能用在nat表的POSTROUTING链,且有一个--to-source选项

1、单独的地址。

2、一段连续的地址,如194.236.50.155-194.236.50.160,这样可以实现负载平衡。

iptables -t nat -A PREROUTING --dst 192.168.10.142 -p tcp --dport 4444 -j DNAT --to-destination 192.168.10.6:6666iptables -t nat -A POSTROUTING --dst 192.168.10.6 -p tcp --dport 6666 -j SNAT --to-source 192.168.10.142

MASQUERADE模式:

        和SNAT模式作用一样,区别就是它不需要指定--to-source ,而是动态获取IP地址的连接的。比如,拨号上网、DHCP连接时我们ip是会变的。只能用于nat表的POSTROUTING链 ,有一个非必须--to-ports选项

iptables -t nat -A POSTROUTING --dst 192.168.10.6 -p tcp --dport 6666 -j MASQUERADEiptables -t nat -A PREROUTING --source 172.16.250.1 -p tcp --dport 4444 -j DNAT --to-destination 172.16.250.3:22iptables -t nat -A PREROUTING --dst 192.168.171.139 -p tcp --dport 5555 -j DNAT --to-destination 192.168.171.1:9999iptables -t nat -A POSTROUTING --dst 172.16.250.3 -p tcp --dport 22 -j MASQUERADEiptables -t nat -A POSTROUTING --dst 192.168.171.1 -p tcp --dport 9999 -j SNAT --to-source 192.168.171.139

自定义链的使用

定义一个名为ssh-rules的链来管理ssh登录的一些规则:

iptables -t filter -N ssh-rules1

在这个链中添加具体的规则:

iptables -t filter -A ssh-rules -s 18.130.0.0/16 -j ACCEPT
iptables -t filter -A ssh-rules -s 18.11.0.0/16 -j ACCEPT
iptables -t filter -A ssh-rules -j DROP1

然后将该链作为一个规则出口,挂在到iptable内置的链上:

iptables -A INPUT -p tcp -m tcp --dport 22 -j ssh-rules

删除自定义链,需要先清空规则,然后再删除:

iptables -t filter -F ssh-rules
iptables -t filter -X ssh-rules

保存:

iptables-save > /etc/iptables.rules

恢复:

iptables-restore < /etc/iptables.rules



 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/774353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用Docker轻松构建和管理应用程序(二)

上一篇文章介绍了 Docker 基本概念&#xff0c;其中镜像、容器和 Dockerfile 。我们使用 Dockerfile 定义镜像&#xff0c;依赖镜像来运行容器&#xff0c;因此 Dockerfile 是镜像和容器的关键&#xff0c;Dockerfile 可以非常容易的定义镜像内容&#xff0c;同时在我们后期的微…

JDK8中ArrayList扩容机制

前言 这是基于JDK8的源码分析&#xff0c;在JDK6之前以及JDK11之后细节均有变动&#xff01;&#xff01; 首先来看ArrayList的构造方法 public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Seriali…

VUE3——Proxy API 与VUE2——defineProperty API区别

一、Object.defineProperty 定义&#xff1a;Object.defineProperty() 方法会直接在一个对象上定义一个新属性&#xff0c;或者修改一个对象的现有属性&#xff0c;并返回此对象 为什么能实现响应式 通过defineProperty 两个属性&#xff0c;get及set get 属性的 getter 函…

LeetCode刷题---查询近30天活跃用户数

1.给出满足的条件&#xff0c;截止至2019-07-27的近30天 activity_date BETWEEN DATE_ADD(2019-07-27,INTERVAL -29 day) and 2019-07-27这里使用了Between and 函数和 Date_add函数 2.按照日期分组&#xff0c;统计活跃用户个数 select activity_date day,count(distinct(us…

Python学习之-基础语法

第1关&#xff1a;行与缩进 任务描述 本关任务&#xff1a;改正代码中不正确的缩进&#xff0c;使其能够正常编译&#xff0c;并输出正确的结果。 编程要求 根据提示&#xff0c;改正右侧编辑器中代码的缩进错误&#xff0c;使其能够正确运行&#xff0c;并输出结果。 测试说明…

AcWing 1215. 小朋友排队 (树状数组)

n n n 个小朋友站成一排。 现在要把他们按身高从低到高的顺序排列&#xff0c;但是每次只能交换位置相邻的两个小朋友。 每个小朋友都有一个不高兴的程度。 开始的时候&#xff0c;所有小朋友的不高兴程度都是 0 0 0。 如果某个小朋友第一次被要求交换&#xff0c;则他的不…

蓝桥杯的数论总结

声明 我只是把数论相关的东西放在了一起&#xff0c;会有自己的理解&#xff0c;所以会有错误哈&#xff0c;欢迎在评论区中指出&#xff0c;另外有啥看不懂的也可以在评论区留言&#xff0c;我看到后就回你 质数 暴力 质数一般都是奇数&#xff0c;除了2小于2的不用考虑了…

Elasticsearch优化

集群配置 1、调整副本数&#xff1a;考虑数据的可用性和读取性能&#xff0c;合理配置分片的副本数。 2、合理配置分片大小(分片的合理容量&#xff1a;10GB-50GB)&#xff1a;避免分片过大&#xff0c;以确保更好的性能和均衡的负载。 3、监控集群状态&#xff1a;使用监控工…

mysql服务

任务描述:请安装mysql服务,建立数据表。 配置linux2为mysql服务器,创建数据库用户xiao,在任意机器上对所有数据库有完全权限。 创建数据库userdb;在库中创建表userinfo,表结构如下: 字段名 数据类型 主键

vue3+threejs新手从零开发卡牌游戏(十六):初始化对方手牌

添加对方手牌区时注意位置调整&#xff0c;以及手牌应该是背面朝上&#xff0c;加个rotateX翻转即可&#xff0c;其他代码和p1.vue代码一致&#xff0c;game/hand/p2.vue代码如下&#xff1a; <template><div></div> </template><script setup lan…

STL的基本概念

一、STL的诞生 长久以来&#xff0c;软件界一直希望建立一种可重复利用的东西 C的面向对象和泛型编程思想&#xff0c;目的就是复用性的提升 面向对象的三大特性(简单理解) 封装&#xff1a;把属性和行为抽象出来作为一个整体来实现事和物 继承&#xff1a;子类继承父类&a…

目前可用的免费云服务器整理汇总

随着云计算技术的飞速发展&#xff0c;越来越多的企业和个人开始关注并使用云服务器。为了吸引用户上云&#xff0c;各大云服务商纷纷推出了免费云服务器&#xff0c;供用户免费试用。本文将为大家整理汇总目前市场上可用的免费云服务器&#xff0c;以便大家更好地选择适合自己…

GIS与Python机器学习:开创地质灾害风险评价新纪元

地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质灾害在世界范围内频繁发生。我国除滑坡灾害外&#xff0c;还包括崩塌、泥石流、地面沉…

Verilog语言中parameter、localparam和符号常量的深度解析

1.parameter常量&#xff08;符号常量&#xff09; 用parameter来定义一个标示符&#xff0c;代表一个常量&#xff0c;称为符号常量 格式&#xff1a;parameter 参数名1 表达式&#xff0c; 参数名2 表达式&#xff1b;parameter 参数型数据的确认符&#xff0c;后边的为赋…

【C++】缺省参数

缺省参数是为函数的参数指定一个缺省值&#xff0c;调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值。 void Test(int a 10) {cout << a << endl; }int main() {Test(); // 不传参默认10Test(100); // 指定传参100return 0; }缺省参数分为全缺省和…

【 代码随想录算法训练营第三十七天 | LeetCode738.单调递增的数字、968.监控二叉树】

代码随想录算法训练营第三十七天 | LeetCode738.单调递增的数字、968.监控二叉树 一、738.单调递增的数字 解题代码C&#xff1a; class Solution { private:// 判断一个数字的各位上是否是递增bool checkNum(int num) {int max 10;while (num) {int t num % 10;if (max &g…

Unity编辑器功能 将选中的文件夹复制一份到其他文件夹

[MenuItem("Ab包工具/将选中的文件移动到StreamingAssets文件夹下")] public static void MoveFireToStreamA() { //得到选中文件的数组 Object[] selectobj Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets); i…

1114. 棋盘问题

在一个给定形状的棋盘&#xff08;形状可能是不规则的&#xff09;上面摆放棋子&#xff0c;棋子没有区别。 要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列&#xff0c;请编程求解对于给定形状和大小的棋盘&#xff0c;摆放 k&#xfffd; 个棋子的所有可行的摆放…

web渗透测试漏洞流程:红队目标信息收集之基础资产信息收集

web渗透测试漏洞流程 1.企业目标信息的确认2.企业目标信息的收集1.2 企业目标信息的列表1.2.1 企业基本信息的收集1.2.1.1 企业信息收集框架1.2.1.2 企业员工信息收集1.2.1.3 企业主域名信息确认1.2.1.4 企业信息查询网站1.2.1.5 企业备案查询网站1.2.1.6 企业信用信息查询1.2.…

使用python读取csv文件快速插入postgres数据库

使用python读取csv文件快速插入postgres数据库 下面为完整代码 import pandas as pd import cStringIO import warnings from sqlalchemy import create_engine import sys reload(sys) sys.setdefaultencoding(utf8) warnings.filterwarnings(ignore) engine create…