iptables技术推荐参考这位仁兄的博客:http://www.zsythink.net/archives/category/%E8%BF%90%E7%BB%B4%E7%9B%B8%E5%85%B3/%E9%98%B2%E7%81%AB%E5%A2%99/page/2/

iptables指南参见:https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.htm

iptables匹配原则:从序列号为1的开始匹配,直到匹配到第一条合适的规则并执行,后续规则即使能够匹配也不再执行

iptables规则顺序:将经常会被匹配到的规则放在表前面

报文传输顺序严格遵循下图(图片系引用),需要注意到,与转发相关的PREROUTING的nat功能在路由选择之前,因此nat能够正常被路由处理

  • 使用iptables -t filter -nvL INPUT --line查看iptables规则
  • iptables-save可以将当前的iptables规则以“保存后的格式”输出到屏幕上,使用iptables-save > /etc/sysconfig/iptables-config保存到系统中
  • iptables-restore可以将保存的规格重载到环境中,使用:iptables-restore < /etc/sysconfig/iptables
  • 使用iptables -t filter -P INPUT DROP修改表的默认规则(此处为DROP)
  • 使用iptables -t filter -I INPUT -s 1.1.1.1,1.1.1.2 -j DROP添加多个规则,逗号隔开,逗号左右侧不能有空格
  • 使用iptables -t filter -I INPUT -s 1.1.1.0/24 -j DROP添加一个网段的规则
  • 使用iptables -t filter -I INPUT ! -s 175.24.0.59 -j ACCEPT,添加表示接收IP非175.24.0.59的报文,但175.24.0.59的报文是否接收取决于规则中是否有对175.24.0.59的处理,如果规则中是有如下一条内容,则会接收175.24.0.59的报文
host-175-24-0-58:/home # iptables -t filter -nvL INPUT --line
Chain INPUT (policy ACCEPT 138 packets, 15020 bytes)
num pkts bytes target prot opt in out source destination
1 46 9364 DROP all -- * * !175.24.0.59 0.0.0.0/0

   但如果规则如下明确表示拒绝175.24.0.59,则不会接收175.24.0.59的报文,注意新加的规则是在原规则之后而不是之前

host-175-24-0-58:/home # iptables -t filter -nvL INPUT --line
Chain INPUT (policy ACCEPT 138 packets, 15020 bytes)
num pkts bytes target prot opt in out source destination
1 46 9364 DROP all -- * * !175.24.0.59 0.0.0.0/0
2 0 0 REJECT all -- * * 175.24.0.59 0.0.0.0/0
  • iptables使用-s来指定报文源地址,使用-d指定报文目的地址,iptables -t filter -I INPUT -s 1.1.1.1 -d 1.1.1.2 -j DROP,表示仅丢弃来自1.1.1.1发往1.1.1.2报文;如果规则为iptables -t filter -I INPUT -s 0.0.0.0 -d 1.1.1.2 -j DROP则表示丢弃所有发往1.1.1.2的报文,-d指定的地址可以是本机。当一条规则存在多个匹配条件时,报文需要满足所有匹配条件,规则才能生效
  • iptables使用-p来指定协议类型,iptables -t filter -I INPUT -s 1.1.1.1 -p tcp -j reject,表示拒绝来自1.1.1.1的tcp报文,默认拒绝所有协议的报文(不指定-p),可以从/etc/protocols中获取所有的协议信息。
  • iptables 使用-i匹配报文是通过哪块网卡流入本机,使用-o来匹配报文从哪个网口流出。-i选项只能用于PREROUTING链、INPUT链、FORWARD链;-o选项只能用于POSTROUTING链、OUTPUT链、FORWARD链。   
//表示丢弃所有通过eth1传入的tcp报文 
iptables -t filter -I INPUT -i eth1 -p tcp -j DROP
//表示丢弃所有通过eth2传出的icmp报文
iptables -t filter -I OUTPUT -o eth2 -p icmp -d drop
  • 以上命令为基本匹配条件,使用扩展匹配条件需要加载扩展模块。如使用--dport匹配目标端口时需要加载特定的模块,如tcp:iptables -t filter -I INPUT -s 1.1.1.1 -p tcp -m tcp -dport 22 -j REJECT,表示本端拒绝来自1.1.1.1的ssh连接。--dport可以认为是tcp模块中的功能,所以必须制定tcp模块(如果不指定使用与-p名称一样的模块)。

    • 使用冒号可以连续指定匹配端口号,如iptables -t filter -I INPUT -p tcp -m tcp --dport 22:30 -j REJECT,也可以使用如:22匹配1到22的端口;使用22:匹配22到65535的端口号,但不能指定离散的端口
    • 使用multiport模块可以指定多个离散的端口:iptables -t filter -I INPUT -p tcp -m multiport --dport 22,40,50:60 -j REJECT,但multiport只能用于tcp和udp协议
  • 扩展匹配条件也可以使用!取反,如 ! --dport 22,表示目标端口不是22的报文都会被匹配
  • icmp可以使用type/code匹配具体的报文,iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j DROP,表示type为8,code为0的icmp报文会被丢弃,type code对应关系如下
