iptables传输数据包的过程

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

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

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

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

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

# 开放ssh服务端口
iptables -A INPUT -p tcp --dport -j ACCEPT
iptables -A INPUT -p tcp --sport -j ACCEPT # 修改默认规则为DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP

1. multiport: 多端口匹配

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

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

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

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

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

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

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

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

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

实例:

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

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

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

6. state: 状态检查

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

# 放行ssh的首次连接状态
iptables -A INPUT -p tcp --dport -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 , -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 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type -j ACCEPT # 开放主机对dns的访问
iptables -A INPUT -p udp --sport -j ACCEPT
iptables -A OUTPUT -p udp --dport -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 -p tcp --syn -m state --state NEW -j LOG --log-level --log-prefix "[SSH Login]:" # 使用recent显示模块限定每小时最多匹配到2次,超过则丢弃。(每小时建立超过2次 ssh 请求连接,每次ssh连接有三次密码验证,2次也就是输入超过6次密码)
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds  3600 --hitcount 2 --name SSH -j DROP

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 -m state --state NEW -m connlimit ! --connlimit-above -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 -m limit --limit /s --limit-burst -j ACCEPT

第四部分:NAT 常用规则

站在服务器的角度:

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

# 打开转发功能
sysctl -w net.ipv4.ip_forward= # 把 192.168.1.0 网段流出的数据的 source ip address 修改成为 10.0.0.11:
iptables -t nat -A POSTROUTING -s 192.168.1.0/ -j SNAT --to-source 10.0.0.11

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

# 打开转发功能
sysctl -w net.ipv4.ip_forward= # 把访问 10.0.0.11: 的访问转发到 192.168.1.11: 上::
iptables -t nat -A PREROUTING -d 10.0.0.11 -p tcp --dport -j DNAT --to-destination 192.168.1.11:

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

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

补充:

iptables 独立日志配置:

  当在iptables中启用日志记录时,会被当做系统日志记录到/var/log/message里面,如果想要独立日志配置如下:

grep -r 'iptables' /etc/rsyslog.conf
kern.* /var/log/iptables.log systemctl restart rsyslog

在 /etc/rsyslog.conf 中添加一条规则,并重启服务。

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

  1. python笔记之常用模块用法分析

    python笔记之常用模块用法分析 内置模块(不用import就可以直接使用) 常用内置函数 help(obj) 在线帮助, obj可是任何类型 callable(obj) 查看一个obj是不是可以像 ...

  2. ansible常用模块用法

    ansible常用模块用法 2015-07-21 10:25 24458人阅读 评论(1) 收藏 举报  分类: Linux(44)   ansible 版权声明:本文为博主原创文章,未经博主允许不得 ...

  3. day05 模块以及内置常用模块用法

    内置常用模块详解: 1 time 2 datetime 3 random   4 os 5 sys 6 shutil 7 shelve 8 xml 9 configparser 10 hashlib ...

  4. Python常用模块sys,os,time,random功能与用法,新手备学。

    这篇文章主要介绍了Python常用模块sys,os,time,random功能与用法,结合实例形式分析了Python模块sys,os,time,random功能.原理.相关模块函数.使用技巧与操作注意 ...

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

    Python 之路 Day5 - 常用模块学习   本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shel ...

  6. SaltStack系列(二)之常用模块

    一.saltstack的内置模块汇总 acl,    aliases,    alternatives,    apache,    archive,    artifactory,    block ...

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

    五.Ad-Hoc命令集1.Ad-Hoc命令集通过/usr/bin/ansible命令实现:ansible <host-pattern> [options]    -v,--verbose  ...

  8. Python模块之常用模块,反射以及正则表达式

    常用模块  1. OS模块 用于提供系统级别的操作,系统目录,文件,路径,环境变量等 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("di ...

  9. Python 五个常用模块资料 os sys time re built-in

    1.os模块   os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果.   os.name:返回当前操作系统名称('posix', 'nt', ' ...

随机推荐

  1. NO2——最短路径

    [Dijkstra算法] 复杂度O(n2) 权值必须非负 /* 求出点beg到所有点的最短路径 */ // 邻接矩阵形式 // n:图的顶点数 // cost[][]:邻接矩阵 // pre[i]记录 ...

  2. css如何选择相同class下的第一个class元素和最后一个元素?

    如图,如果像选择类名为  class="exerciseInfo"  中的第一个和最后一个div,做法如下: 选择第一个类名: .exerciseInfo: nth-of-type ...

  3. 深入研究java.lang.Runtime类(转)

    一.概述      Runtime类封装了运行时的环境.每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接.      一般不能实例化一个Runtime对象, ...

  4. 【bzoj2330】[SCOI2011]糖果 差分约束系统

    题目描述 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配 ...

  5. 前端工程师必须要知道的SEO技巧(2):制作比设计还要漂亮的代码(内容和语义化代码)实现下

    提醒自己:上一篇文章属于纯理论的文章,我自己有的部分之从网上摘抄的,我自己也是不理解的.或许过一段日子我就能全明白了.我自己还是喜欢实战,做几个例子就明白了. 怎么做让自己网页的标签来实现语义化,我直 ...

  6. LeetCode -- Tiangle

    Question: Given a triangle, find the minimum path sum from top to bottom. Each step you may move to ...

  7. [洛谷P1747]好奇怪的游戏

    题目大意:有两匹马,马可以走"日",也可以像象走"田",求它走到(1,1)的步数. 题解:bfs 卡点:边界判断成了可以走到(0,y)或(x,0) C++ Co ...

  8. linux管理(二)---网络使用情况的监控

    我们经常在监控服务器或者排查程序性能瓶颈时需要知道  网络带宽的使用情况,看看带宽是不是瓶颈. linux系统中监控网络的工具和命令很多. 但其实主要分2种,一种是实时监控带宽情况(速度如何),一种是 ...

  9. 【NOIP模拟赛】Drink 二维链表+模拟

    我觉得这道题的主旨应该是模拟,但是如果说他是二维链表的話也不為過.這道題的主體思路就是把原來旋轉點的O(n^2)變成了旋轉邊界的O(n).怎麼旋轉邊界呢,就好像是把原來的那些點都於上下左右四個點連線, ...

  10. 在JS中,一切东东其实都是对象

    对象是组成JavaScript的基本单元,在JS中,一切东东其实都是对象,而且功能非常强大,它不仅风格独特,功能也与众不同. 一.引用(reference) 引用的概念是JS的基础之一,它是指向对象实 ...