Linux系统 iptables进阶学习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
一、IPTABLES四表五链学习:
(1)Filter表:是iptables的默认表,它有以下三种内建链(chains):
INPUT链 – 处理来自外部的数据。
OUTPUT链 – 处理向外发送的数据。
FORWARD链 – 将数据转发到本机的其他网卡设备上。
(2)NAT表:NAT表有三种内建链:
PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。
POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
OUTPUT链 – 处理本机产生的数据包
(3)Mangle表:Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链(chains):
PREROUTING
OUTPUT
FORWARD
INPUT
POSTROUTING
(4) Raw表:Raw表用于处理异常,它具有2个内建链:
PREROUTING chain
OUTPUT chain
 
二、IPTABLES 规则(Rules)学习:
Rules包括一个条件和一个目标(target)
如果满足条件,就执行目标(target)中的规则或者特定值。
如果不满足条件,就判断下一条Rules。
 
三、目标值(Target Values)在target里指定的特殊值:
ACCEPT – 允许防火墙接收数据包
DROP – 防火墙丢弃包
QUEUE – 防火墙将数据包移交到用户空间
RETURN – 防火墙停止执行当前链中的后续Rules,并返回到调用链(the calling chain)中。
 
四、查看表规则命令:
查看各表中的规则命令:iptables -t filter --list 相当于 iptables -nL
查看mangle表:iptables -t mangle --list
查看NAT表:iptables -t nat --list
查看RAW表:iptables -t raw --list
 
五、清空所有iptables规则
注:在配置iptables之前,你通常需要用iptables --list命令或者iptables-save命令查看有无现存规则,因为有时需要删除现有的iptables规则
iptables --flush
或者
iptables -F
例如清除iptables nat表规则 :iptables -t nat -F
 
