如何在Ubuntu 16.04 LTS服务器上设置UFW防火墙

时间:2020-01-09 10:40:06  来源:igfitidea点击:

如何在Ubuntu Linux 16.04 LTS服务器上设置带有UFW的防火墙(简单防火墙),以限制个人网络服务器上的流量,该服务器承载着我的家人的照片和博客?

UFW是简单防火墙的首字母缩写。
可以使用UFW来管理Linux防火墙,其目的是为用户,开发人员和Ubuntu sysadmin提供易于使用的界面。
在本教程中,您将学习如何使用UFW到iptables的前端来管理Ubuntu Linux 16.04 LTS服务器上的防火墙。

在Ubuntu 16.04上安装UFW防火墙

UFW包含在Ubuntu中,但不包含在Debian Linux中。
执行以下apt-get命令以在Debian Linux服务器上安装UFW:

$ sudo apt-get update
$ sudo apt-get install ufw

让我们在Ubuntu服务器上设置FUW防火墙。

如何查看ufw的状态?

缺省情况下,ufw为非活动状态。
换句话说,没有配置防火墙规则并且允许所有流量。
要查看状态,请执行:

$ sudo ufw status

输出示例:

Status: inactive

使用默认策略设置UFW防火墙

默认情况下,当ufw激活时,它将阻止所有传入防火墙/服务器的流量。
仅允许传出流量。
您可以通过执行以下命令来查看UFW的默认设置:

$ grep 'DEFAULT_' /etc/default/ufw

输出示例:

DEFAULT_INPUT_POLICY="DROP"
DEFAULT_OUTPUT_POLICY="ACCEPT"
DEFAULT_FORWARD_POLICY="DROP"
DEFAULT_APPLICATION_POLICY="SKIP"

默认策略适用于服务器和便携式计算机/工作站,因为您只需要打开有限数量的传入端口即可。
这是一个很好的策略,因为它会关闭服务器/防火墙上的所有端口,并且您只需要一个一个地打开端口。
您可以运行以下命令来设置策略以阻止所有传入连接,并且仅允许来自服务器/防火墙的传出连接:

$ sudo ufw default allow outgoing
$ sudo ufw default deny incoming

编写第一个防火墙规则以允许连接到SSH(TCP端口22)

执行以下命令以允许通过SSH连接到服务器:

$ sudo ufw allow ssh

或者

sudo ufw allow 22/tcp

假设您在端口2020上运行ssh,请执行:

$ sudo ufw allow 2020/tcp

以下规则仅允许从任何地方访问在10.8.0.1上的tcp ssh端口22(即您的ssh服务器在10.8.0.1端口22上列出):

$ sudo ufw allow proto tcp from any to 10.8.0.1 port 22

以下规则仅允许从10.8.0.2 IP地址访问在10.8.0.1上的tcp ssh端口22(即您的ssh服务器在10.8.0.1端口22上列出):

$ sudo ufw allow proto tcp from 10.8.0.2 to 10.8.0.1 port 22

如何为规则添加注释?

使用以下语法

$ sudo ufw rule comment 'my cool comment here'

打开端口53并写下有关规则的注释:

ufw allow 53 comment 'open tcp and udp port 53 for dns'

另一个例子:

$ sudo ufw allow proto tcp from any to any port 80,443 comment 'my cool web app ports'

或者

$ sudo ufw allow proto tcp from any to 10.8.0.1 port 22 'SSHD port 22 for private lan'

启用基于UFW的防火墙

现在,您具有默认策略和允许的ssh端口。
启动防火墙是安全的,执行:

$ sudo ufw enable

输出示例:

Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

启用后,防火墙也会在重新引导后运行。

禁用基于UFW的防火墙

如果需要停止防火墙并在系统启动时禁用,请执行:

$ sudo ufw disable

输出示例:

`Firewall stopped and disabled on system startup`How do I check the status of my rules?Use the status command:

添加更多规则(开放端口并允许IP)

打开tcp端口22和443的语法如下:

$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp

打开UDP/1194(OpenVPN)服务器:

$ sudo ufw allow 1194/udp

打开端口25(smtpd /电子邮件服务器):

$ sudo ufw allow 25

允许端口范围

您也可以允许端口范围,例如tcp和udp 3000到5000:

$ sudo ufw allow 3000:5000/tcp
$ sudo ufw allow 3000:5000/udp

确保允许来自名为1.2.3.4的IP地址的连接,执行:

$ sudo ufw allow from 1.2.3.4

确保您允许从名为1.2.3.4的IP地址到我们的端口22的连接,执行:

$ sudo ufw allow from 1.2.3.4 to any port 22 proto tcp

或(目标222.222.222.222端口22)

$ sudo ufw allow from 1.2.3.4 to 222.222.222.222 port 22 proto tcp

如何允许传入的HTTPS通信(打开端口443)

$ sudo ufw allow https comment 'Allow all to access Nginx server'
## allow only from 139.1.1.1 ##
$ sudo ufw allow from 139.1.1.1 to any port 443
## allow only from 203.11.11.2/29 ##
$ sudo ufw allow from 203.11.11.2/29 to any port 443

如何允许传入的HTTP通信(打开端口80)

$ sudo ufw allow http comment 'Allow all to access Apache server'
## allow only from 139.1.1.1 ##
$ sudo ufw allow from 139.1.1.1 to any port 80
## allow only from 203.11.11.2/29 ##
$ sudo ufw allow from 203.11.11.2/29 to any port 80

如何允许传入的MySQL/MariaDB通信(开放端口3306)

仅允许从选定的子网访问MySQL/MariaDB端口3306(请参阅MySQL/MariaDB远程访问教程):

$ sudo ufw allow from 192.168.1.0/24 to any port 3306

仅允许访问MySQL/MariaDB端口3306 Apache服务器:

$ sudo ufw allow from 192.54.1.1 to any port 3306

如何允许传入的PostgreSQL通信(开放端口5432)

仅允许从选定的子网访问PostgreSQL端口5432(请参阅PostgreSQL远程访问教程):

$ sudo ufw allow from 192.168.1.0/24 to any port 5432

仅允许访问PostgreSQL端口5432 Apache服务器:

$ sudo ufw allow from 192.54.1.1 to any port 5432

如何允许传入的SMTPD/Postfix/Sendmail(邮件服务器)流量(打开端口25)

$ sudo ufw allow 25
$ sudo ufw allow smtp

如何允许传入的IMAP/IMAPS

$ sudo ufw allow 143
$ sudo ufw allow 993

如何允许传入的POP3/POP3S

$ sudo ufw allow 110
$ sudo ufw allow 995

拒绝访问端口或连接(关闭端口并阻止IP)

语法如下,以拒绝对端口tcp端口443的访问(即简单地忽略对端口443的访问):

$ sudo ufw deny 443/tcp

确保拒绝来自名为1.2.3.4的IP地址的所有连接,执行:

$ sudo ufw deny from 1.2.3.4

确保拒绝来自IP /子网123.45.67.89/24的所有连接,执行:

$ sudo ufw deny from 123.45.67.89/24

确保您拒绝访问端口22上的1.2.3.4(例如黑客IP):

$ sudo ufw deny from 1.2.3.4 to any port 22 proto tcp

拒绝访问端口或连接(拒绝并让用户知道它们已被防火墙阻止)

deny语法只是忽略流量。
如果要让发送方知道何时拒绝流量,而不是简单地忽略它,请使用拒绝语法:

$ sudo ufw reject in smtp
$ sudo ufw reject out smtp
$ sudo sudo ufw reject 1194 comment 'No more vpn traffic'
$ sudo ufw reject 23 comment 'Unencrypted port not allowed'

如果有人尝试连接到端口23,他们将收到拒绝消息,如下所示:

telnet: Unable to connect to remote host: Connection refused

删除UFW防火墙规则

现在您知道了如何添加,拒绝和列出防火墙规则。
现在该删除不想要的规则了。
有两个删除规则的选项。
第一种语法是:

$ sudo ufw delete {rule-here}

在此示例中,删除HTTPS(TCP端口443)流量规则,

$ sudo ufw delete allow 443

如果您不再希望允许smptd/email(端口25)通信,请执行:

$ sudo ufw delete allow 25

第二个选项是以编号列表格式列出所有当前规则:

$ sudo ufw status numbered

输出示例:

Status: active
 
     To                         Action      From
     --                         ------      ---
[ 1] 10.8.0.1 22/tcp            ALLOW IN    Anywhere                  
[ 2] Anywhere                   DENY IN     123.45.67.0/24            
[ 3] 22/tcp                     DENY IN     1.2.3.4

要删除第二条规则(" ufw deny from 123.45.67.89/24"),请执行以下命令:

$ sudo ufw delete 2

输出示例:

Deleting:
deny from 123.45.67.0/24
Proceed with operation (y|n)? y
Rule deleted

如何重置防火墙?

语法如下,将ufw规则重置为其出厂默认设置,并在非活动模式下运行:

$ sudo ufw reset

输出示例:

