ufw防火墙服务

ufw是Ubuntu默认配置防火墙的工具。默认安装下,UFW是禁用的。

备注

我个人感觉ufw配置简单的过滤比较方便,但是添加了很多的netfilter链,感觉增加了复杂度。所以我可能还是回归 iptables 来管理防火墙,不过如果是一些单机环境,或许使用ufw还是比较合适的。

  • 安装和激活:

安装 ufw
sudo apt install ufw
sudo ufw enable
  • 然后可以检查状态:

检查 ufw 状态
ufw status verbose

初始安装可能显示输出如下:

检查 ufw 状态输出
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
22/tcp (v6)                ALLOW IN    Anywhere (v6)

基本配置

  • IPv6

如果Ubuntu server已经激活了IPv6,则确保UFW已经配置支持IPv6,就可以同时管理IPv6和IPv4规则。修改 /etc/default/ufw ,确保已经激活 IPV6

...
IPV6=yes
...
  • 设置默认规则

默认时,UFW设置了拒绝所有进入连接并允许所有外出连接。为了设置默认规则,使用以下命令拒绝进入连接策略:

sudo ufw default deny incoming

显示输出:

Default incoming policy changed to 'deny'
(be sure to update your rules accordingly)

允许外出连接策略:

sudo ufw default allow outgoing

显示输出:

Default outgoing policy changed to 'allow'
(be sure to update your rules accordingly)
  • 允许SSH连接:

    sudo ufw allow ssh
    

这个 ssh 时根据 /etc/services 文件配置设置端口,允许 22 端口。也可以使用如下命令:

sudo ufw allow 22

显示输出:

Rules updated
Rules updated (v6)

当然,如果需要设置其他防火墙端口,例如SSH是监听 2222 端口,则使用命令:

sudo ufw allow 2222

用户添加的规则,例如上述 allow 22 会被加入配置文件 /etc/ufw/user.rules ,内容如下:

-A ufw-user-input -p tcp --dport 22 -j ACCEPT
-A ufw-user-input -p udp --dport 22 -j ACCEPT

警告

务必允许SSH连接,否则一旦启动防火墙,将无法远程维护服务器。

  • 激活UFW:

    sudo ufw enable
    

在激活ufw的时候,会提示可能会中断已经存在的SSH连接。由于我们已经设置了允许SSH连接的规则,所以可以输入 y 继续。

此时防火墙规则已经激活,此时,可以使用以下命令检查:

sudo ufw status verbose

显示输出:

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

To                         Action      From
--                         ------      ----
22                         ALLOW IN    Anywhere
22 (v6)                    ALLOW IN    Anywhere (v6)

允许其他访问连接

  • 常用的服务端口开启:DNS,WEB:

    sudo ufw allow 53
    sudo ufw allow 80
    sudo ufw allow 443
    
  • 如果需要X11连接,则会使用一个端口范围 6000-60007

    sudo ufw allow 6000:6007/tcp
    sudo ufw allow 6000:6007/udp
    
  • 特定IP地址允许访问:

    sudo ufw allow from 15.15.15.51
    
  • 特定IP地址对端口的访问:

    sudo ufw allow from 15.15.15.51 to any port 22
    
  • 允许子网访问:

    sudo ufw allow from 15.15.15.0/24
    
  • 允许子网访问指定端口22:

    sudo ufw allow from 15.15.15.0/24 to any port 22
    
  • 允许特定网络接口:

    sudo ufw allow in on eth0 to any port 80
    

例如允许访问MySQL数据库端口 3306

sudo ufw allow in on eth1 to any port 3306
  • 拒绝某个特定IP地址访问:

    sudo ufw deny from 15.15.15.51
    

删除规则

基于规则编号删除

  • 首先检查规则编号:

    sudo ufw status numbered
    

例如输出:

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    15.15.15.0/24
[ 2] 80                         ALLOW IN    Anywhere
  • 现在删除规则2:

    sudo ufw delete 2
    

基于激活的规则

sudo ufw delete allow http

或者:

sudo ufw delete allow 80

停止或重置规则(可选)

  • 停止UFW:

    sudo ufw disable
    
  • 重置UFW:

    sudo ufw reset
    

NAT masquerade

要使用ufw设置NAT,从内部网络访问外部网络,需要启用IP FORWARD。

备注

ufw有关masquerading的规则被分成了2个不同文件,分别是 ufw 命令行规则前执行的,和 ufw 命令行规则之后执行的。

  • 在配置文件 /etc/default/ufw 修改参数 DEFAULT_FORWARD_POLICY:

DEFAULT_FORWARD_POLICY="ACCEPT"

默认配置是 DEFAULT_FORWARD_POLICY="DROP"

  • 修改 /etc/ufw/sysctl.conf ,取消注释行:

    net/ipv4/ip_forward=1
    

如果是IPv6还要设置:

net/ipv6/conf/default/forwarding=1
  • /etc/ufw/before.rules 添加规则。默认规则配置 filter 表。 nat 表中激活 masquerading ,注意规则添加在 filter 规则之前:

# nat Table rules
*nat
:POSTROUTING ACCEPT [0:0]

# Forward traffic from eth1 through eth0.
-A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

# don't delete the 'COMMIT' line or these nat table rules won't be processed
COMMIT

我的主机设备是一块无线网卡 wlp3s0 (对外)和一块有线网卡 enp0s25 (对内 192.168.0.0/24 ),所以设置调整成:

-A POSTROUTING -s 192.168.0.0/24 -o wlp3s0 -j MASQUERADE

但是内网不能访问外部,最后改成取消接口限制才成功,暂时没有搞清:

-A POSTROUTING -j MASQUERADE
  • 激活修改:

    sudo ufw disable && sudo ufw enable
    

端口映射

作为局域网的网关防火墙,还需要将外部网络和内部服务器端口映射起来对外提供服务。

  • 简单的端口映射(ssh端口):

    # NAT table rules
    *nat
    :PREROUTING ACCEPT [0:0]
    :POSTROUTING ACCEPT [0:0]
    
    # Port Forwardings
    -A PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to-destination 192.168.1.10
    
    # Forward traffic through eth0 - Change to match you out-interface
    -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
    
    # don't delete the 'COMMIT' line or these nat table rules won't
    # be processed
    COMMIT
    

参考