如何在Ubuntu 16.04 LTS服务器上设置UFW防火墙
如何在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