[CentOS/Debian]关于 Iptables&Ip6tables 防火墙的配置及保存应用

2017年10月10日 0 条评论 917 次阅读 0 人点赞

前面几篇博文算是把博主这几天搬迁博客的事和经验说得差不多了,所以这个大概会是近期最后的一篇有关搬迁事件的博文了。_(:3」∠)_

在你准备开始建站或者迁移网站到新 VPS 上的时候,免不了要跟这个 Iptables 打交道,它就是一个 Linux 系系统的自带防火墙,通过书写配置有关规则,你可以决定你的 VPS 哪些端口对外开放,哪些不对外开放,哪些是有限制条件的开放。当然关于 Iptables 还有更过更高级的玩法,不过本篇博文只是简单的说一下怎么来配置这个防火墙的规则,更高级的玩法,还需要大家自己好好摸索。

注意:以下的操作,只涉及到 filter 表,有关 Iptables 和链的区别,以及涉及其它表的操作,不在本文所讨论的范围内。

 

关于 filter 表

filter 表用于存放所有与防火墙相关操作的默认表。我们平常要用到的,允许 VPS 哪些端口能对外访问和禁止某些端口的操作,都在这个表里进行,该表默认的有三条链:

  1. INPUT:针对入站规则
  2. OUTPUT:针对出站规则
  3. FORWARD:针对转发规则

 

关于规则的有关参数说明

Iptables 的参数有很多,这里只跟大家分享几个平常用得比较多的参数。

先给大家举个例子(请注意大小写!):

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

最开始的 iptables,是告诉服务器要执行的命令是什么的,如果你是直接在规则文件里修改的,那么这里可以不用管,但是如果你是想敲命令直接应用的,则必须要带上。

  • -A

这里可以有两种选择:-A 和-I(注意大小写),如果你选择了-A,那么就是告诉防火墙,把这个规则放在 XXXX 链的最后一个执行(XXXX 链和后面写的参数有关,比如这里写的是 INPUT,就是放在 INPUT 链的最后执行),而-I 则恰恰相反,它是放在最前面执行。同时如果用了 -I,你还可以选择在指定的地方插入规则,比如 -I INPUT 2,插入规则到 INPUT 链的第二条。

  • INPUT

前面已经说过了,默认有三条链,INPUT、OUTPUT、FORWARD。区别请看上面的说明。

  • -p

这个是用来指定协议名的,一般的协议主要是 tcp、udp 和 icmp。我们平常上网看的网页,一般使用的是 tcp,端口号是 80 或者 443。

  • --dport

这里主要有两种区别,--dport 和 --sport,他们后面接的是具体的端口号。两者的区别,一个是目的端口,一个是来源端口,简单的说,一个请求从 A 到 B,dport 是最终到达处 B 的端口,sport 则是 A 的端口。这个不管是 INPUT 链还是 OUTPUT 链都是如此,只不过理解上有点区别,注意不要弄错。

上面例子里的,用的是 --dport,端口 22,也就是指定的是别人(A)访问我们的 VPS(B)的 22 端口。

  • 22

这里写的是你的规则要针对的端口号。

  • -j

动作的意思,用来指定对端口采取怎样的操作,后面接具体的操作命令。

  • ACCEPT

这里就是写对端口具体的操作,一般的会用到的是三种:ACCEPT(放行),DROP(丢弃),REJECT(拒绝)。

其中后面两种可能就结果来说差不多,只是一个有明确告知对方拒绝,一个是就算收到了也不会告诉你,直接就搁置不管了(DROP)。

 

这是对防火墙最简单的使用规则,当然还有一点其它的玩法,比如下面这个:

iptables -A INPUT -i lo -j ACCEPT

这条规则,比起前面的要短了很多,对比一下前面的说明,你就会发现,它少了前面指定某个协议的端口号的操作,而多了个 -i(注意是小写)和 lo,那么它们是什么意思呢?

  • -i

这里有两种命令,一个是-i,一个是-o(都为小写),两者后面接的是网络接口,比如 eth0 和 lo 接口,-i 是指定从 XX 接口进入的该怎么做,-o 是指定从 XX 接口出去的该怎么做。

  • lo

正如前面说的,这里指的是网络接口。

那么这个规则什么意思呢?它是指允许本地回环接口(lo),也就是说可以本机访问本机的东西而不做任何限制。

 

还有一种更简洁,是这样的:

-A OUTPUT -j ACCEPT

这个最短的,意思是允许 OUTPUT 链的所有访问。也就是本机对外面的网站或者其它东西的所有访问都不做限制。

