基础知识

四表

1
2
3
4
filter表——过滤数据包(确定是否放行数据包)
nat表——用于网络地址转换(IP、端口)(修改数据包的源/目标地址或端口)
mangle表——修改数据包的服务类型、TTL、并且可以配置路由实现QOS(为数据包设置标记)
raw表——决定数据包是否被状态跟踪机制处理(确定是否对数据包进行状态跟踪)
  • filter表拥有INPUT、FORWARD 和 OUTPUT三个规则链,这个规则表顾名思义是用来进行封包过滤的理动作(例如:DROP、 LOG、 ACCEPT 或 REJECT),默认表。
  • nat表拥有 PREROUTING 和 POSTROUTING 两个规则链,主要功能为进行一对一、一对多、多对多等网址转译工作(SNATDNAT),由于转译工作的特性,需进行目的地网址转译的封包,就不需要进行来源网址转译,反之亦然,因此为了提升改写封包的率,在防火墙运作时,每个封包只会经过这个规则表一次。如果我们把封包过滤的规则定义在这个数据表里,将会造成无法对同一包进行多次比对,因此这个规则表除了作网址转译外,请不要做其它用途。
  • mangle表拥有 PREROUTING、FORWARD 和 POSTROUTING 三个规则链。除了进行网址转译工作会改写封包外,在某些特殊应用可能也必须去改写封包(TTL、TOS)或者是设定 MARK(将封包作记号,以进行后续的过滤),这时就必须将这些工作定义在 mangle 规则表中。

五链

1
2
3
4
5
INPUT链——进来的数据包应用此规则链中的策略
OUTPUT链——外出的数据包应用此规则链中的策略
FORWARD链——转发数据包时应用此规则链中的策略
PREROUTING链——对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
POSTROUTING链——对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)

包过滤匹配流程

1
2
3
4
5
6
7
规则顺序对比,匹配则停止(LOG除外),没有匹配按默认规则处理。
表之间的顺序:
raw ——> mangle ——> net ——> filter
链之间的顺序
入站:PREROUTING ——> INPUT
出站:OUTPUT ——> POSTROUTING
转发:PREROUTING ——> FORWARD ——> POSTROUTING

目标动作

1
2
3
4
ACCEPT  允许通过
DROP    直接丢弃,不给出任何回应
REJECT  拒绝通过,会给出提示
LOG 记录日志(匹配则停止规则的唯一例外)

常用选项

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
添加规则
            -A 在链的末尾追加一条规则
            -I 在链的开头或者指定序号插入一条规则
查看规则
            -L 列出所有规则
            -n 以数字形式显示地址、端口等信息
            --line-numbers 显示规则的序号(iptables -nL --line)
删除规则
            -D 删除指定序号的一条规则
            -F 清空所有的规则
默认策略
            -P 为指定的链设置默认规则

匹配条件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
通用匹配
        协议匹配 -p 协议名
        地址匹配 -s 源地址、-d 目标地址
        接口匹配 -i 接收数据的网卡、-o 发送数据的网卡
隐含匹配
        端口匹配 --sport 源端口、-dport目标端口
        ICMP类型匹配 --icmp-type ICMP类型
        TCP标记匹配 --tcp-flags 检查哪些位被设置
扩展匹配
        状态匹配 -m state --state状态值
        MAC地址匹配 -m mac --mac-source MAC地址
        多端口匹配  -m multiport --sports 源端口列表
                   -m multiport --dports 目标端口列表
        IP范围匹配  -m iprange --src-range IP1-IP2
                   -m iprange --dst-range IP1-IP2
扩展匹配的状态跟踪机制
网络连接的物种状态
        NEW   请求建立连接的包,完全陌生的包。
        ESTABLISHED   将要或已经建立连接的包。
        RELATED   与已知某个连接相关联的包。
        INVALID   无对应连接,以及连接无效的包。
        UNTRACKED   未跟踪状态包。

基本使用

ip_forward

1
2
3
4
开启内核路由转发功能
    sysctl -w net.ipv4.ip_forward=1
或者
    echo 1 > /proc/sys/net/ipv4/ip_forward