六、永久生效
说明:当你删除、添加规则后,这些更改并不能永久生效,这些规则很有可能在系统重启后恢复原样。如下配置让配置永久生效
(1)生效方式1:
yum install -y iptables*
service iptables save(默认保存的配置在/etc/sysconfig/iptables
重启iptables服务
service iptables stop
service iptables start
systemctl enable iptables.service
(1)生效方式2:
iptables-save > /etc/sysconfig/iptables.rules
chmod 755 /etc/sysconfig/iptables.rules
/etc/rc.local里添加下面这段文件(执行上面这条命令会自动添加,但是要有755权限)。权限为755
iptables-restore < /etc/sysconfig/iptables.rules 或者 iptables-restore /etc/sysconfig/iptables.rules
 
七、追加iptables规则
(1)追加规则的完整实例:仅允许SSH服务
1.清空所有iptables规则
iptables -F
2.接收目标端口为22的数据包
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
3.拒绝所有其他数据包
iptables -A INPUT -j DROP
 
八、更改默认策略(禁止操作,否则你就无法ssh连接了,只能重启解决)
(1)给三个链单独添加DROP规则
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -A FORWARD -j DROP
(2)更改默认策略
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
 
九、配置应用程序规则
(1)允许接收远程主机的SSH请求
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
(2)允许发送本地主机的SSH响应
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
说明:
-m state: 启用状态匹配模块(state matching module)
–-state: 状态匹配模块的参数。当SSH客户端第一个数据包到达服务器时,状态字段为NEW;建立连接后数据包的状态字段都是ESTABLISHED
–sport 22: sshd监听22端口,同时也通过该端口和客户端建立连接、传送数据。因此对于SSH服务器而言,源端口就是22
–dport 22: ssh客户端程序可以从本机的随机端口与SSH服务器的22端口建立连接。因此对于SSH客户端而言,目的端口就是22
(3)如果服务器也需要使用SSH连接其他远程主机,则还需要增加以下配置:
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
 
10、规则增删改查等相关参数
iptables -t nat -D POSTROUTING 1
-A 追加规则-->iptables -A INPUT
-D 删除规则-->iptables -D INPUT 1(编号)
-R 修改规则-->iptables -R INPUT 1 -s 192.168.1.0 -j DROP 取代现行规则,顺序不变(1是位置)
-I 插入规则-->iptables -I INPUT 1 --dport 22 -j ACCEPT 插入一条规则,原本位置上的规则将会往后移动一个顺位
-L 查看规则-->iptables -L INPUT 列出规则链中的所有规则
-N 新的规则-->iptables -N allowed 定义新的规则
 
 
(1)查看Filter表中的所有链以及规则
iptables -nL --line-numbers
(2)向Filter表的INPUT链中新增接收所有来自192.168.1.1的数据包并指定其序号为2,如果占用其他主机IP的序号,则其他主机序号会往下递减一个序号
iptables -I INPUT 1 -s 192.168.1.1/32 -j ACCEPT
iptables -I INPUT 1 -s 192.168.1.2/32 -j ACCEPT
(3)删除Filter表中INPUT链中序号为2的规则
iptables -D INPUT 2
(4)向filter表的INPUT链中追加(-A)一条拒绝所有发送到192.168.1.1的数据包
iptables -A INPUT -d 192.168.1.1/32 -j DROP
(5)在nat表的PREROUTING链中新增一条序号为1的LOG规则(LOG目标通常放在对数据包过滤和处理前,可以用来分析数据包流向。)
说明:-I:表示insert,即向链中插入一条规则,PREROUTING为链名,没有指定序号默认为1,即顶部插入; -j:规则目标(Target),LOG代表获取数据包并打印日志; --log-prefix:日志信息的前缀,只能在-j LOG的情况下使用
iptables -I PREROUTING -t nat -j LOG --log-prefix "[NAT_PREROUTING_LOG]"
(6)实战篇:
1、禁止源地址192.168.1.1访问服务器的22,53,80端口
iptables -I INPUT -s 192.168.1.1/32 -p tcp -m multiport --dport 22,53,80 -j DROP
2、对于访问量比较大的服务器,例如192.168.1.1,可以通过raw表配置绕过连接跟踪:
iptables -t raw -A PREROUTING -d 192.168.1.1/32 -p tcp --dport 80 -j NOTRACK
3、将访问192.168.1.1:80的请求转到192.168.1.2:9000上
iptables -t nat -A PREROUTING -d 192.168.1.1 -t tcp --dport 80 -j DNAT --to-destination 192.168.1.2:9000
4、将访问本机的udp 314端口转发到3140上
 iptables -t nat -A PREROUTING -p udp --dport 314 -j DNAT --to-destination 124.222.170.39:3140
5、实现所有192.168.1.0/24的地址通过123.123.123.123公网地址访问公网
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 123.123.123.123
6、拒绝一分钟内新建超过4次SSH连接的IP再次连接
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SSH --rsource
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name SSH --rsource -j DROP
 
IPTABLES模块学习:
一、multiport模块:(连续匹配多个端口)
(1)要求192.168.1.0/24网段的所有IP只能访问22,80,443端口,其他的拒绝(该命令具有风险)
iptables -t filter -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -s 192.168.1.0/24 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -s 192.168.1.0/24 -j ACCEPT
iptables -t filter -A INPUT -p tcp -j DROP
或者:(只放开22,80,443端口)
iptables -t filter -A INPUT -p tcp -m multiport --dport 22,80,443 -j ACCEPT
iptables -t filter -A INPUT -p tcp  -j DROP
 
(2)要求192.168.1.0/24网段的所有ip只能访问22-90端口,其他拒绝
iptables -t filter -A INPUT -p tcp -m multiport --dport 22:90 -j ACCEPT
iptables -t filter -A INPUT -p tcp  -j DROP(其他未被允许的端口禁止访问)
iptables -t filter -A INPUT -p tcp  -m multiport --dports 80,22,8080:9090 -j ACCEPT (对所有的地址开放本机的tcp 80、22、8080-9090端口的访问)
 
二、iprange模块:(连续匹配多个IP)
--src-range : 源地址范围
--dest-range: 目标地址范围
(1)要求只有192.168.1.1到192.168.1.20访问23端口,其他的拒绝
iptables -t filter -A INPUT -p tcp -m iprange --src-range 192.168.1.1-192.168.1.20 -j ACCEPT
iptables -t filter -A INPUT -p tcp  -j DROP
 
三、string模块:(按照内容进行匹配)
--string parttern:指定要匹配的字符串
--algo {bm|kmp}:匹配的查询算法
(1)要求访问的内容包含hello的内容不允许访问,其他的可以
iptables -t filter -A OUTPUT -p tcp -m string --string "hello" --algo kmp -j DROP
 
四、time模块(UTC时间):根据时间来控制访问(UTC)可以指定个端口
--timestart hh:mm[:ss]:开始时间
--timestop hh:mm[:ss]:结束时间
--monthdays day[,day...]:指定一个月的某一天
--weekdays day[,day...]:指定周还是周天
(1)要求上午的08:00到上午的10:30不允许访问,其他时间可以(UTC时间比北京时间要提前8个小时)
iptables -t filter -A INPUT -p tcp -m time --timestart 00:00 --timestop 02:30 -j DROP
 
五、icmp模块:(控制icmp协议)
--icmp-type{type[/code]|typename}
echo-request(8)请求(我可以ping别人,别人休想ping我)
echo-reply(0)回应(别人可以ping我,我休想ping别人)
(1)禁止他人ping我,但本主机可以ping他人
iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j DROP
(2)他人可以ping我,但本主机不能ping他人
iptables -t filter -I INPUT -p icmp --icmp-type "echo-reply" -j DROP
(3)允许对所有的地址开放本机的基于ICMP协议的数据包
iptables -t filter -A INPUT -p icmp -j ACCEPT
 
六、connlimit模块:(控制并发数)没有什么用
--connlimit-upto n:如果现有连接数小于或等于n则匹配
--connlimit-above n: 如果现有连接数大于n则匹配
(1)要求登录192.168.1.1 的窗口最多两个
 iptables -t filter -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
 
七、limit模块:(针对 报文速率 进行限制。秒、分钟、小时、天)
--limit rate[/secon|/mintue|/hour|/day] :报文数量
--limit-burst number:报文数量(默认:5)
数据包数量=网速*1000/1500
限速:限制传输的宽带不可以超过500k(500*1000/1500=333包)
(1)要求每秒只能够传输500k大小的数据
iptables -t filter -A INPUT -p tcp -m limit --limit 333/s -j ACCEPT
iptables -t filter -A INPUT -p icmp  -j DROP
(2)允许10个数据报文快速通过,超过的数据报文1/m(一分钟一个)
iptables -t filter -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT
iptables -t filter -A INPUT -p icmp  -j DROP

  

posted @   LB_运维技术  阅读(109)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示