还有类似的:

iptables -A INPUT -j REJECT

iptables -A FORWARD -j REJECT

他们分别说的是,拒绝对 OUTPUT 链的访问,也就是拒绝所有对你 VPS 的访问。拒绝 FORWARD 链的访问,也就是拒绝 VPS 的所有转发访问请求。

 

如果你有注意,一般在你的防火墙规则里,还会有下面这样的一句:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

这里面又多了-m state --state ESTABLISHED,RELATED 这些内容。那么他们又是什么意思呢?

  • -m

指定一些 iptables 的扩展模块,后面接模块名称。

  • state

这是说的状态模块,因为我们网站一般的防火墙规则只涉及到这个,就不说别的了,有兴趣的可以自己找找。

  • --state

前面 state 状态模块的具体指定选项,后面接的是具体的状态名称。

  • ESTABLISHED,RELATED

这里只说这么几个:ESTABLISHED(已经连接成功的状态),NEW(想要新建立连接的状态),RELATED(指这个连接和我们的主机发送出去的有关)。

那么这个规则的解读,应该是允许已经连接的和相关连的连接我们的 VPS。

举个例子:如果你前面输入了拒绝所有对 INPUT 链的访问,在此之前没输入上面这条命令,那么可能你自己正连接着的 SSH (已经连接成功状态)就会马上断开。

 

Iptables 规则的执行顺序及建议

前面咱们有说到-A 和 -I,一个是插在最后,一个是插在最前,为什么有这种区别呢?那是因为,Iptables 对规则的执行和匹配,是有先后顺序的(从上往下匹配)。

举个例子,我写了下面的规则:

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j REJECT

这两条,前面是允许外面的人访问我们 VPS 的 22 端口,一个确是拒绝外面的人对我们 VPS 所有端口的访问,那这不是冲突了吗?其实不会,按照 Iptables 的匹配顺序,先允许在前面的 22 端口可以被访问,至于后面的拒绝所有,虽然也会被执行,但是因为前面已经放行了 22 端口,所以这个拒绝所有里,并不会包含有 22 端口。

根据这个道理,我个人的建议是:如果你要自己动手写规则,那么请注意先写哪些端口能被访问,最后再来写与这个例子类似的拒绝规则,以防止把自己给挡在了外面。同时如果你最后要封了除你选择的端口以外的全部其它端口,那么请注意一定要把需要用到的端口都加进允许规则里,比如你要用到的 SSH 管理端口,网站需要用到的 80 和 443 端口。

 

关于 Ip6tables 的说明

我们知道,现在除了我们用的最多的 IPv4,还有个 IPv6,在这方面,如果你的 VPS 支持 IPv6,那么你不仅需要写 Iptables 规则,还需要再写一份 Ip6tables 规则。不过好在两者的规则差别并不是很大,只是在协议名称哪里会有点区别,比如在 Iptables 里是 icmp 协议,在 Ip6tables 里,就应该是 icmpv6 协议。此外需要注意的是,IPv4 的规则不一定适合 IPv6 用,因为 IPv6 要能够正常使用,往往需要更多的协议和端口的支持。

 

CentOS 和 Debian 如何配置和应用 Iptables&Ip6tables 规则

在开始后面的操作说明以前,给大家的一点建议!请千万要在操作规则之前,查看已有的 iptables 和 ip6tables 规则!

使用的查看命令如下:

iptables -L -n
ip6tables -L -n

如果你想自己从头开始添加规则,则记得先使用如下命令清除所有已有的规则:

iptables -F
ip6tables -F

注:关于清除的命令和查看的命令,这里还需要说的很多,不过今天时间有限,不懂的请留言问或者自行网上搜索吧!

 

CentOS

CentOS 博主只用过 Iptables,所以只能跟大家说说 Iptables 的了。

 

方法一:直接编辑规则文件

1.在 SSH 窗口中输入如下命令(前面的 vi 根据你自己的喜好来选择用什么来编辑)

vi /etc/sysconfig/iptables

2.打开规则文件之后,输入 a 或者 i 来进入编辑模式,输入规则,举例如下:

-A INPUT -p tcp --dport 22 -j ACCEPT

注意:编辑规则文件的时候,规则最前面不需要带 iptables。

3.编辑好之后,按 Esc 键退出编辑模式,再输入 :wq 保存并退出。

4.在 SSH 下输入 service iptables restart 重启防火墙使配置生效。

 

方法二:使用 iptables 命令

