iptables nat及端口映射(转载)

本文摘自链接(http://www.91linux.com/html/article/network/20090120/15460.html )

iptables 应用初探(nat+三层访问控制)

    iptables是 一个Linux下优秀的nat+防火墙工具,我使用该工具以较低配置的传统pc配置了一个灵活强劲的防火墙+nat系统,小有心得,看了网上也有很多这方 面的文章,但是似乎要么说的比较少,要么就是比较偏,内容不全,容易误导,我研究了一段时间的iptables同时也用了很久,有点滴经验,写来供大家参 考,同时也备日后自己翻阅。

    首先要说明的是,iptables操作的是2.4以上内核的netfilter.所以需要linux的内核在2.4以上。其功能与安全性远远比其前 辈 ipfwadm,ipchains强大,iptables大致是工作在OSI七层的二、三、四层,其前辈ipchains不能单独实现对 tcp/udp port以及对mac地址的的定义与操作,所以我想ipchains应该是仅仅工作在三层上的。

       我们先简单介绍一下netfilter的大致工作流程,也就是一个数据包(或者叫分组、packet,我个人习惯叫包)在到达linux的网络接口的时候 (网卡)如何处理这个包,然后再介绍一下如何用iptables改变或者说控制对这个数据包进行操作。netfilter内部分为三个表,分别 是 filter,nat,mangle,每个表又有不同的操作链(Chains)。在filter(过滤)表中,也就是他的防火墙功能的这个表,定义了 三个 Chain。分别是INPUT,FORWARD,OUTPUT。也就是对包的入、转发、出进行定义的三个过滤链。对于这个filter表的操作和控 制也是我们实现防火墙功能的一个重要手段;在nat(Network Address Translation、网络地址翻译)表中,也就是我们用以实现 地址转换和端口转发功能的这个表,定义了PREROUTING, POSTROUTING,OUTPUT三个链,下面我们会对这三个链作详细的说明;而 netfilter的mangle表则是一个自定义表,里面包括上面的filter以及nat表中的各种chains,它可以让我们进行一些自定义的操 作,同时这个mangle表中的chains在netfilter对包的处理流程中处在一个比较优先的位置,下面有一张图清晰的描绘了netfilter 对包的处理流程,一般情况下,我们用不到这个mangle表,在这里我们就不做介绍了。

    

 

         大家可以看到,PREROUTING这个chain在最前面,当一个包来到linux的网络接口的时候先过mangle的PREROUTING,然后 是 nat的PREROUTING,从这个chain的名字我们可以看出,这个chain是在路由之前(pre-routing)要过的。为什么要在路由 之前过呢?大家可以看到这个图上,上面有一个菱形的部分叫ROUTING,这个ROUTING部分就是Linux的route box,也就是路由系统, 它同样有很高深的功能,可以实现策略路由等等一些高级特性,此处我们不做详细解释。单说这个PREROUTING链,因为在这个链里面我们对包的操作是 DNAT,也就是改变目的地址和(或端口),通常用在端口转发,或者nat到内网的DMZ区,也就是说当一个包过来的时候我们要改变它的目的地址,大家可 以想想,如果一个包在改变目的地址之前就被扔进了route box,让系统选好路之后再改变目的地址,那么选路就可能是错的,或者说毫无意义了,所 以,PREROUTING这个Chain一定要在进Routing 之前做。比如说,我们的公网ip是60.1.1.1/24,位于linux中的 eth0,内网ip是10.1.1.1/24位于linux中的eth1, 我们的内网有一台web服务器,地址是10.1.1.2/24,我们怎么样能 让internet用户通过这个公网ip访问我们内部的这个web服务器呢?我们就可以在这个PREROUTING链上面定义一个规则,把访问 60.1.1.1:80的用户的目的地址改变一下,改变为10.1.1.2:80,这样就实现了internet用户对内网服务器的访问了,当然了,这个 端口是比较灵活的,我们可以定义任何一个端口的转发,不一定是80–>80,具体的命令我们在下面的例子中介绍,这里我们只谈流程与概念上的实现方法。

    好了,我们接着往下走,这个包已经过了两个PREROUTING链了,这个时候,出现了一个分支转折的地方,也就是图中下方的那个菱形 (FORWARD),转发!这里有一个对目的地址的判断(这里同样说明了PREROUTING一定要在最先,不仅要在route box之前,甚至是这个 对目的地址的判断之前,因为我们可能做一个去某某某ip的地方转到自己的ip的规则,所以PREROUTING是最先处理这个包的 Chain)!如果包 的目的地是本机ip,那么包向上走,走入INPUT链处理,然后进入LOCAL PROCESS,如果非本地,那么就进入FORWARD链进行过滤,我们 在这里就不介绍INPUT,OUTPUT的处理了,因为那主要是对于本机安全的一种处理,我们这里主要说对转发的过滤和nat的实现。

    这里的FORWARD我简单说一下,当linux收到了一个目的ip地址不是本地的包,Linux会把这个包丢弃,因为默认情况下,Linux的三层包转 发功能是关闭的,如果要让我们的linux实现转发,则需要打开这个转发功能,可以改变它的一个系统参数,使用 sysctl net.ipv4.ip_forward=1或者echo “1” > /proc/sys/net/ipv4 /ip_forward命令打开转发功能。好了,在这里我们让linux允许转发,这个包的目的地址也不是本机,那么它将接着走入FORWARD链,在 FORWARD链里面,我们就可以定义详细的规则,也就是是否允许他通过,或者对这个包的方向流程进行一些改变,这也是我们实现访问控制的地方,这里同样 也是Mangle_FORWARD然后filter_FORWARD,我们操作任何一个链都会影响到这个包的命运,在下面的介绍中,我们就忽略掉 mangle表,我们基本用不到操作它,所以我们假设它是透明的。假设这个包被我们的规则放过去了,也就是ACCEPT了,它将进入 POSTROUTING部分,注意!这里我注意到一个细节问题,也就是上面的图中数据包过了FORWARD链之后直接进入了POSTROUITNG 链, 我觉得这中间缺少一个环节,也就是route box,对于转发的包来说,linux同样需要在选路(路由)之后才能将它送出,这个图却没有标明这一点, 我认为它是在过了route box之后才进入的POSTROUITNG,当然了,这对于我们讨论iptables的过滤转发来说不是很重要,只是我觉得 流程上有这个问题,还是要说明一下。

 

同样的,我们在这里从名字就可以看出,这个POSTROUTING链应该是路由之后的一个链,也就是这个包要送出这台Linux的最后一个环节了,这也是极 其重要的一个环节!!这个时候linux已经完成(has done..^_^)了对这个包的路由(选路工作),已经找到了合适的接口送出这个包了,在这 个链里面我们要进行重要的操作,就是被Linux称为 SNAT的一个动作,修改源ip地址!为什么修改源ip地址?很多情况需要修改源地址阿,最常见的 就是我们内网多台机器需要共享一个或几个公网ip访问 internet,因为我们的内网地址是私有的,假如就让linux给路由出去,源地址也不变,这 个包应该能访问到目的地,但是却回不来,因为 internet上的N多个路由节点不会转发私有地址的数据包,也就是说,不用合法ip,我们的数据包有去 无回。有人会说:“既然是这样,我就不用私有 ip了,我自己分配自己合法的地址不行吗?那样包就会回来了吧?”答案是否定的,ip地址是ICANN来分 配的,你的数据包或许能发到目的地,但是回来的时候人家可不会转到你那里,internet上的路由器中的路由信息会把这个返回包送到那个合法的获得ip 的地方去,你同样收不到,而你这种行为有可能被定义为一种ip欺骗,很多设备会把这样的包在接入端就给滤掉了,可能都到不了你要访问的那个服务器,呵呵。

    那么Linux如何做SNAT呢?比如一个内网的10.1.1.11的pc访问202.2.2.2的一个web服务器,linux的内网接口 10.1.1.1在收到这个包之后把原来的PC的 ip10.1.1.11改变为60.1.1.1的合法地址然后送出,同时在自己的 ip_conntrack表里面做一个记录,记住是内网的哪一个ip的哪个端口访问的这个web服务器,自己把它的源地址改成多少了,端口改成多少了,以 便这个web服务器返回数据包的时候linux将它准确的送回给发送请求的这个pc.

    大体的数据转发流程我们说完了,我们看看iptables使用什么样的参数来完成这些操作。

在 描述这些具体的操作之前,我还要说几个我对iptables的概念的理解(未必完全正确),这将有助于大家理解这些规则,以实现更精确的控制。上文中我们 提到过,对包的控制是由我们在不同的Chain(链)上面添加不同的规则来实现的,比如我们对过滤表(filter table)添加规则来执行对包的操 控。那么既然叫链,一定就是一条或者多条规则组成的了,这时就有一个问题了,如果多个规则对同一种包进行了定义,会发生什么事情呢?在Chain中,所有 的规则都是从上向下来执行的,也就是说,如果匹配了第一行,那么就按照第一行的规则执行,一行一行的往下找,直到找到符合这个类型的包的规则为止。如果找 了一遍没有找到符合这个包的规则怎么办呢?itpables里面有一个概念,就是Policy,也就是策略。一说这个东西大家可能就会觉得比较麻烦,什么 策略阿,我对于它的理解就是所谓这个策略就是chain中的最后一条规则,也就是说如果找了一遍找不到符合处理这个包的规则,就按照policy来办。这 样理解起来就容易多了。iptables 使用-P来设置Chain的策略。

    好了,我们言归正传,来说说iptables到底怎样实现对包的控制

先介绍一下iptables如何操作链

对链的操作就那么几种,-I(插入) -A(追加) -R(替换) -D(删除) -L(列表显示)

这里要说明的就是-I将会把规则放在第一行,-A将会放在最后一行。

比如我们要添加一个规则到filter表的FORWARD链

iptables -t filter -A FORWARD -s 10.1.1.11 -d 202.1.1.1 -j ACCEPT

上 面的命令意思为:追加一个规则至filter表中的FORWARD链尾,允许(-j ACCEPT)源地址为10.1.1.11目的地址为 202.1.1.1的数据包通过。其中-t后面跟的是表名,在-A后面跟Chain名,后面的小写的 -s为源地址,-d为目的地址,-j为处理方向。

    在iptables中,默认的表名就是filter,所以这里可以省略-t filter直接写成:iptables -A FORWARD -s 10.1.1.11 -d 202.1.1.1 -j ACCEPT

iptables中的匹配参数:

    我们在这里就介绍几种常用的参数,详细地用法可以man iptables看它的联机文档,你会有意外的收获。

-s匹配源地址

-d匹配目的地址

-p协议匹配

-i入接口匹配

-o出接口匹配

–sport,–dport源和目的端口匹配

-j跳转,也就是包的方向

    其中还有一个!参数,使用!就是取反的意思。下面我们简单举几个例子介绍一下。

-s这 个参数呢就是指定源地址的,如果使用这个参数也就是告诉netfilter,对于符合这样一个源地址的包怎么去处理,可以指定某一个单播ip地址,也可以 指定一个网络,如果单个的ip地址其实隐含了一个32位的子网掩码,比如-s 10.1.1.11 其实就是-s 10.1.1.11/32 同样我们可 以指定不同的掩码用以实现源网络地址的规则,比如一个C类地址我们可以用-s 10.1.1.0/24来指定。

-d参数与-s格式一样。

-i参数是指定入接口的网络接口,比如我仅仅允许从eth3接口过来的包通过FORWARD链,就可以这样指定iptables -A FORWARD -i eth3 -j ACCEPT

-o是出接口,与上同.

我们下面用一些简单的实例来step by step看看iptables的具体配置方法。

实例一:简单的nat路由器

环境介绍:

2个网络接口

Lan口:10.1.1.254/24 eth0

Wan口:60.1.1.1/24 eth1

目的:实现内网中的节点(10.1.1.0/24)可控的访问internet。

    首先将Lan的节点pc的网关指向10.1.1.254

确定你的linux的ip配置无误,可以正确的ping通内外的地址。同时用route命令查看linux的本地路由表,确认指定了可用的ISP提供的默认网关。

使用sysctl net.ipv4.ip_forward=1打开linux的转发功能。

iptables -P FORWARD DROP

将FORWARD链的策略设置为DROP,这样做的目的是做到对内网ip的控制,你允许哪一个访问internet就可以增加一个规则,不在规则中的ip将无法访问internet.

iptables -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT

这条规则规定允许任何地址到任何地址的确认包和关联包通过。一定要加这一条,否则你只允许lan IP访问没有用,至于为什么,下面我们再详细说。

iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -j SNAT –to 60.1.1.1

这条规则做了一个SNAT,也就是源地址转换,将来自10.1.1.0/24的地址转换为60.1.1.1

有这几条规则,一个简单的nat路由器就实现了。这时你可以将允许访问的ip添加至FORWARD链,他们就能访问internet了。

比如我想让10.1.1.9这个地址访问internet,那么你就加如下的命令就可以了。

iptables -A FORWARD -s 10.1.1.9 -j ACCEPT

也可以精确控制他的访问地址,比如我就允许10.1.1.99访问3.3.3.3这个ip

iptables -A FORWARD -s 10.1.1.99 -d 3.3.3.3 -j ACCEPT

或者只允许他们访问80端口。

iptables -A FORWARD -s 10.1.1.0/24 -p tcp –dport http -j ACCEPT

更多的控制可以自己灵活去做,或者查阅iptables的联机文档。

实例二:端口转发

环境介绍:

2个网络接口

Lan口:10.1.1.254/24 eth0

Lan内web server: 10.1.1.1:80

Lan内ftp server: 10.1.1.2:21

Wan口:60.1.1.1/24 eth1

目的:对内部server进行端口转发实现internet用户访问内网服务器

    同样确认你的linux的各项配置正常,能够访问内外网。

iptables -P FORWARD DROP

iptables -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT

也需要加入确认包和关联包的允许通过

如果你要把访问60.1.1.1:80的数据包转发到Lan内web server,用下面的命令

iptables -t nat -A PREROUTING -d 60.1.1.1 -p tcp –dport 80 -j DNAT –to 10.1.1.1:80

ftp服务也同样,命令如下:

iptables -t nat -A PREROUTING -d 60.1.1.1 -p tcp –dport 21 -j DNAT –to 10.1.1.2:21

    好了,命令完成了,端口转发也做完了,本例能不能转发呢?不能,为什么呢?我下面详细分析一下。对于iptables好像往外访问的配置比较容易,而对内 的转发似乎就有一些问题了,在一开始的时候我就先说了一些关于netfilter的流程问题,那么我就简单说说做了这些配置之后为什么有可能还不行呢?

    能引起这个配置失败的原因有很多,我们一个个的来说:

第一,本例中,我们的FORWARD策略是DROP,那么也就是说,没有符合规则的包将被丢弃,不管内到外还是外到内,我们在这里依然不讨论那个确认包和关联包的问题,我们不用考虑他的问题,下面我会详细说一下这个东西,那么如何让本例可以成功呢?加入下面的规则。

iptables -A FORWARD -d 10.1.1.1 -p tcp –dport 80 -j ACCEPT

iptables -A FORWARD -d 10.1.1.2 -p tcp –dport 21 -j ACCEPT

    有没有觉得有一些晕?为什么目的地址是10.xxx而不是60.xxx人家internet用户不是访问的60.xxx吗?呵呵,回到上面看看那个图 吧, FORWARD链在什么位置上,它是在PREROUTING之后,也就是说当这个包到达FORWARD链的时候,目的地址已经变成10.xxx了, 假如 internet用户的请求是这样202.1.1.1:1333–>60.1.1.1:80,在经过了我们的PREROUTING链之后将 变成 202.1.1.1:1333–>10.1.1.1:80,这个时候如果你设置一个目的地址为60.xxx的规则有用吗?呵呵,这是问题 一。这个时候应该可以完成端口转发的访问了,但是有一些时候还是不行?为什么?看问题二。

第 二,内网server的ip配置问题,这里我们以web server为例说明一下(ftp情况有一些特殊,下面我们再详细讨论,说确认包和关联包的时候 讨论这个问题),上面说到,有的时候可以访问了,有的时候却不行,就是这个web server的ip设置问题了,如果web server没有指定默认 的网关,那么在作了上面的配置之后,web server会收到internet的请求,但是,他不知道往哪里回啊,人家的本地路由表不知道你那个 internet的ip,202.1.1.1该怎么走。如果你使用截包工具在web server上面察看,你会发现server收到了来自 202.1.1.1:1333–>10.1.1.1:80的请求,由于你没有给web server配置默认网关,它不知道怎么回去,所以就出现 了不通的情况。怎么办呢?两个解决方法:一就是给这个server配置一个默认网关,当然要指向这个配置端口转发的linux,本例是 10.1.1.254,配置好了,就一定能访问了。有一个疑问?难道不需要在FORWARD链上面设置一个允许 web server的ip地址访问外网 的规则吗?它的包能出去?答案是肯定的,能出去。因为我们那一条允许确认包与关联包的规则,否则它是出不去的。第二种方法,比较麻烦一些,但是对服务器来 说这样似乎更安全一些。方法就是对这个包再作一次SNAT,也就是在POSTROUTING链上添加规则。命令如下:

iptables -t nat -A POSTROUTING -d 10.1.1.1 -p tcp –dport 80 -j SNAT –to 10.1.1.254

    ftp的 方法相同。这条命令不太好懂??其实很简单,如果使用这条命令,那么你的web server不需要再设置默认网关,就能收到这个请求,只要他和 linux的lan ip地址是能互访的(也就是说web server和Linux的Lan ip在一个广播域),我们在根据上面的netfilter 流程图来分析这个包到底被我们怎么样了,首先一个请求202.1.1.1:1333–> 60.1.1.1:80被linux收到了,进入 PREROUTING,发现一个规则 (iptables -t nat -A PREROUTING -d 60.1.1.1 -p tcp –dport 80 -j DNAT –to 10.1.1.1:80) 符合,好了,改你的目的地址,于是这个包变成了202.1.1.1:1333–>10.1.1.1:80,继续往前走,进入FORWARD 链,okay,也有一条规则允许通过 (iptables -A FORWARD -d 10.1.1.1 -p tcp –dport 80 -j ACCEPT),进入 route box选路,找到合适的路径了,继续进入POSTROUTING链,耶?又发现一个符合的规则 (iptables -t nat -A POSTROUTING -d 10.1.1.1 -p tcp –dport 80 -j SNAT –to 10.1.1.254), 原来是一个SNAT,改你的源地址,于是这个包变成了10.1.1.254:xxxx–>10.1.1.1:80。为什么用xxxx了,这里的端 口是随机的,我也不知道会是什么。而整个的两次变化的过程都会记录在linux的ip_conntrack中,当web server收到这个包的时候, 发现,原来是一个内网自己兄弟来的请求阿,又在一个广播域,不用找网关,把返回包直接扔给交换机了,linux在收到返回包之后,会根据他的 ip_conntrack中的条目进行两次变换,返回真正的internet用户,于是完成这一次的访问。

    看了上面的两个例子,不知道大家是否清楚了iptables的转发流程,希望对大家有所帮助,下面我们就说说我一直在上面提到的关于那 个 ESTABLISHED,RELATED的规则是怎么回事,到底有什么用处。说这个东西就要简单说一下网络的数据通讯的方式,我们知道,网络的访问是 双向的,也就是说一个Client与Server之间完成数据交换需要双方的发包与收包。在netfilter中,有几种状态,也就是 new, established,related,invalid。当一个客户端,在本文例一中,内网的一台机器访问外网,我们设置了规则允许他出去, 但是没有设置允许回来的规则阿,怎么完成访问呢?这就是netfilter的状态机制,当一个lan用户通过这个linux访问外网的时候,它发送了一个 请求包,这个包的状态是new,当外网回包的时候他的状态就是established,所以,linux知道,哦,这个包是我的内网的一台机器发出去的应 答包,他就放行了。而外网试图对内发起一个新的连接的时候,他的状态是new,所以linux压根不去理会它。这就是我们为什么要加这一句的原因。还有那 个 related,他是一个关联状态,什么会用到呢?tftp,ftp都会用到,因为他们的传输机制决定了,它不像http访问那 样,Client_IP: port–>server:80  然后server:80–>Client_IP:port,ftp使用 tcp21建立连接,使用20端口发送数据,其中又有两种方式,一种主动 active mode,一种被动passive mode,主动模式 下,client使用port命令告诉server我用哪一个端口接受数据,然后server主动发起对这个端口的请求。被动模式下, server使用 port命令告诉客户端,它用那个端口监听,然后客户端发起对他的数据传输,所以这对于一个防火墙来说就是比较麻烦的事情,因为有可能会有new状态的数 据包,但是它又是合理的请求,这个时候就用到这个related状态了,他就是一种关联,在linux中,有个叫 ftp_conntrack的模块,它 能识别port命令,然后对相应的端口进行放行。

还有几个在实际中比较实用(也比较受用:-))的命令参数,写出来供大家参考