TYPE CODE Description Query Error
0 0 Echo Reply——回显应答(Ping应答) x  
3 0 Network Unreachable——网络不可达   x
3 1 Host Unreachable——主机不可达   x
3 2 Protocol Unreachable——协议不可达   x
3 3 Port Unreachable——端口不可达   x
3 4 Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特   x
3 5 Source routing failed——源站选路失败   x
3 6 Destination network unknown——目的网络未知   x
3 7 Destination host unknown——目的主机未知   x
3 8 Source host isolated (obsolete)——源主机被隔离(作废不用)   x
3 9 Destination network administratively prohibited——目的网络被强制禁止   x
3 10 Destination host administratively prohibited——目的主机被强制禁止   x
3 11 Network unreachable for TOS——由于服务类型TOS,网络不可达   x
3 12 Host unreachable for TOS——由于服务类型TOS,主机不可达   x
3 13 Communication administratively prohibited by filtering——由于过滤,通信被强制禁止   x
3 14 Host precedence violation——主机越权   x
3 15 Precedence cutoff in effect——优先中止生效   x
4 0 Source quench——源端被关闭(基本流控制)    
5 0 Redirect for network——对网络重定向    
5 1 Redirect for host——对主机重定向    
5 2 Redirect for TOS and network——对服务类型和网络重定向    
5 3 Redirect for TOS and host——对服务类型和主机重定向    
8 0 Echo request——回显请求(Ping请求) x  
9 0 Router advertisement——路由器通告    
10 0 Route solicitation——路由器请求    
11 0 TTL equals 0 during transit——传输期间生存时间为0   x
11 1 TTL equals 0 during reassembly——在数据报组装期间生存时间为0   x
12 0 IP header bad (catchall error)——坏的IP首部(包括各种差错)   x
12 1 Required options missing——缺少必需的选项   x
13 0 Timestamp request (obsolete)——时间戳请求(作废不用) x  
14   Timestamp reply (obsolete)——时间戳应答(作废不用) x  
15 0 Information request (obsolete)——信息请求(作废不用) x  
16 0 Information reply (obsolete)——信息应答(作废不用) x  
17 0 Address mask request——地址掩码请求 x  
18 0 Address mask reply——地址掩码应答
  • iptables的白名单方式为:首先添加一个“拒绝所有请求”,然后将白名单规则放在它前面
  • Chain INPUT (policy DROP 0 packets, 0 bytes)
    pkts bytes target prot opt in out source destination
    0 0 ACCEPT all -- * * 1.1.1.1 0.0.0.0/0
    222 26155 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
  • 使用自定义链有2个条件:首先创建一个自定义链;然后将新创建的链关联到现有的链(references表示被关联的次数)。主链中匹配条件后跳转到子链,自链也会重新按照自己的规则进行报文匹配,因此主链和子链之间的匹配条件无需重复

    • 使用iptables -t filter -N NEW_CHAIN0创建自定义链
    • 使用iptables -t filter -E NEW_CHAIN0 NEW_CHAIN1
    • 删除自定义链之前需要删除所有references,然后清除自定义链的所有规则,使用iptables -t filter -X NEW_CHAIN1删除自定义链
    • 子链中可以添加RETURN操作来返回到主链,如下表示如果源地址是1.1.1.1,则返回到主链处理
Chain NEW_CHAIN0 (1 references)
pkts bytes target prot opt in out source destination
1 60 RETURN all -- * * 1.1.1.1              0.0.0.0/0 
0 0 ACCEPT all -- * * 192.168.128.1 0.0.0.0/0
  • iptables使用state模块进行连接跟踪,除了本地产生的包由OUTPUT链处理外,所有连接跟踪都是在PREROUTING链里进行处理的,意思就是, iptables会在PREROUTING链里从新计算所有的状态。如果我们发送一个流的初始化包,状态就会在OUTPUT链 里被设置为NEW,当我们收到回应的包时,状态就会在PREROUTING链里被设置为ESTABLISHED。如果第一个包不是本地产生的,那就会在PREROUTING链里被设置为NEW状 态。综上,所有状态的改变和计算都是在nat表中的PREROUTING链和OUTPUT链里完成的。使用state模块可以控制“谁或什么能发起新的会话”

使用如下命令可以防止外部主机访问本机,但不妨碍本机访问其他主机

iptables -t filter -A INPUT -j REJECT
iptables -t filter -I INPUT -m state --state ESTABLISHED -j ACCEPT