Resetting all rules to installed defaults. This may disrupt existing ssh
connections. Proceed with operation (y|n)? y
Backing up 'user6.rules' to '/etc/ufw/user6.rules.20150801_121710'
Backing up 'after.rules' to '/etc/ufw/after.rules.20150801_121710'
Backing up 'before.rules' to '/etc/ufw/before.rules.20150801_121710'
Backing up 'after6.rules' to '/etc/ufw/after6.rules.20150801_121710'
Backing up 'user.rules' to '/etc/ufw/user.rules.20150801_121710'
Backing up 'before6.rules' to '/etc/ufw/before6.rules.20150801_121710'

如何重新加载防火墙?

重新加载防火墙的语法如下:

$ sudo ufw reload

编辑UFW的配置文件时,需要运行reload命令。
例如,您可以编辑/etc/ufw/before.rules,执行:

$ sudo nano /etc/ufw/before.rules

或者

$ sudo vi /etc/ufw/before.rules

要允许从eth0到eth0的所有通信(在添加为" End required lines"的行之后添加),请执行:

# allow all on eth0
-A ufw-before-input -i eth0 -j ACCEPT
-A ufw-before-output -o eth0 -j ACCEPT

保存并关闭文件。
重新加载防火墙:

$ sudo ufw reload

如何查看防火墙日志?

默认情况下,所有UFW条目都记录到/var/log/ufw.log文件中:

$ sudo more /var/log/ufw.log
$ sudo tail -f /var/log/ufw.log

输出示例:

Aug  1 12:09:48 server2 kernel: [15727.245115] [UFW BLOCK] IN=br1 OUT= MAC=00:25:90:4f:b0:6f:44:d3:ca:5f:89:40:08:00 SRC=62.210.181.123 DST=75.xxx.yyy.zzz LEN=40 TOS=0x00 PREC=0x00 TTL=245 ID=20343 DF PROTO=TCP SPT=2328 DPT=80 WINDOW=512 RES=0x00 SYN URGP=0 
Aug  1 12:09:58 server2 kernel: [15737.485726] [UFW BLOCK] IN=br1 OUT= MAC=00:25:90:4f:b0:6f:44:d3:ca:5f:89:40:08:00 SRC=187.134.225.91 DST=75.xxx.yyy.zzz  LEN=46 TOS=0x00 PREC=0x00 TTL=54 ID=0 DF PROTO=UDP SPT=54704 DPT=53413 LEN=26 
Aug  1 12:09:58 server2 kernel: [15737.486102] [UFW BLOCK] IN=br1 OUT= MAC=00:25:90:4f:b0:6f:44:d3:ca:5f:89:40:08:00 SRC=187.134.225.91 DST=75.xxx.yyy.zzz  LEN=151 TOS=0x00 PREC=0x00 TTL=54 ID=0 DF PROTO=UDP SPT=54704 DPT=53413 LEN=131

您可以使用grep命令搜索日志文件:

$ sudo grep something /var/log/ufw.log
$ sudo grep '187.134.225.91' /var/log/ufw.log

如何查看ufw报告?

添加的报告显示在命令行中添加的规则列表:

$ sudo ufw show added

输出示例:

Added user rules (see 'ufw status' for running firewall):
ufw allow 22
ufw reject 23

原始报告显示完整的防火墙,而其他报告显示原始报告中的一部分:

$ sudo ufw show raw
$ sudo ufw show raw | more

侦听报告将显示实时系统上处于tcp侦听状态和udp处于打开状态的端口,以及接口的地址和在端口上侦听的可执行文件。
当可执行文件绑定到该端口上的所有接口时,将使用"*"代替接口地址。
此信息之后是可能会影响此端口上的连接的规则列表。
规则按内核评估的顺序列出,并且第一场比赛获胜。
请注意,默认策略未列出,并且仅在启用IPV6的情况下显示tcp6和udp6:

$ sudo ufw show listening
$ sudo ufw show listening | more
tcp:
  22 10.86.115.66 (sshd)
   [ 1] allow 22
 
  22 10.8.0.1 (sshd)
   [ 1] allow 22
 
  443 75.xxx.yyy.zzz (openvpn)
udp:
  123 10.8.0.1 (ntpd)
  123 75.xxx.yyy.zzz (ntpd)
  123 10.86.115.66 (ntpd)
  123 * (ntpd)
udp6:
  123 * (ntpd)

其他可能的报告是:

$ sudo ufw show builtins
$ sudo ufw show before-rules
$ sudo ufw show user-rules
$ sudo ufw show after-rules
$ sudo ufw show logging-rules