iptables -L -n

这 样的列表会跳过linux的domain lookup,有的时候使用iptables -L会比较慢,因为linux会尝试解析ip的域名,真是罗嗦, 如果你的dns server比较不爽的话,iptables -L就会让你很不爽,加一个-n参数就好了。列表刷的就出来。当然了,如果你的linux 就是做防火墙,建议把nameserver去掉,在 /etc/resolve.conf里面,因为有时候使用route命令也会比较慢列出来,很是不 爽。

iptables -L -v

这个命令会显示链中规则的包和流量计数,嘿嘿,看看哪些小子用的流量那么多,用tc限了他。

cat /proc/net/ip_conntrack

查看目前的conntrack,可能会比较多哦,最好加一个|grep “关键字”,看看你感兴趣的链接跟踪

wc -l /proc/net/ip_conntrack

看看总链接有多少条。

iptables-save >/etc/iptables

把当前的所有链备份一下,之所以放到/etc下面叫iptables,因为这样重起机器的时候会自动加载所有的链,经常地备份一下吧,否则如果链多,万一掉电重启,你还是会比较痛苦。

如何在Ubuntu 16.04上使用UFW设置防火墙

如何在Ubuntu 16.04上使用UFW设置防火墙

介绍

UFW或Uncomplicated Firewall是iptables的接口,旨在简化配置防火墙的过程。 虽然iptables是一个坚实和灵活的工具,但是初学者可能很难学会如何使用它来正确配置防火墙。如果您希望开始保护网络安全,并且不确定使用哪种工具,UFW可能是您的最佳选择。 本教程将向您介绍如何在Ubuntu 16.04上使用UFW设置防火墙。