常用命令

  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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
iptables [-t 表名] 选项 [链名] [条件] [-j目标动作]
    不指定表默认为filter表
    不指定链默认为所有链
设置默认规则
    所有链初始默所有规则为ACCEPT
    iptables -t filter -P INPUT DROP(设置为默认拒绝所有,此规则慎用......)
主机防护,针对入站访问的源地址
    iptables -A INPUT -s 172.30.1.53 -j DROP
    iptables -A INPUT -s 192.168.1.0/24 -j DROP
网络防护,针对转发访问的原地址
    iptables -A FORWARD -s 172.30.1.53 -i eth1 -j DROP 
    iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -j DROP
允许特定的IP访问80端口
    iptables -A INPUT -s 172.30.1.53 -p tcp --dport 80 -j ACCEPT  
    iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT  
允许所有访问80端口
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT
拒绝所有访问80端口
    iptables -A INPUT -p tcp --dport 80 -j DROP
插入一条规则在第二行 (如果不指序号,则默认插入到第一行)
    iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT
删除第二行
    iptables -D INPUT 2
禁ping策略限制
禁止其他主机ping本机
    iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
    iptables -A INPUT -p icmp ! --icmp-type echo-request -j ACCEPT 
允许本机ping其他主机
    iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
    iptables -A OUTPUT -p icmp ! --icmp-type echo-request -j DROP 
丢弃陌生的TCP响应包
    iptables -A INPUT -m state --state NEW -p tcp ! --syn -j DROP 
    iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP 
识别FTP数据连接,
    iptables -A FORWARD -d 172.30.1.53 -p tcp --dport 20:21 -j ACCEPT  
    iptables -A FORWARD -s 172.30.1.53 -p tcp --dport 20:21 -j ACCEPT 
针对FTP被动模式
    iptables -A FORWARD -d 172.30.1.53 -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -A FORWARD -s 172.30.1.53 -m state --state ESTABLISHED,RELATED -j ACCEPT
根据MAC地址封锁主机
     iptables -A INPUT -m mac --mac-source 00:0C:29:74:BE:21 -j DRIP
一条规则开放多个端口
     iptables -A INPUT -p tcp -m multiport --dports 20:25,80,110,143,3306,10051, -j ACCEPT 
     (21:25 代表21到25 冒号表示连续 ,21,25代表 21和25 逗号则为分隔符 )
根据IP范围封锁主机
     iptables -A INPUT -p tcp --dport 3306 -m iprange --src-range 192.168.1.10-192.168.1.20 -j DROP

POSTROUTING 源地址伪装
通过伪装 192.168.4.0 网段的机器上网,首先防火墙本机可以访问互联网
     iptables -t nat -A POSTROUTING -s 192.168.4.0 -j SNAT --to-source 防火墙外网ip地址
PERROUTING 目的地址转换
所有访问防火墙 10022 端口的请求都转发给后端的 192.168.4.15 的 22 端口
     iptables -t nat -A PREROUTING -p tcp --dport 10022 -j DNAT --to-destination 192.168.4.15:22
# 注意:iptables 不是服务,只是生效规则或者清空规则,规则关机重置。
把它定义成service 是为了让他开机自动生效规则,想要永久生效保存规则
     service iptables save
规则会被保存至/etc/sysconfig/iptables 文件中,start 时会读取此文件中的规则,
     iptables-save > /path/to/some_rulefile 保存iptables规则至别的位置,
     iptables-restore < /path/to/some_rulefile 从自定义的位置读取iptables规则并使之生效。 
所有链初始默所有规则为ACCEPT
     iptables -t filter -P INPUT DROP(设置为默认拒绝所有,此规则慎用......)
在设置此规则之前应该先允许重要的规则,比如ssh的端口。
     iptables -A INPUT -p tcp --dport 22 -j ACCEPT
     iptables -F  若不指定表,默认只清空filter表,(默认规则为DROP时,此规则慎用......)
