iptables 用法及常用模块总结

iptables传输数据包的过程

  1. 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。

  2. 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。

  3. 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。

第一部分:常用显示模块介绍

注意:本文所有实例都是在默认规则为DROP下。

# 开放ssh服务端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --sport 22 -j ACCEPT

# 修改默认规则为DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP

1. multiport: 多端口匹配

可用于匹配非连续或连续端口;最多指定15个端口;
    实例

iptables -A INPUT -p tcp -m multiport --dport 22,80 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sport 22,80 -j ACCEPT

2. iprange: 匹配指定范围内的地址

匹配一段连续的地址而非整个网络时有用
    实例:

iptables -A INPUT -p tcp -m iprange --src-range 192.168.118.0-192.168.118.60 --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp -m iprange --dst-range 192.168.118.0-192.168.118.60 --sport 22 -j ACCEPT

3. string: 字符串匹配,能够检测报文应用层中的字符串

字符匹配检查高效算法:kmp, bm  
    能够屏蔽非法字符
    实例:

# 注意该条规则需要添加到OUTPUT链,当服务端返回数据报文检查到有关键字"sex"时,则丢弃该报文,可用于web敏感词过滤
iptables -A OUTPUT -p tcp --dport 80 -m string --algo kmp --string "sex" -j DROP

4. connlimit: 连接数限制,对每IP所能够发起并发连接数做限制;

实例:

# 默认INPUT 为 DROP. 每个ip对ssh服务的访问最大为3个并发连接,超过则丢弃
iptables -A INPUT -p tcp  --dport 22 -m connlimit ! --connlimit-above 3 -j ACCEPT

5. limit: 速率限制
    limit-burst: 设置默认阀值

# 默认放行10个,当到达limit-burst阀值后,平均6秒放行1个
iptables -A INPUT -p icmp -m limit --limit 10/minute --limit-burst 10 -j ACCEPT

6. state: 状态检查

连接追踪中的状态:
        NEW: 新建立一个会话
        ESTABLISHED:已建立的连接
        RELATED: 有关联关系的连接
        INVALID: 无法识别的连接

# 放行ssh的首次连接状态
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT    

第二部分:编写常用规则

编写iptables注意:做默认规则drop的时候一定要先开放ssh端口,否则就杯具了。

# 清空自建规则
iptables -F
iptables -X

# 在INPUT链上,tcp为RELATED,ESTABLISHED的数据包为放行
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

# 在INPUT链上,tcp为NEW而且端口为22,80的数据包放行
iptables -A INPUT -p tcp -m state --state NEW -m multiport 22,80 -j ACCEPT

# 在OUTPUT链上,tcp为ESTABLISHED都放行
iptables -A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT

# INPUT链和OUTPUT链默认规则都为DROP状态
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# 打开本地回环地址
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 允许服务器ping对端主机而不允许对端主机ping服务器
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT

# 开放主机对dns的访问
iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

第三部分:针对特定的服务定制相关规则

1. 对ssh进行管控,1小时内最多发起5个连接,防止黑客暴力破解ssh

# 清空默认规则
iptables -F
iptables -X

# 添加已建立的连接规则
iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT

# 设置默认规则
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# 设置iptables记录匹配ssh规则
iptables -I INPUT  2 -p tcp --syn -m state --state NEW -j LOG --log-level 5 --log-prefix "[SSH Login]:"

# 使用recent显示模块限定每小时最多匹配到5次,超过则丢弃。
iptables -A INPUT -p tcp --syn -m state --state NEW -m recent --name OPENSSH --update --seconds 3600 --hitcount 5 -j DROP
iptables -A INPUT -p tcp --syn -m state --state NEW -m recent --name OPENSSH --set -j ACCEPT

2. 对web服务进行并发管控,防止Ddos

# 清空默认规则
iptables -F
iptables -X

# 添加已建立的连接规则
iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT

# 设置默认规则
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# 每个ip的并发连接请求最大50,超过则丢弃,建议调大值,容易误伤nat上网用户
iptables -A INPUT -p tcp --syn --dport 80 -m state --state NEW -m connlimit ! --connlimit-above 50 -j DROP

3. 对icmp进行流控,防止icmp攻击

# 清空默认规则
iptables -F
iptables -X

# 添加已建立的连接规则
iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT

# 设置默认规则
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# 利用limit模块限制icmp速率,阀值为10个,当到达10个后,限速每秒钟1个
iptables -A INPUT -p icmp --icmp-type 0 -m limit --limit 1/s --limit-burst 10 -j ACCEPT