可以在/proc/net/nf_conntrack查看跟踪记录,可以在/proc/sys/net/ipv4/netfilter中设置跟踪参数,比如可以在nf_conntrack_icmp_timeout中设置icmp跟踪记录的生存时间

  • REJECT使用选项--reject-with可以设置提示信息,如iptables -t filter -I INPUT -j REJECT --reject-with icmp-host-unreachable,当ping该主机的时候会接收到主机不可达的提示信息
  • 使用LOG动作可以将匹配到的报文相关信息记录到日志中:/var/log/message,iptables -t filter -I INPUT -s 1.1.1.1 -j LOG,表示在INPUT链的filter表中匹配到源地址为1.1.1.1的报文后记录在日志中
  • NAT功能通常被集成到路由器,防火墙或独立的NAT设备中,使用SNAT或DNAT需要看具体场景,如下图,A访问C,报文源地址为1.1.1.1,目的地址为2.2.2.1,此时需要在B上配置SNAT(源地址转换为路由器地址),否则B将接收不到C返回的报文,这种场景用在私网访问公网场景,A为私网,C为公网;如果A需要访问C,报文源地址为1.1.1.1,目的地址为1.1.1.2,此时需要在B上配置DNAT,这种场景一般用在访问服务器场景,A为普通主机,C为服务器

A(host)------------------>B(NAT)----------------->C(host)
(1.1.1.1)              (1.1.1.2)(2.2.2.2)               (2.2.2.1)

SNAT只能配置在INPUT和POSTROUTING上,INPUT用于主机接收;POSTROUTING主要走转发流程,如上图A直接ping 2.2.2.1需要配置如下内容,同时在A机器上可以抓包或使用iptables LOG功能或/var/log/message查看源地址,为B机器的2.2.2.2的地址

#A机器上添加到达C的路由,否则报文会走默认网关
route add -host 2.2.2.1 gw 1.1.1.2
#B转发机器添加iptables规则
iptables -t nat -I POSTROUTING -d 1.1.1.2 -j SNAT --to 2.2.2.2

DNAT只能配置在OUTPUT和PREROUTING上,PREROUTING用于路由判断,走转发;OUTPUT仅用于主机发送,A通过B ping C的配置如下(B机器配置)

#首先目的地址转换
iptables -t nat -I PREROUTING -d 1.1.1.2 -j DNAT --to 2.2.2.1
#修改源地址,否则报文回来找不到目的地址
iptables -t nat -I POSTROUTING -d 2.2.2.1 -j SNAT --to 2.2.2.2

使用NAT只能用于转换IP地址,如果要nat带端口号的服务,如基于tcp的ssh,或基于UDP的服务等,就需要NAPT,以上图为例,如果A需要ssh连接C,配置如下:

#添加到2.2.2.1的DNAT
iptables -t nat -I PREROUTING -d 1.1.1.2 -p tcp -m tcp --dport -j DNAT --to 2.2.2.1:
#修改B发出的源地址
iptables -t nat -I POSTROUTING -d 2.2.2.1 -p tcp -m tcp --dport -j SNAT --to 2.2.2.2

A最后ssh连接C的方式为:ssh -p 20220 2.2.2.2,当访问B主机的20220端口时,会映射到C主机的22端口。因为端口映射的关系是保存在NAT服务器上的,因此必须通过DNATP的方式,单独使用如下方式是无法通的

iptables -t nat -I POSTROUTING -d 2.2.2.1 -p tcp -m tcp --dport  -j SNAT --to 2.2.2.2

NAT尽量不要使用多端口映射,参见https://blog.csdn.net/u013401853/article/details/70848433

  • MASQUERADE主要用于可变源地址转换,只能用于nat表的POSTROUTING,如DHCP情况下,iptables -t nat -I POSTROUTING -d 1.1.1.1 -o eth1 -j MASQUERADE,表示将报文源地址修改为eth1接口地址,MASQUERADE相比SNAT性能比较低,如果IP地址不变,则优先使用SNAT。
  • REDIRECT用于在本机进行端口映射,只能用于nat表的PREROUTING、OUTPUT,如iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080,当其他主机访问本机80端口时,报文会被重定向到本机的8080端口。DNAT 是明确指定修改目的地址,而 REDIRECT 会把要转发的包的目的地址改写为入口接口的 IP 地址,即接收到的所有报文的目的地址都会被修改为入接口的IP,同时端口也会被修改。
  • 使用limit模块可以对报文进行限速,如iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT,表示每分钟最多放行10个包,即没6s最多放行一个包。limit模块使用“令牌桶”算法,使用--limit-burst可以指定令牌个数。

