技术标签: iptables -------Linux运维学习----------
实际上,iptables 只是一个操作 Linux 内核 Netfilter 子系统的“界面”。顾名思义,Netfilter 子系统的作用,就是 Linux 内核里挡在“网卡”和“用户态进程”之间的一道“防火墙”。它 们的关系,可以用如下的示意图来表示:
图片来自张磊极客时间专栏(侵删)
可以看到,这幅示意图中,IP 包“一进一出”的两条路径上,有几个关键的“检查点”,它们 正是 Netfilter 设置“防火墙”的地方。在 iptables 中,这些“检查点”(每个检查点都可以设置iptables规则对数据包进行过滤或修改)被称为:链 (Chain)。这是因为这些“检查点”对应的 iptables 规则,是按照定义顺序依次进行匹配 的。这些“检查点”的具体工作原理,可以用如下所示的示意图进行描述:
可以看到,当一个 IP 包通过网卡进入主机之后,它就进入了 Netfilter 定义的流入路径(Input Path)里。在这个路径中,IP 包要经过路由表路由来决定下一步的去向。而在这次路由之前,Netfilter 设 置了一个名叫 PREROUTING 的“检查点”。在 Linux 内核的实现里,所谓“检查点”实际上 就是内核网络协议栈代码里的 Hook(比如,在执行路由判断的代码之前,内核会先调用 PREROUTING 的 Hook)。
而在经过路由之后,IP 包的去向就分为了两种:
数据包在Linux内核的流转过程
上述五条链,其实就是五个检查点,那么为什么要设置这五个检查点呢?我猜是因为每个检查点针对的数据包的作用域不一样,如下表所示。
链名 | 作用域 |
---|---|
PREOUTING | 所有进入本机的数据包 |
INPUT | 继续在本机处理,向上层协议栈流入的数据包,交由本机进程处理 |
FORWARD | 被转发到其他目的地的数据包 |
OUTPUT | 经过本机进程处理流出的数据包 |
POSTROUTING | 所有流出本机的数据包(包括从从Forward Path流出的数据包以及从Output Path流出的数据包) |
POSTROUTING 的作用,其实就是上述两条路径(Output Path和Forward Path),最终汇聚在一起的“最终检查点”,对两条路径上的数据包进行统一的检查和处理。
**总结:**上文涉及到了三条路径Input Path、Output Path、Forward Path来详细说明数据包的流转过程,在这个流转过程中设置了一些检查点(chain),使得用户可以在这些检查点上设置一定的规则来将匹配到的数据包进行处理。
建议将上图原图链接打开,放大观看。前文所讲的就是上图绿色的部分,也就是Network Layer中的iptables工作流程,每一个白色的“检查点”上,还有一个绿色的“标签”,比如:raw、 nat、filter 等等。在 iptables 里,这些标签叫作:表。比如,同样是 OUTPUT 这个“检查点”,filter Output 和 nat Output 在 iptables 里的语法和参数,就完全不一样,实现的功能也完全不同。
每个表的功能如下所示:
名称 | 功能 |
---|---|
filter | 一般的过滤功能,这个是默认的 table |
nat | 用于nat功能(端口映射,地址映射等),这个表格主要在进行来源与目的之 IP 或 port 的转换,与 Linux 本机较无关,主要与 Linux 主机后的局域网络内计算机较有相关 |
mangle | 主要功能是根据规则修改数据包的一些标志位,以便其他规则或程序可以利用这种标志对数据包进行过滤或策略路由。简单来讲就是给数据包打标签。 |
raw | 涉及到数据包的跟踪处理功能,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,即设置NOTRACK动作提高性能 |
raw表中所说的跟踪状态指的是被跟踪连接的四种不同状态有关的。它们分别是NEW,ESTABLISHED,RELATED和INVALID。具体请看参考文献,此处不再细说。
下图所示是Netfilter中表和链的对应关系。表的处理优先级:raw>mangle>nat>filter。
总结: iptables 表的作用,就是在某个具体的“检查点”(比如 Output)上,按顺序执行几个不同的检查动作(比如,先执行 nat,再执行 filter),在这些检查动作中包含了一系列的iptables规则,匹配到相应规则的数据包则会执行相应的处理动作。以上就是iptables中的四表五链,有错误,欢迎指正。
iptables -t table command chain rules -j target
-j jump,指的是跳转到何种动作上。
表选项用于指定命令应用于哪个iptables内置表,iptables内置包括:filter表、nat表、mangle表和raw表
使用的参数为: -t + 表名,如果不使用-t参数,默认是使用filter表
清除iptables规则:
iptables -F
#清除所有制定的规则
iptables -X
#清除用户自定义的chain
iptables -Z
#将所有流量统计归0
但是并非执行后就万事大吉了。你仍然需要检查规则是不是真的清空了,因为有的linux发行版上这个命令不会清除NAT表中的规则,此时只能手动清除:iptables -t NAT -F
默认五条链
自定义链
rules主要是制定一定的规则,匹配到符合规则的数据包,进行处理。
匹配条件当中出现"!"是取反的意思
iptables -A OUTPUT -s 192.168.1.1
#指定该规则与源地址为192.168.1.1的数据包匹配。
iptables -A OUTPUT -s 192.168.0.0/24
#指定该规则与源地址为192.168.0.0/24子网下的网络包匹配
iptables -A OUTPUT -s ! 203.16.1.89
#指定该规则将与 除来自源地址 203.16.1.89 外的任何信息包匹配。
man iptables-extensions
查看帮助文档
在使用-p选项指明了特定的协议时,无需再用-m选项 指明扩展模块的扩展机制,不需要手动加载扩展模块
--source-port, --sport port[:port]:匹配报文源端口, 可为端口范围
--destination-port,--dport port[:port]:匹配报文目标 端口,可为范围
--tcp-flags mask comp
mask 需检查的标志位列表,用,分隔 例如 SYN,ACK,FIN,RST;
comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔
实例:
--tcp-flags SYN,ACK,FIN,RST SYN
#表示要检查 的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0
--source-port, --sport port[:port]:匹配报文的 源端口;可以是端口范围
--destination-port,--dport port[:port]:匹配报 文的目标端口;可以是端口范围
必须使用-m选项指明要调用的扩展模块的扩展 机制,要手动加载扩展模块
-m matchname
学会使用帮助文档,由于扩展是很多的,不可能介绍完所有的,所以学会查询帮助文档是而非常有必要的。
#查看addrtype扩展的帮助文档
iptables -m addrtype --help
1.multiport扩展
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m multiport --dports 20:22,80 -j ACCEPT
#以离散方式定义多端口匹配,最多指定15个端口,用","分隔。
#上述命令中表明源地址为172.16.0.0/16,目标地址为172.16.100.10的数据包中,目的端口为20-22范围之间的以及80号端口,都接收。
#":"表示一个范围,比如20:22,表示是20到22之间的所有端口。
2.iprange扩展
--src-range from[-to] 源IP地址范围
--dst-range from[-to] 目标IP地址范围
#实例
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 80 -m iprange --src-range 172.16.100.5172.16.100.10 -j DROP
#指明连续的(但一般不是整个网络)ip地址范围
3.mac扩展
#实例:
iptables -A INPUT -s 172.16.0.100 -j REJECT
#指明源MAC地址
4.string扩展
#对报文中的应用层数据做字符串模式匹配检测
--algo {
bm|kmp}:字符串匹配检测算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
--from offset 开始偏移
--to offset 结束偏移
--string pattern:要检测的字符串模式
#实例
iptables -A OUTPUT -s 172.16.100.10 -d 0/0 -p tcp --sport 80 -m string --algo bm --string “google" -j REJECT
5.time扩展
根据将报文到达的时间与指定的时间范围进行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--monthdays day[,day...]
--weekdays day[,day...]
#实例:
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
6.connlimit扩展
根据每客户端IP做并发连接数数量匹配,可防止CC(Challenge Collapsar挑战黑洞)攻击,通常分别与默认的拒绝或允许策略配合使用。
--connlimit-upto n:连接的数量小于等于n时匹配
--connlimit-above n:连接的数量大于n时匹配
#示例:
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
7.limit扩展
基于收发报文的速率做匹配 令牌桶过滤器
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
示例:
iptables -I INPUT -d 172.16.100.10 -p icmp --icmptype 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
8.state扩展
根据”连接追踪机制“去检查连接的状态,较耗资源 ,状态有如下几种:
CentOS7 需要加载模块: modprobe nf_conntrack
--state state
#示例:
iptables -A INPUT -d 172.16.100.10 -p tcp -m multiport -dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
9.comment扩展
为任何规则添加注释(最多256个字符),主要是为了解释说明该规则。
iptables -A INPUT -i eth1 -m comment --comment "my local LAN"
target可以是一个"动作",target也能是一个"自定义链",当target为一个动作时,表示报文按照指定的动作处理,当target为自定义链时,表示报文由自定义链中的规则处理。具体见下文中自定义链的使用。
targetname | 解释说明 |
---|---|
ACCEPT | 接受数据包 |
DROP | 丢弃数据包 |
REDIRECT | 通过改变目标IP和端口,将接受的包转发至不同端口 --to-ports port[-port] |
SNAT | 源地址转换,即改变数据包的源地址。 |
DNAT | 目标地址转换,即改变数据包的目的地址。 |
MASQUERADE | MASQUERADE是用发送数据的网卡上的IP来替换源IP,因此,对于那些IP不固定的场合,比如拨号网络或者通过dhcp分配IP的情况下,就得用MASQUERADE。效果和SNAT相似。 |
LOG | 日志功能,将符合规则的数据包的相关信息记录在日志中,以便管理员的分析和排错 |
NOTRACK | 取消跟踪功能,一般用于在raw表设置,提高WEB服务器的效率。 |
常见问题
iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE
iptables -t nat -A POSTROUTING -o $WAN -j SNAT --to-source $IP
iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 80 -j REDIRECT --to-ports 3128
iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 80 -j DNAT --to-destination $IP --to-ports 3128
实验环境(centos7)
监控所有相关icmp包的流转变化。
iptables -t raw -A OUTPUT -p icmp -j TRACE
iptables -t raw -A PREROUTING -p icmp -j TRACE
modprobe nf_log_ipv4
#加载所需模块儿
然后你就可以在/var/log/messages看到包追踪信息了。
关闭
删除掉TRACE规则即可:
iptables -t raw -D PREROUTING 1
1.直接配置到内存中,但是只是当前生效
echo 1 > /proc/sys/net/ipv4/ip_forward
2.写到配置文件当中
cat <<EOF > /etc/sysctl.d/forward.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
#加载/etc/sysctl.d/*.conf配置文件
#net.ipv4.ip_forward标识着是否转发,为1代表开启转发功能
#net.bridge.bridge-nf-call-iptables 标志着二层网桥的包是否被主机的iptables过滤,为1代表也就意味着二层的网桥在转发包时也会被iptables的FORWARD规则所过滤,为0即iptables不对bridge的数据进行处理。
为什么还需要自定义链呢?
原因如下:
当默认链中的规则非常多时,不方便我们管理。
想象一下,如果INPUT链中存放了200条规则,这200条规则有针对httpd服务的,有针对sshd服务的,有针对私网IP的,有针对公网IP的,假如,我们突然想要修改针对httpd服务的相关规则,难道我们还要从头看一遍这200条规则,找出哪些规则是针对httpd的吗?这显然不合理。
所以,iptables中,可以自定义链,通过自定义链即可解决上述问题。
设置自定义链有以下几个步骤:
示例如下:
示例来自朱双印的博客,连接在文章下文,侵删
1.创建一条名为IN_WEB的自定义链。
2.在这条自定义链上设置一定的规则。
3.现在,自定义链中已经有了一些规则,但是目前,这些规则无法匹配到任何报文,因为我们并没有在任何默认链中引用它。既然IN_WEB链是为了针对web服务的入站规则而创建的,那么这些规则应该去匹配入站的报文,所以,我们应该用INPUT链去引用它。当然,自定义链在哪里创建,应该被哪条默认链引用,取决于实际的工作场景,因为此处示例的规则是匹配入站报文,所以在INPUT链中引用自定义链。
前文提到过,自定义链可以作为target进行跳转
这种自定义链的做法在K8s的网络模型中,以及service的实现方式上都有一定的体现。
nat表的target: SNAT MASQUERADE DNAT REDIRECT
SNAT:一般用于固定IP
--to-source [ipaddr[-ipaddr]][:port[-port]]
--random
#示例:
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! – d 10.0.1.0/24 -j SNAT --to-source 172.18.100.6-172.18.100.9
MASQUERADE:用于动态ip环境中,如拨号网络
--to-ports port[-port]
--random
#示例:
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! – d 10.0.1.0/24 -j MASQUERADE
DNAT:
--to-destination [ipaddr[-ipaddr]][:port[-port]]
#示例
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22:8080
REDIRECT
使用REDIRECT动作可以在本机上进行端口映射,REDIRECT规则只能定义在PREROUTING链或者OUTPUT链中。
--to-ports port[-port]
#示例:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
#当别的机器访问本机的80端口时,报文会被重定向到本机的8080端口上。
iptables -L
#这种命令输出的
iptables-save
#该条命令会将iptables规则输出到标准输出,其输出的形式和当初添加的形式是一样的,这样就让熟悉iptables命令的人很好识别出来。
张磊,极客时间专栏《深入剖析Kubernetes》
鸟哥linux私房菜
文章浏览阅读451次。dev/mem: 物理内存的全镜像。可以用来访问物理内存。/dev/kmem: kernel看到的虚拟内存的全镜像。可以用来访问kernel的内容。调试嵌入式Linux内核时,可能需要查看某个内核变量的值。/dev/kmem正好提供了访问内核虚拟内存的途径。现在的内核大都默认禁用了/dev/kmem,打开的方法是在 make menuconfig中选中 device drivers --> ..._dev/mem 源码实现
文章浏览阅读7.1k次,点赞2次,收藏19次。vxe-table,一个小众但功能齐全并支持excel操作的vue表格组件_vxe-table
文章浏览阅读62次。参考:http://www.ruanyifeng.com/blog/2016/01/babel.htmlBabelBabel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行// 转码前input.map(item => item + 1);// 转码后input.map(function (item) { return item..._让开发环境支持bable
文章浏览阅读2.8k次,点赞6次,收藏29次。摘要:FPGA视频处理FIFO的典型应用,视频输入FIFO的作用,视频输出FIFO的作用,视频数据跨时钟域FIFO,视频缩放FIFO的作用_fpga 频分复用 视频
文章浏览阅读575次。【代码】R语言:设置工作路径为当前文件存储路径。_r语言设置工作目录到目标文件夹
文章浏览阅读452次。格式:background: linear-gradient(direction, color-stop1, color-stop2, ...);<linear-gradient> = linear-gradient([ [ <angle> | to <side-or-corner>] ,]? &l..._background线性渐变
文章浏览阅读1k次,点赞26次,收藏8次。第十三届蓝桥杯青少年组python编程省赛真题一、题目要求(注:input()输入函数的括号中不允许添加任何信息)1、编程实现给定一个正整数N,输出正整数N中各数位最大的那个数字。例如:N=132,则输出3。2、输入输出输入描述:只有一行,输入一个正整数N输出描述:只有一行,输出正整数N中各数位最大的那个数字输入样例:
文章浏览阅读2.2k次。一个网络协议主要由以下三个要素组成:1.语法数据与控制信息的结构或格式,包括数据的组织方式、编码方式、信号电平的表示方式等。2.语义即需要发出何种控制信息,完成何种动作,以及做出何种应答,以实现数据交换的协调和差错处理。3.时序即事件实现顺序的详细说明,以实现速率匹配和排序。不完整理解:语法表示长什么样,语义表示能干什么,时序表示排序。转载于:https://blog.51cto.com/98..._网络协议三要素csdn
文章浏览阅读153次。主要的思想,将所有的系统都可以看作两部分,真正的数据log系统和各种各样的query engine所有的一致性由log系统来保证,其他各种query engine不需要考虑一致性,安全性,只需要不停的从log系统来同步数据,如果数据丢失或crash可以从log系统replay来恢复可以看出kafka系统在linkedin中的重要地位,不光是d..._the log: what every software engineer should know about real-time data's uni
文章浏览阅读746次。伟大是熬出来的 目录 前言 引言 时间熬成伟大:领导者要像狼一样坚忍 第一章 内圣外王——领导者的心态修炼 1. 天纵英才的自信心 2. 上天揽月的企图心 3. 誓不回头的决心 4. 宠辱不惊的平常心 5. 换位思考的同理心 6. 激情四射的热心 第二章 日清日高——领导者的高效能修炼 7. 积极主动,想到做到 8. 合理掌控自己的时间和生命 9. 制定目标,马..._当狼拖着受伤的右腿逃生时,右腿会成为前进的阻碍,它会毫不犹豫撕咬断自己的腿, 以
文章浏览阅读285次。在当今的大数据时代,人们对高速度和高带宽的需求越来越大,迫切希望有一种新型产品来作为高性能计算和数据中心的主要传输媒质,所以有源光缆(AOC)在这种环境下诞生了。有源光缆究竟是什么呢?应用在哪些领域,有什么优势呢?易天将为您解答!有源光缆(Active Optical Cables,简称AOC)是两端装有光收发器件的光纤线缆,主要构成部件分为光路和电路两部分。作为一种高性能计..._aoc 光缆
文章浏览阅读2.2k次。在“桌面”上按快捷键“Ctrl+R”,调出“运行”窗口。接着,在“打开”后的输入框中输入“Gpedit.msc”。并按“确定”按钮。如下图 找到“用户配置”下的“Windows设置”下的“Internet Explorer 维护”的“连接”,双击选择“自动浏览器配置”。如下图 选择“自动启动配置”,并在下面的“自动代理URL”中填写相应的PAC文件地址。如下..._設置proxy腳本