先决条件

要遵循本教程,您需要:

UFW默认安装在Ubuntu上。如果由于某种原因卸载它,你可以使用sudo apt-get install ufw 。

第1步 – 使用IPv6与UFW(可选)

本教程是用IPv4编写的,但将适用于IPv6,只要您启用它。如果您的Ubuntu服务器启用了IPv6,请确保UFW配置为支持IPv6,以便它将管理除IPv4之外的IPv6的防火墙规则。为此,请使用nano或您喜欢的编辑器打开UFW配置。

sudo nano /etc/default/ufw

然后确保IPV6值为yes 。它应该看起来像这样:

/ etc / default / ufw摘要
...
IPV6=yes
...

保存并关闭文件。现在,当启用UFW时,将配置为写入IPv4和IPv6防火墙规则。但是,在启用UFW之前,我们将确保您的防火墙配置为允许您通过SSH连接。让我们开始设置默认策略。

第2步 – 设置默认策略

如果您刚刚开始使用防火墙,则首先要定义的规则是您的默认策略。这些规则控制如何处理未明确匹配任何其他规则的流量。默认情况下,UFW设置为拒绝所有传入连接,并允许所有传出连接。这意味着任何人尝试到达您的云服务器将无法连接,而服务器内的任何应用程序将能够到达外部世界。 让我们将您的UFW规则设置为默认值,这样我们可以确保您能够遵循本教程。要设置UFW使用的默认值,请使用以下命令:

sudo ufw default deny incoming
sudo ufw default allow outgoing

这些命令设置默认值为拒绝传入和允许传出连接。单独的这些防火墙默认值可能足以用于个人计算机,但是服务器通常需要响应来自外部用户的传入请求。我们将研究下一个。

第3步 – 允许SSH连接

如果我们现在启用了UFW防火墙,它将拒绝所有传入的连接。这意味着,如果我们希望服务器响应这些类型的请求,我们将需要创建明确允许合法传入连接(例如SSH或HTTP连接)的规则。如果您使用的是云服务器,则可能需要允许传入的SSH连接,以便连接和管理服务器。 要将服务器配置为允许传入SSH连接,可以使用以下命令:

sudo ufw allow ssh

这将创建防火墙规则,允许端口22上的所有连接,这是默认情况下SSH守护程序监听的端口。 UFW知道什么SSH和一些其他服务名意味着,因为它们被列为/etc/services文件中的/etc/services 。 但是,我们实际上可以通过指定端口而不是服务名称来编写等效规则。例如,此命令的工作原理与上述相同:

sudo ufw allow 22

如果您将SSH守护程序配置为使用其他端口,则必须指定适当的端口。例如,如果您的SSH服务器正在监听端口2222,则可以使用此命令允许该端口上的连接:

sudo ufw allow 2222

现在您的防火墙已配置为允许传入SSH连接,我们可以启用它。

第4步 – 启用UFW

要启用UFW,请使用以下命令:

sudo ufw enable

您将收到一条警告,指出该命令可能会中断现有的SSH连接。我们已经设置了允许SSH连接的防火墙规则,因此应该继续。用y响应提示。 防火墙现在处于活动状态。随意运行sudo ufw status verbose命令以查看设置的规则。本教程的其余部分将更详细地介绍如何使用UFW,例如允许或拒绝不同类型的连接。

第5步 – 允许其他连接

此时,您应该允许服务器需要响应的所有其他连接。应该允许的连接取决于您的特定需求。幸运的是,你已经知道如何编写允许基于服务名称或端口的连接的规则;我们已经在端口22上使用SSH。您也可以执行以下操作:

  • 端口80上的HTTP,这是未加密的Web服务器使用的,使用sudo ufw allow httpsudo ufw allow 80
  • HTTPS端口443,这是加密的Web服务器使用,使用sudo ufw allow httpssudo ufw allow 443
  • FTP在端口21,用于未加密的文件传输(您可能不应该使用),使用sudo ufw allow ftpsudo ufw allow 21/tcp

除了指定端口或已知服务之外,还有其他几种允许其他连接的方法。