iptables关键学习总结的更多相关文章

  1. iptables/Netfilter 学习

    开始学iptables,因为它是和路由器技术紧密结合在一起的. iptables的命令看起来眼花缭乱,随便找两个: iptables -A FORWARD -p tcp -s -d -j ACCEPT ...

  2. centos下防火墙iptables日志学习笔记

    一直找不到日志方面怎么弄,问了同事,同事给了个网址: http://www.thegeekstuff.com/2012/08/iptables-log-packets/ 下面就是我根据这个网址里面的设 ...

  3. iptables 的学习资源

    慕课网:https://www.imooc.com/video/7617 马哥linux视频:http://edu.51cto.com//center/course/lesson/index?id=9 ...

  4. 【转】IPtables学习笔记

    写在前面,大家测试玩iptables时要记得自己配置了那些东西,测试完成后记得删除啊,博主忘了删除一个input REJECT链的一条记录,后续测试搭建了apache服务器,始终无法访问,最后抓包发现 ...

  5. 总结5条对学习Linux系统有帮助的经验心得

    作为国产手机中的代表厂商,OPPO一直走在国内的前沿.不仅手机出货量在国内遥遥领先,而且在国外也抢占不少的市场份额.前段时间,OPPO在台湾地区签下田馥甄和林宥嘉担任OPPO R9s的代言人外,在东南 ...

  6. 20172306《java程序设计与数据结构》第六周学习总结

    20172306<Java程序设计>第六周学习总结 教材学习内容总结 第八章关键学习了数组的相关内容.我觉得主要分一下几点: 1.索引是从0开始,要区分好索引值和个数值.0的索引处是第一个 ...

  7. 20155316 2016-2017-2 《Java程序设计》第1周学习总结

    学习内容总结 在linux的环境下学习怎么安git.jdk.Intellj IDEA 精读教材1.2章 课前准备部分 git的学习 学习进度 系统学习学到创建版本库-廖雪峰的官方网站 git推送学到最 ...

  8. iptables原理及防火墙规则语法基础

     Iptables 防火墙 学习总结: 三张表介绍: filter负责过滤数据包,包括的规则链有,input(进),output(出)和forward(转发); nat则涉及到网络地址转换,包括的规则 ...

  9. CentOS6系统优化

    [root@xuliangwei ~]# cat /etc/redhat-release //系统环境CentOS6.6 CentOS release 6.6 (Final) [root@xulian ...

随机推荐

  1. float 为什么不能用== ,或者大于等于,或者小于等于

    本文尝试着将以下内容做一个浅显的解释,主要包括浮点数为什么是不精确的,浮点数为什么不能用==和!=直接比较,以及浮点数的比较方法等几个方面.如果那个地方说的不对还请各位看官不吝赐教!欢迎大家评论区讨论 ...

  2. 从问题域看hadoop的各种技术

    近些年来Hadoop生态系统发展迅猛,它本身包含的软件越来越多,同时带动了周边系统的繁荣发展.尤其是在分布式计算这一领域,系统繁多纷杂,时不时冒出一个系统,号称自己比MapReduce或者Hive高效 ...

  3. python的特性

    python使用c语言开发 1.面向对象的特性 面向对象的程序设计抽象出对象的行为和属性,把行为和属性分离开,但是又合理的组织在一起.它消除了保护类型.抽象类.接口等面向对象的元素,使得面向对象的概念 ...

  4. 与数据库连接的页面增删改查 的easyui实现(主要是前端实现)

    一.首先看一下最终实现的效果,上图 二.思路,主要是分两个文件实现,一个是页面显示文件:代码如下: <html> <head> <title>示例管理</ti ...

  5. adb命令行输出logcat日志

    输出到终端: adb logcat 输出到指定文件:如log.txt adb logcat > log.txt 输出到指定文件并带上日志产生时的系统时间(个人感觉实用的): adb logcat ...

  6. C# 实现将多个word文档合并成一个word文档的功能

    前段时间项目上遇到这么一个需求,需要将多个OCR识别的word文档合并成一个,于是就在网上找了找,自己修改了一下.在这里跟大家分享一下,希望有用的到的. 要做多word文档合并,首先要导入Micros ...

  7. Python: 读写Excel(openpyxl / win32com.client)

    项目周报汇报的时候要做数据汇总,总是要从不同的excel文件中去获取数据最后汇总到一个excel表里面,所以决定用python直接写个自动化脚本来自动执行. 用python来读写excel,目前找了2 ...

  8. .Net Core + NGINX跳转登录时端口丢失

    使用.Net Core + NGINX部署到服务器的时候,如果端口不是使用默认的80端口,在跳转到登录页面时,URL中的端口丢失. NGINX的配置如下: server { listen ; loca ...

  9. devexpress 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 “lc.exe”已退出,代码为 -1。

    将licensens.licx删除,就能正常运行

  10. Java各国首都列表

    国 家 名 称 首  都 中华人民共和国 People's Republic of China 北京 Beijing 蒙古 Mongolia 乌兰巴托 Elggydggmgj 朝鲜 Democrati ...