iptables防火墙设置-规则
iptables有五张表(
filter,nat,mangle,raw,security
),五个规则链(prerouting,input,forward,output,postrouting
).要全部弄懂好像有点麻烦,不过先挑常用的来学学还是一个不错的选择.什么是表呢?用过myql数据库的应该很清楚,表是用来存放数据的.就像excel表格一样,将数据一条一条的存到数据库中.同理,这里的表也是这个作用,表里面存放的就是我们写好的规则.为什么又分了五个呢,一个不行吗?我觉得一个也不是不可以,但是那样不是就很乱了吗?分类管理还是挺好的.既然说到分类管理了,那么五条链也就比较好理解了,也是为了分类管理.
在表中存放着许多规则,我们把这些规则分个类,这些类就是链.而每张表的功能又不一样,所以每张表中的链也就不一样了
- nat表:
prerouting,input,output,postrouting
- filter表:
input,forward,output
- mangle:
prerouting,iniput,forward,output,postrouting
- raw表:
prerouting,output
- security表:
input,forward,output
- nat表:
上面这样写应该还是不好理解,到底是怎么起作用的?arch wiki上的这张图很好的展示了如何接收/发送数据.以数据的流向为依据,将这些表和链很好的连接在了一起,非常漂亮.所以又不得不夸夸arch wiki了,写的是真的好.
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
34XXXXXXXXXXXXXXXXXX
XXX Network XXX
XXXXXXXXXXXXXXXXXX
+
|
v
+-------------+ +------------------+
|table: filter| <---+ | table: nat |
|chain: INPUT | | | chain: PREROUTING|
+-----+-------+ | +--------+---------+
| | |
v | v
[local process] | **************** +--------------+
| +---------+ Routing decision +------> |table: filter |
v **************** |chain: FORWARD|
**************** +------+-------+
Routing decision |
**************** |
| |
v **************** |
+-------------+ +------> Routing decision <---------------+
|table: nat | | ****************
|chain: OUTPUT| | +
+-----+-------+ | |
| | v
v | +-------------------+
+--------------+ | | table: nat |
|table: filter | +----+ | chain: POSTROUTING|
|chain: OUTPUT | +--------+----------+
+--------------+ |
v
XXXXXXXXXXXXXXXXXX
XXX Network XXX
XXXXXXXXXXXXXXXXXX看这个表就知道我们主要操作的还是filter表了.下面就操作一下,秀操作的时候到了,有没有操作?(PS:老年人手速,也想有操作?)
iptables的规则书写是有大小写区别的
首先我们不想别人ping我们的ip
sudo iptables -A INPUT -p icmp -j DROP
其实完整的写法是下面这样的(需要指定是那张表),但是它默认就是filter表,而我们操作的也是filter表就省略了
sudo iptables -t filter -A INPUT -p icmp -j DROP
可以查看一下
sudo iptables -S
这样虽然别人不能ping我们了,但是我们发现自己也无法ping别人了,所以得改
这个iptables执行是按顺序一条一条从上向下执行的,所以我们想写在之前写的那条规则上面就要使用
-I
这个参数,insert将规则插入到最上面,如果后面再接一个数字的话,就是插入到指定第几条规则的上面在这里我们可以看到icmp-type对应数字的意义,icmp-type 8代表echo request,就是别人ping我们时怎么回答
sudo iptables -I INPUT -p icmp --icmp-type 8 -j DROP
上面这句话就是别人ping我们时,我们不回答,直接丢弃.其实这里还是没有解决无法ping别人的问题,只是替代了上面那条规则
好,这里就写怎么解决ping别人.前面是别人ping我们时,发给我们的icmp数据包直接丢弃.而我们自己ping别人时是需要别人发给我们一个icmp回应包才算ping通的,所以就要接收这个包咯,前面不是说了不接受包吗?icmp-type 0就是接受我们发给别人后回传的数据包的.通过数据包类型的不同来区分到底是别人ping我们的数据包还是回传的数据包
我们把这条规则加到最开始sudo iptables -I INPUT 1 -p icmp --icmp-type 0 -j ACCEPT
还记得我们添加的第一条规则吗,没有作用了,我们把它删除
sudo iptables -D INPUT 3
然后查看一下现在的规则
sudo iptables -S
最后保存一下,以免下次开机这些规则就丢失了
su iptables-save > /etc/iptables/iptables-rules