在默认规则为DROP时,默认为拒绝所有,如果这个时候再iptables -F 清空filter开放的规则,这个时候会断开所有连接。
######################################################
# 常用命令(-A追加规则、-D删除规则、-R修改规则、-I插入规则、-L查看规则)
命令-A,--append
范例 iptables -A INPUT ...
说明新增规则(追加方式)到某个规则链(这里是INPUT规则链)中,该规则将会成为规则链中的最后一条规则。
命令-D,--delete
范例 iptables -D INPUT --dport 80 -j DROP
iptables -D INPUT 1
说明 从某个规则链中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。
命令-R, --replace
范例 iptables -R INPUT1-s 192.168.0.1 -j DROP
说明取代现行规则,规则被取代后并不会改变顺序。(1是位置)
命令-I,--insert
范例 iptables -I INPUT1--dport 80 -j ACCEPT
说明插入一条规则,原本该位置(这里是位置1)上的规则将会往后移动一个顺位。
命令-L, --list
范例 iptables -L INPUT
说明 列出某规则链中的所有规则。
命令-F, --flush
范例 iptables -F INPUT
说明 删除某规则链(这里是INPUT规则链)中的所有规则。
命令-Z,--zero
范例 iptables -Z INPUT
说明 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。
命令-N, --new-chain
范例 iptables -N allowed
说明 定义新的规则链。
命令-X, --delete-chain
范例 iptables -X allowed
说明 删除某个规则链。
命令-P, --policy
范例 iptables -P INPUT DROP
说明 定义过滤政策。 也就是未符合过滤条件之封包,预设的处理方式。
命令-E,--rename-chain
范例 iptables -E allowed disallowed
说明 修改某自订规则链的名称。
# 常用封包比对参数:(-p协议、-s源地址、-d目的地址、--sport源端口、--dport目的端口、-i进入网卡、-o 出去网卡)
参数-p, --protocol(指定协议)
范例 iptables -A INPUT -p tcp(指定协议)      -p all   所有协议,  -p !tcp 去除tcp外的所有协议。
说明 比对通讯协议类型是否相符,可以使用 ! 运算子进行反向比对,例如:-p ! tcp ,
意思是指除 tcp 以外的其它类型,包含udp、icmp ...等。如果要比对所有类型,则可以使用 all 关键词,例如:-p all。
参数-s, --src, --source(指定源地址,指定源端口--sport)
例如: iptables -A INPUT -s 192.168.1.1
说明 用来比对封包的来源 IP,可以比对单机或网络,比对网络时请用数字来表示屏蔽,
例如:-s 192.168.0.0/24,比对 IP 时可以使用 ! 运算子进行反向比对,
例如:-s ! 192.168.0.0/24。
参数-d, --dst, --destination(指定目的地址,指定目的端口--dport)
例如: iptables -A INPUT -d 192.168.1.1
说明 用来比对封包的目的地 IP,设定方式同上。
参数-i, --in-interface(指定入口网卡)      -i  eth+   所有网卡
例如: iptables -A INPUT -i eth0
说明 用来比对封包是从哪片网卡进入,可以使用通配字符 + 来做大范围比对,
例如:-i eth+ 表示所有的 ethernet 网卡,也以使用 ! 运算子进行反向比对,
例如:-i ! eth0。
参数-o, --out-interface(指定出口网卡)
例如: iptables -A FORWARD -o eth0
说明 用来比对封包要从哪片网卡送出,设定方式同上。
参数--sport, --source-port(源端口)
例如: iptables -A INPUT -p tcp --sport 22
说明 用来比对封包的来源端口号,可以比对单一埠,或是一个范围,
例如:--sport 22:80,表示从 22 到 80 端口之间都算是符合件,
如果要比对不连续的多个埠,则必须使用--multiport 参数,详见后文。比对埠号时,可以使用 ! 运算子进行反向比对。
参数--dport, --destination-port(目的端口)
例如: iptables -A INPUT -p tcp --dport 22
说明 用来比对封包的目的端口号,设定方式同上。
参数--tcp-flags(只过滤TCP中的一些包,比如SYN包,ACK包,FIN包,RST包等等)
例如: iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
说明  比对 TCP 封包的状态旗号,参数分为两个部分,第一个部分列举出想比对的旗号,
第二部分则列举前述旗号中哪些有被设,未被列举的旗号必须是空的。TCP 状态旗号包括:SYN(同步)、ACK(应答)、
FIN(结束)、RST(重设)、URG(紧急)PSH(强迫推送) 等均可使用于参数中,除此之外还可以使用关键词 ALL 和
NONE 进行比对。比对旗号时,可以使用 ! 运算子行反向比对。
参数--syn
例如: iptables -p tcp --syn
说明 用来比对是否为要求联机之 TCP 封包,与 iptables -p tcp --tcp-flags SYN,
FIN,ACK SYN 的作用完全相同,如果使用 !运算子,可用来比对非要求联机封包。
参数-m multiport --source-port
例如: iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
说明 用来比对不连续的多个来源埠号,一次最多可以比对 15 个埠,可以使用 !
运算子进行反向比对。
参数-m multiport --destination-port
例如: iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
说明 用来比对不连续的多个目的地埠号,设定方式同上。
参数-m multiport --port
例如: iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
说明 这个参数比较特殊,用来比对来源埠号和目的埠号相同的封包,设定方式同上。
注意:在本范例中,如果来源端口号为 80目的地埠号为 110,这种封包并不算符合条件。
参数--icmp-type
例如: iptables -A INPUT -p icmp --icmp-type 8
说明 用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。
请打 iptables -p icmp --help 来查看有哪些代码可用。
参数-m limit --limit
例如: iptables -A INPUT -m limit --limit 3/hour
说明 用来比对某段时间内封包的平均流量,上面的例子是用来比对:每小时平均流量是
否超过一次 3 个封包。 除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,
默认值为每小时平均一次,参数如后: /second、 /minute、/day。 除了进行封数量的
比对外,设定这个参数也会在条件达成时,暂停封包的比对动作,以避免因骇客使用洪水
攻击法,导致服务被阻断。
参数--limit-burst
范例 iptables -A INPUT -m limit --limit-burst 5
说明 用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超
过 5 个(这是默认值),超过此上限的封将被直接丢弃。使用效果同上。
参数-m mac --mac-source
范例 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
说明 用来比对封包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 POSTROUTING规则炼上,这是因为封包要送出到网后,才能由网卡驱动程序透过 ARP 通讯协议查出目的地的 MAC 地址,所以 iptables 在进行封包比对时,并不知道封包会送到个网络接口去。
参数--mark
范例 iptables -t mangle -A INPUT -m mark --mark 1
说明 用来比对封包是否被表示某个号码,当封包被比对成功时,我们可以透过 MARK 处理动作,将该封包标示一个号码,号码最不可以超过 4294967296。
参数-m owner --uid-owner
范例 iptables -A OUTPUT -m owner --uid-owner 500
说明 用来比对来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用
root 或其它身分将敏感数据传送出,可以降低系统被骇的损失。可惜这个功能无法比对出
来自其它主机的封包。
参数-m owner --gid-owner
范例 iptables -A OUTPUT -m owner --gid-owner 0
说明 用来比对来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。
参数-m owner --pid-owner
范例 iptables -A OUTPUT -m owner --pid-owner 78
说明 用来比对来自本机的封包,是否为某特定行程所产生的,使用时机同上。
参数-m owner --sid-owner
范例 iptables -A OUTPUT -m owner --sid-owner 100
说明 用来比对来自本机的封包,是否为某特定联机(Session ID)的响应封包,使用时
机同上。
参数-m state --state
范例 iptables -A INPUT -m state --state RELATED,ESTABLISHED
说明 用来比对联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。
INVALID 表示该封包的联机编号(Session ID)无法辨识或编号不正确。
ESTABLISHED 表示该封包属于某个已经建立的联机。
NEW 表示该封包想要起始一个联机(重设联机或将联机重导向)。
RELATED 表示该封包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA 联机必定是源自某个 FTP 联机。
# 常用的处理动作: (-j  指定对满足条件包的处理,常用动作有ACCEPT接受报、DROP丢弃报、REJECT丢弃报并通知对方、REDIRECT重定向包等)
-j   参数用来指定要进行的处理动作,常用的处理动作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,分别说明如下:
ACCEPT将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链(natostrouting)。
REJECT拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
例如:iptables -A FORWARD -p TCP --dport 22 -j REJECT--reject-with tcp-reset
DROP丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
REDIRECT将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。
这个功能可以用来实作通透式porxy 或用来保护 web 服务器。
例如:iptables -tnat-A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8080
MASQUERADE改写封包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则(mangleostrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。
例如:iptables -tnat-A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
LOG将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完此处理动作后,将会继续比对其规则。
例如:iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
SNAT改写封包来源IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则(mangleostrouting)。
例如:iptables -tnat-A POSTROUTING -p tcp-o eth0 -j SNAT--to-source194.236.50.155-194.236.50.160:1024-32000
DNAT改写封包目的地IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规炼(filter:input 或 filter:forward)。
例如:iptables -tnat-A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT--to-destination 192.168.1.1-192.168.1.10:80-100
MIRROR镜射封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。
QUEUE中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,
例如:计算联机费......等。
RETURN结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当提早结束子程序并返回到主程序中。
MARK将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。
例如:iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
###########################
# 按来源MAC地址匹配
# iptables -t filter -A FORWARD-m --mac-source 00:02:b2:03:a5:f6-j DROP
拒绝转发来自该MAC地址的数据包
# 按多端口或连续端口匹配
20:表示20以后的所有端口
20:100表示20到100的端口
:20表示20之前的所有端口
-m multiport [--prots, --sports,--dports]
例子:
# iptables -A INPUT -p tcp -m multiport --dports 21,20,25,53,80 -j ACCEPT 【多端口匹配】
# iptables -A INPUT -p tcp --dport 20: -j ACCEPT
# iptables -A INPUT -p tcp --sport 20:80 -j ACCEPT
# iptables -A INPUT -p tcp --sport :80 -j ACCEPT
# 按数据包速率和状态匹配
-m limit --limit匹配速率 如: -m limit --limit 50/s -j ACCEPT
-m state --state 状态 如: -m state --state INVALID,RELATED -j ACCEPT
# 限制链接数
-m connlimit --connlimit-above n 限制为多少个
例如:
iptables -I FORWARD -p tcp -m connlimit --connlimit-above 9 -j DROP        //表示限制链接数最大为9个
# 模拟随机丢包率
iptables -A FORWARD -p icmp -m statistic --mode random --probability 0.31  -j REJECT   //表示31%的丢包率
或者
-m random --average 5 -j DROP 表示模拟丢掉5%比例的包

###########################
###########################

iptables -L

    查看filter表的iptables规则,包括所有的链。filter表包含INPUT、OUTPUT、FORWARD三个规则链。
    说明:-L是--list的简写,作用是列出规则。

iptables -L [-t 表名]

    只查看某个表的中的规则。
    说明:表名一共有三个:filter,nat,mangle,如果没有指定表名,则默认查看filter表的规则列表(就相当于第一条命令)。
    举例:iptables -L -t filter

iptables -L [-t 表名] [链名]

    这里多了个链名,就是规则链的名称。
    说明:iptables一共有INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING五个规则链。
    举例:iptables -L INPUT
    注意:链名必须大写。在Linux系统上,命令的大小写很敏感。

 

iptables -n -L

    说明:以数字形式显示规则。如果没有-n,规则中可能会出现anywhere,有了-n,它会变成0.0.0.0/0

iptables -nv -L

    说明:你也可以使用“iptables -L -nv”来查看,这个列表看起来更详细。
    如果想删除iptables规则我们可以如下操作
    删除用-D参数
    删除之前添加的规则(iptables -A INPUT -s 192.168.1.5 -j DROP):

 

iptables -D INPUT -s 192.168.1.5 -j DROP

    有时候要删除的规则太长,删除时要写一大串,既浪费时间又容易写错,这时我们可以
    先使用–line-number找出该条规则的行号,再通过行号删除规则。

    iptables -nv --line-number


#iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#iptables -A INPUT -p tcp --dport 110 -j ACCEPT
#iptables -A INPUT -p tcp --dport 25 -j ACCEPT
#iptables -A INPUT -p tcp --dport 21 -j ACCEPT
#iptables -A INPUT -p tcp --dport 20 -j ACCEPT
#iptables -A INPUT -p tcp --dport 53 -j ACCEPT
#iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT 
#iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话)
iptables -A INPUT -p icmp -j ACCEPT (INPUT设置成DROP的话)
允许loopback!(不然会导致DNS无法正常关闭等问题)
IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP)
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)
下面写OUTPUT链,OUTPUT链默认规则是ACCEPT,所以我们就写需要DROP(放弃)的链.
减少不安全的端口连接
iptables -A OUTPUT -p tcp --sport 31337 -j DROP
iptables -A OUTPUT -p tcp --dport 31337 -j DROP