注意:这种方法生效的规则重启后可能丢失。

直接在 SSH 窗口输入如下命令,即可应用相应的规则,举例(注意到了吗?加了 iptables):

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

如果没有生效,在 SSH 下输入 service iptables restart 重启防火墙试试。

 

Debian

注意:Debian 下输入的规则命令会直接生效,但是相应的,重启后会失效,下面会告诉大家怎么使规则能重启后也生效。

 

  • Iptables

1.直接在 SSH 里输入规则命令,比如:

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

输入完成并回车之后,这条命令就直接应用了,如果你不打算重启后也使这条规则生效,那么此时就已经做完了,否则请看下面的操作。

2.然后继续输入 iptables-save 的命令将该规则保存到具体的文件中

iptables-save > /etc/iptables

这里保存到的文件和文件所在的目录可以自己指定,只要你自己记得就行了,我这里是保存到/etc/iptables。

3.再输入如下命令,创建自启动配置文件并赋予权限

touch /etc/network/if-pre-up.d/iptables
chmod +x /etc/network/if-pre-up.d/iptables

这一步如果不懂的话不建议自己更改命令,请和这个保持一致进行操作。

4.编辑该自启动配置文件,并在其中输入恢复命令

vi /etc/network/if-pre-up.d/iptables

再次提醒,不一定要使用 vi,请根据自己的喜好来。输入上面的命令以后,按 a 或者 i 进入编辑模式,然后在起始位置输入如下的内容:

#!/bin/sh
iptables -F
iptables-restore < /etc/iptables

这里我在使用 iptables-restore 命令前,加了一个 iptables -F(清除所有已有的规则)的命令,这是因为要保证不要造成冲突,如果你觉得没必要可以去掉。

最后的 /etc/iptabes 就是我们前面用 iptables-save 保存的规则文件,如果你保存在其它地方记得把这里的文件路径也改了。

另外要注意下,如果在编辑这个文件的时候,发现里面已经存在内容,不要怕,改成你自己的内容就行了(这是因为可能系统自动帮你设置了一个恢复规则的命令)。

5.编辑完成之后,按 Esc 键退出编辑状态,并输入 :wq 保存退出。做完这些,你就可以重启下你的 VPS 看看是否有用了。

6.以后再使用命令修改完防火墙规则时,只需要输入第 2 步里一样的命令保存一下就可以了,或者也可以直接编辑/etc/iptables 这个文件,输入下面的命令应用:

iptables-restore < /etc/iptables

这两种方法都能保证重启后不会失效。

 

  • Ip6tables

ip6tables 配置和应用起来和前面的 iptables 差不多,我这里就只简单提一下了。

下面的步骤参考 Debian iptables 设置:

1.将输入的命令里 iptables 改成 ip6tables

2.使用保存命令时,使用 ip6tables-save 并保存到 ip6tables 文件,命令如下:

ip6tables-save > /etc/ip6tables

3.自启动规则创建为 ip6tables 文件好方便和 iptables 区分:

touch /etc/network/if-pre-up.d/ip6tables
chmod +x /etc/network/if-pre-up.d/ip6tables

当然,你也可以和前面的 iptables 使用同一个文件,那么就不要做这一步了。

4.编辑自启动文件,输入 ip6tables-restore 命令:

#!/bin/sh
ip6tables -F
ip6tables-restore < /etc/ip6tables

注意:如果你使用的自启动文件和前面的 iptables 为同一个,那么你也可以这么写:

#!/bin/sh
iptables -F
iptables-restore < /etc/iptables
ip6tables -F
ip6tables-restore < /etc/ip6tables

5.保存退出。

6.以后再使用命令修改完防火墙规则时,只需要输入第 2 步里一样的命令保存一下就可以了(注意这里是 ip6tables-save > /etc/ip6tables),或者也可以直接编辑/etc/ip6tables 这个文件,输入下面的命令应用

ip6tables-restore < /etc/ip6tables

这两种方法都能保证重启后不会失效。

另外,如果你的 VPS 为纯 IPv6,那么参照前面的 Iptables 设置应用也没问题,只要命令改成 ip6tables、ip6tables-save 和 ip6tables-restore 即可。

 

OK,说到这里就差不多了,不知道大家能不能理解的?话说文里有很多术语我没有写对,有些是不知道没意识,有些是故意的,因为部分内容用术语来说的话,可能就没那么好理解了呢。如有不足&不对之处,还请大家留言指出。

12点半

Hello world!

文章评论(0)