第四部分:NAT 常用规则

站在服务器的角度:

  当内网服务器要访问外网时,需要做源地址转换;

# 打开转发功能
sysctl -w net.ipv4.ip_forward=1

# 把 192.168.1.0 网段流出的数据的 source ip address 修改成为 10.0.0.11:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 10.0.0.11

  当外网主机要访问内网服务器服务时,需要做目标地址转换;

# 打开转发功能
sysctl -w net.ipv4.ip_forward=1

# 把访问 10.0.0.11:2222 的访问转发到 192.168.1.11:22 上::
iptables -t nat -A PREROUTING -d 10.0.0.11 -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.11:22

  单纯的将访问本机80端口的请求转发到8080上

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
时间: 2024-10-19 00:32:44

iptables 用法及常用模块总结的相关文章

Day5 - Python基础5 常用模块学习

Python 之路 Day5 - 常用模块学习 本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configparser hashlib subprocess logging模块 re正则表达式 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,

Ansible 自动化运维工具之inventory和常用模块介绍

一.inventory介绍 前面我们介绍过ansible的hosts文件是存放被管理主机的,被管理主机比较少的情况下,直接在hosts中定义即可,但是以后很定会管理多台主机,而ansible可管理的主机集合就叫做inventory.在ansible中,描述你主机的默认方法是将它们列在一个文本文件中,这个文件叫inventory文件. 一个简单的inventory文件可能只包含一组主机名的列表,如下: ftp.testansible.com samba.testansible.com mail.t

Iptables用法

[[email protected] ~]# iptables -F #清除默认表filter中所有链的规则 [[email protected] ~]# iptables -X #清除自定义链的规则 [[email protected] ~]# iptables -L -nv --line-numbers #编号显示链规则 [[email protected] ~]# iptables -N #新建一条自定义的链 [[email protected] ~]# iptables -A INPUT

python常用模块(1):collections模块和re模块(正则表达式详解)

从今天开始我们就要开始学习python的模块,今天先介绍两个常用模块collections和re模块.还有非常重要的正则表达式,今天学习的正则表达式需要记忆的东西非常多,希望大家可以认真记忆.按常理来说我们应该先解释模块概念性东西再来学习具体的模块使用.可是直接解释可能反而不好理解,模块的使用非常方便,所以我们采用先介绍使用常用模块过两天再具体进行模块概念的讲解. 预习: 实现能计算类似 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998

python学习第六课 --常用模块

常用模块 sys sys.argv  命令行参数列表,第一个元素是程序本身路径 sys.exit(n)  退出程序,正常退出时exit(0) sys.version sys.maxint  最大的int值 sys.path 返回模块的搜索路径 sys.paltform sys.stdout.wirte("hello") val = sys.stdin.readline()[:-1] logging import logging logging.basicConfig(filename=

《Ansible权威指南》笔记(3)——Ad-Hoc命令集,常用模块

五.Ad-Hoc命令集1.Ad-Hoc命令集通过/usr/bin/ansible命令实现:ansible <host-pattern> [options]    -v,--verbose  输出执行过程信息verbose mode (-vvv for more, -vvvv to enable connection debugging)    -i INVENTORY, --inventory-file=INVENTORY    指定inventory信息,(default=/etc/ansi

ansible常用模块详解

ansible常用模块详解: ansible <host-pattern> [-m module_name] [-a args] [options] #ansible命令格式  指定主机组或ip地址  指定调用模块   传递给模块的参数   ansible-doc -l #列出可用模块 ansible-doc -s model_name #查看指定模块详细用法 command:ansible默认模块,对指定主机执行命令,不能理解特殊字符 例:ansible web -a 'date' #对we

python常用模块-------转自林海峰老师

常用模块 一 time模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行"type(time.time())",返回的是float类型. 格式化的时间字符串(Format String) 结构化的时间(struct_time):struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时) 1 import tim

ansible基础—安装与常用模块

ansible介绍: ansible是一个基于python开发的轻量级自动化运维管理工具,可以用来批量执行命令,安装程序,支持playbook编排.它通过ssh协议来连接主机,省去了在每一台主机安装客户端的麻烦,相对比puppet和saltstack,显得更为简单和轻量. ansible命令参数: Usage: ansible <host-pattern> [options] Options:   -a MODULE_ARGS, --args=MODULE_ARGS