我们只允许192.168.0.3的机器进行SSH连接
iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT

如果要允许,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP.
24表示子网掩码数.但要记得把 /etc/sysconfig/iptables 里的这一行删了.
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 因为它表示所有地址都可以登陆.
或采用命令方式:
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
这样写 !192.168.0.3 表示除了192.168.0.3的ip地址
其他的规则连接也一样这么设置.
在下面就是FORWARD链,FORWARD链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链,对正在转发链的监控.开启转发功能,(在做NAT时,FORWARD默认规则是DROP时,必须做)

iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT
丢弃坏的TCP包

iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP

处理IP碎片数量,防止攻击,允许每秒100个
iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包. 
iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT

### 删除

删除用-D参数
删除之前添加的规则(iptables -A INPUT -s 192.168.1.5 -j DROP):
iptables -D INPUT -s 192.168.1.5 -j DROP有时候要删除的规则太长,删除时要写一大串,既浪费时间又容易写错,这时我们可以先使用–line-number找出该条规则的行号,再通过行号删除规则。
iptables -nv --line-number
iptables -nL --line-number

不管你在安装linux时是否启动了防火墙,如果你想配置属于自己的防火墙,那就清除现在filter的所有规则.

iptables -F        清除预设表filter中的所有规则链的规则
iptables -X        清除预设表filter中使用者自定链中的规则
iptables -L -n