特定端口范围

您可以使用UFW指定端口范围。一些应用程序使用多个端口,而不是单个端口。 例如,要允许使用端口6000 – 6007X11连接,请使用以下命令:

sudo ufw allow 6000:6007/tcp
sudo ufw allow 6000:6007/udp

当使用UFW指定端口范围时,必须指定规则应应用于的协议( tcpudp )。我们以前没有提到过,因为没有指定协议只允许两个协议,这在大多数情况下是OK的。

特定IP地址

使用UFW时,还可以指定IP地址。例如,如果要允许来自特定IP地址(例如工作或家庭IP地址为15.15.15.51 ,则需要指定from ,然后指定IP地址:

sudo ufw allow from 15.15.15.51

您还可以通过添加to any port后面跟端口号to any port指定允许IP地址连接的特定端口。 例如,如果要允许15.15.15.51连接到端口22 (SSH),请使用以下命令:

sudo ufw allow from 15.15.15.51 to any port 22

子网

如果要允许IP地址的子网,您可以使用CIDR表示法来指定网络掩码。例如,如果要允许所有的IP地址范围从15.15.15.115.15.15.254您可以使用此命令:

sudo ufw allow from 15.15.15.0/24

同样,您也可以指定允许子网15.15.15.0/24连接到的目标端口。 再次,我们将使用端口22 (SSH)作为示例:

sudo ufw allow from 15.15.15.0/24 to any port 22

连接到特定的网络接口

如果要创建仅适用于特定网络接口的防火墙规则,可以通过指定“allow in on”,然后指定网络接口的名称来实现。 在继续之前,您可能需要查找网络接口。为此,请使用以下命令:

ip addr
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state
...
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
...

突出显示的输出指示网络接口名称。它们通常命名为像eth0eth1 。 因此,如果您的服务器有一个名为eth0的公共网络接口,您可以使用此命令允许HTTP流量(端口80 ):

sudo ufw allow in on eth0 to any port 80

这样做将允许您的服务器从公共Internet接收HTTP请求。 或者,如果您希望您的MySQL数据库服务器(端口3306 )监听专用网络接口eth1上的eth1 ,例如,您可以使用以下命令:

sudo ufw allow in on eth1 to any port 3306

这将允许您的专用网络上的其他服务器连接到您的MySQL数据库。

第6步 – 拒绝连接

如果您尚未更改传入连接的默认策略,则UFW将配置为拒绝所有传入连接。通常,通过要求创建明确允许特定端口和IP地址通过的规则,这简化了创建安全防火墙策略的过程。 但是,有时您会希望根据源IP地址或子网拒绝特定连接,也许是因为您知道您的服务器正在从那里受到攻击。此外,如果您希望将默认传入策略更改为允许 (这对于安全性不推荐),您需要为您不希望允许连接的任何服务或IP地址创建拒绝规则。 要编写拒绝规则,可以使用上述命令,将allow替换为deny 。 例如,要拒绝HTTP连接,可以使用以下命令:

sudo ufw deny http

或者如果你想拒绝15.15.15.51的所有连接,你可以使用这个命令:

sudo ufw deny from 15.15.15.51

现在让我们来看看如何删除规则。

第7步 – 删除规则

了解如何删除防火墙规则与知道如何创建它们同样重要。有两种不同的方法指定要删除的规则:按规则编号或实际规则(类似于创建规则时指定的规则)。我们将从规则编号方法开始,因为如果你是UFW的新手,相比编写要删除的实际规则更容易。

按规则编号

如果您使用规则编号删除防火墙规则,您首先要做的是获取防火墙规则列表。 UFW状态命令有一个选项,可以显示每个规则旁边的数字,如下所示:

sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    15.15.15.0/24
[ 2] 80                         ALLOW IN    Anywhere

如果我们决定删除规则2,允许端口80(HTTP)连接,我们可以在UFW删除命令中指定它,如下所示:

sudo ufw delete 2

这将显示确认提示,然后删除规则2,它允许HTTP连接。请注意,如果启用了IPv6,则也要删除相应的IPv6规则。

按实际规则

规则编号的替代方法是指定要删除的实际规则。例如,如果要删除allow http规则,您可以这样写:

sudo ufw delete allow http

您还可以通过allow 80指定规则,而不是按服务名称指定规则:

sudo ufw delete allow 80

此方法将删除IPv4和IPv6规则(如果存在)。

第8步 – 检查UFW状态和规则

在任何时候,您可以使用此命令检查UFW的状态:

sudo ufw status verbose

如果UFW被禁用,默认情况下,你会看到这样:

Status: inactive

如果UFW是活动的,它应该是如果你按照第3步,输出将说它是活动的,它会列出所有设置的规则。例如,如果防火墙设置为允许从任何地方连接SSH(端口22 ),输出可能如下所示:

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere

如果要检查UFW如何配置防火墙,请使用status命令。

第9步 – 禁用或重置UFW(可选)

如果您决定不想使用UFW,可以使用此命令禁用它:

sudo ufw disable

使用UFW创建的任何规则将不再处于活动状态。如果需要稍后激活它,可以总是运行sudo ufw enable 。 如果已配置UFW规则,但您决定要重新开始,可以使用reset命令:

sudo ufw reset

这将禁用UFW并删除以前定义的任何规则。请注意,如果您在任何时间修改默认策略,默认策略将不会更改为原始设置。这应该给你一个新的开始与UFW。

结论

您的防火墙现在应该配置为允许(至少)SSH连接。请确保允许您的服务器的任何其他传入连接,同时限制任何不必要的连接,以便您的服务器可以正常工作和安全。 要了解更常见的UFW配置,请查看UFW Essentials:常见防火墙规则和命令教程

Ubuntu防火墙安装和配置

Ubuntu安装UFW防火墙

sudo apt-get install ufw 

一般用户,只需如下设置:
sudo apt-get install ufw
sudo ufw enable
sudo ufw default deny

以上三条命令已经足够安全了,如果你需要开放某些服务,再使用sudo ufw allow开启。

启用

sudo ufw enable 
sudo ufw default deny 
#运行以上两条命令后,开启了防火墙,并在系统启动时自动开启。 
#关闭所有外部对本机的访问,但本机访问外部正常。 

开启/禁用

sudo ufw allow|deny [service] 

打开或关闭某个端口,例如:

sudo ufw allow smtp       #允许所有的外部IP访问本机的25/tcp (smtp)端口 
sudo ufw allow 22/tcp      #允许所有的外部IP访问本机的22/tcp (ssh)端口 
sudo ufw allow 53          #允许外部访问53端口(tcp/udp) 
sudo ufw allow from 192.168.1.100 #允许此IP访问所有的本机端口 
sudo ufw allow proto udp 192.168.0.1 port 53 to 192.168.0.2 port 53 
sudo ufw deny smtp         #禁止外部访问smtp服务 
sudo ufw delete allow smtp #删除上面建立的某条规则 

查看防火墙状态

sudo ufw status 

补充:

#开启/关闭防火墙 (默认设置是’disable’)
ufw enable|disable

#转换日志状态
ufw logging on|off

#设置默认策略 (比如 “mostly open” vs “mostly closed”)
ufw default allow|deny

#许可或者屏蔽某些入埠的包 (可以在“status” 中查看到服务列表[见后文])
#可以用“协议:端口”的方式指定一个存在于/etc/services中的服务名称,也可以通过包的meta-data。 ‘allow’ 参数将把条目加入 /etc/ufw/maps ,而 ‘deny’ 则相反。基本语法如下:
ufw allow|deny [service]

#显示防火墙和端口的侦听状态,参见 /var/lib/ufw/maps。括号中的数字将不会被显示出来。
ufw status

UFW使用范例:

#允许 53 端口
$ sudo ufw allow 53

#禁用 53 端口
$ sudo ufw delete allow 53

#允许 80 端口
$ sudo ufw allow 80/tcp

#禁用 80 端口
$ sudo ufw delete allow 80/tcp

#允许 smtp 端口
$ sudo ufw allow smtp

#删除 smtp 端口的许可
$ sudo ufw delete allow smtp

#允许某特定 IP
$ sudo ufw allow from 192.168.254.254

#删除上面的规则
$ sudo ufw delete allow from 192.168.254.254