设定预设规则

iptables -p INPUT DROP
iptables -p OUTPUT ACCEPT
iptables -p FORWARD DROP

上面的意思是,当超出了IPTABLES里filter表里的两个链规则(INPUT,FORWARD)时,不在这两个规则里的数据包怎么处理呢,那就是DROP(放弃).应该说这样配置是很安全的.我们要控制流入数据包

而对于OUTPUT链,也就是流出的包我们不用做太多限制,而是采取ACCEPT,也就是说,不在着个规则里的包怎么办呢,那就是通过.

可以看出INPUT,FORWARD两个链采用的是允许什么包通过,而OUTPUT链采用的是不允许什么包通过.

修改使用-R参数

iptables -nL --line-number

Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination

1    DROP       all  --  192.168.1.1          0.0.0.0/0

2    DROP       all  --  192.168.1.2          0.0.0.0/0

3    DROP       all  --  192.168.1.5          0.0.0.0/0

将第三条规则改为ACCEPT:

iptables -R INPUT 3 -j ACCEPT再查看下:

iptables -nL --line-number

Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination

1    DROP       all  --  192.168.1.1          0.0.0.0/0

2    DROP       all  --  192.168.1.2          0.0.0.0/0

3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0

第三条规则的target已改为ACCEPT。

其他

1
2
3
4
5
6
Linux 中延时模拟,设置延时 3s
tc qdisc add dev eth0 root netem delay 3000ms
可以在 3000ms 后面在加上一个延时,比如 ’3000ms 200ms‘表示 3000ms ± 200ms ,延时范围 28003200 之间.
Linux 中丢包模拟,设置丢包 50% 
tc qdisc change dev eth0 root netem loss50%
丢包比率修改成 ’50% 80%’ 时,指丢包比率为 50-80% 之间。