禁用内核日志中 UFW BLOCK 的记录

禁用内核日志中 UFW BLOCK 的记录

我的日志中有很多这样的条目:

Sep 22 12:20:23 server0187 kernel: [    7.267934] [UFW BLOCK] IN=ens3 OUT= MAC=56:00:21:32:65:eb:fe:00:00:32:65:eb:08:99 SRC=113.69.80.129 DST=se.rv.er.ip LEN=40 TOS=0x00 PREC=0x00 TTL=48 ID=63510 PROTO=TCP SPT=27738 DPT=23 WINDOW=31379 RES=0x00 SYN URGP=0 
Sep 22 12:20:23 server0187 kernel: [    7.688848] [UFW BLOCK] IN=ens3 OUT= MAC=56:00:21:32:65:eb:fe:00:00:32:65:eb:08:99 SRC=113.69.80.129 DST=se.rv.er.ip LEN=40 TOS=0x00 PREC=0x00 TTL=48 ID=63510 PROTO=TCP SPT=27738 DPT=23 WINDOW=31379 RES=0x00 SYN URGP=0 
Sep 22 12:20:24 server0187 kernel: [    7.992988] [UFW BLOCK] IN=ens3 OUT= MAC=56:00:21:32:65:eb:fe:00:00:32:65:eb:08:99 SRC=113.69.80.129 DST=se.rv.er.ip LEN=40 TOS=0x00 PREC=0x00 TTL=48 ID=63510 PROTO=TCP SPT=27738 DPT=23 WINDOW=31379 RES=0x00 SYN URGP=0 
Sep 22 12:20:32 server0187 kernel: [   16.219594] [UFW BLOCK] IN=ens3 OUT= MAC=56:00:21:32:65:eb:fe:00:00:32:65:eb:08:99 SRC=113.69.80.129 DST=se.rv.er.ip LEN=40 TOS=0x00 PREC=0x00 TTL=48 ID=63510 PROTO=TCP SPT=52457 DPT=23 WINDOW=31379 RES=0x00 SYN URGP=0 
Sep 22 12:20:39 server0187 kernel: [   23.217712] [UFW BLOCK] IN=ens3 OUT= MAC=56:00:21:32:65:eb:fe:00:00:32:65:eb:08:99 SRC=113.69.80.129 DST=se.rv.er.ip LEN=40 TOS=0x00 PREC=0x00 TTL=48 ID=63510 PROTO=TCP SPT=7040 DPT=23 WINDOW=31379 RES=0x00 SYN URGP=0 
Sep 22 12:20:40 server0187 kernel: [   24.130220] [UFW BLOCK] IN=ens3 OUT= MAC=56:00:21:32:65:eb:fe:00:00:32:65:eb:08:99 SRC=113.69.80.129 DST=se.rv.er.ip LEN=40 TOS=0x00 PREC=0x00 TTL=48 ID=63510 PROTO=TCP SPT=7040 DPT=23 WINDOW=31379 RES=0x00 SYN URGP=0 
Sep 22 12:20:44 server0187 kernel: [   28.063447] [UFW BLOCK] IN=ens3 OUT= MAC=56:00:21:32:65:eb:fe:00:00:32:65:eb:08:99 SRC=61.62.8.132 DST=se.rv.er.ip LEN=60 TOS=0x00 PREC=0x00 TTL=45 ID=33267 DF PROTO=TCP SPT=33345 DPT=23 WINDOW=14520 RES=0x00 SYN URGP=0 
Sep 22 12:20:45 server0187 kernel: [   29.063934] [UFW BLOCK] IN=ens3 OUT= MAC=56:00:21:32:65:eb:fe:00:00:32:65:eb:08:99 SRC=61.62.8.132 DST=se.rv.er.ip LEN=60 TOS=0x00 PREC=0x00 TTL=45 ID=33268 DF PROTO=TCP SPT=33345 DPT=23 WINDOW=14520 RES=0x00 SYN URGP=0 
Sep 22 12:20:47 server0187 kernel: [   31.063621] [UFW BLOCK] IN=ens3 OUT= MAC=56:00:21:32:65:eb:fe:00:00:32:65:eb:08:99 SRC=61.62.8.132 DST=se.rv.er.ip LEN=60 TOS=0x00 PREC=0x00 TTL=45 ID=33269 DF PROTO=TCP SPT=33345 DPT=23 WINDOW=14520 RES=0x00 SYN URGP=0 
Sep 22 12:20:50 server0187 kernel: [   34.272558] [UFW BLOCK] IN=ens3 OUT= MAC=56:00:21:32:65:eb:fe:00:00:32:65:eb:08:99 SRC=113.69.80.129 DST=se.rv.er.ip LEN=40 TOS=0x00 PREC=0x00 TTL=48 ID=63510 PROTO=TCP SPT=37595 DPT=23 WINDOW=31379 RES=0x00 SYN URGP=0 
Sep 22 12:20:50 server0187 kernel: [   34.667044] [UFW BLOCK] IN=ens3 OUT= MAC=56:00:21:32:65:eb:fe:00:00:32:65:eb:08:99 SRC=113.69.80.129 DST=se.rv.er.ip LEN=40 TOS=0x00 PREC=0x00 TTL=48 ID=63510 PROTO=TCP SPT=37595 DPT=23 WINDOW=31379 RES=0x00 SYN URGP=0 
Sep 22 12:21:08 server0187 kernel: [   52.296316] [UFW BLOCK] IN=ens3 OUT= MAC=56:00:21:32:65:eb:fe:00:00:32:65:eb:08:99 SRC=113.69.80.129 DST=se.rv.er.ip LEN=40 TOS=0x00 PREC=0x00 TTL=48 ID=63510 PROTO=TCP SPT=22917 DPT=23 WINDOW=31379 RES=0x00 SYN URGP=0 
Sep 22 12:21:39 server0187 kernel: [   83.646607] [UFW BLOCK] IN=ens3 OUT= MAC=56:00:21:32:65:eb:fe:00:00:32:65:eb:08:99 SRC=151.233.57.112 DST=se.rv.er.ip LEN=44 TOS=0x00 PREC=0x00 TTL=37 ID=56703 PROTO=TCP SPT=25625 DPT=23 WINDOW=30217 RES=0x00 SYN URGP=0 

我的ufw规则非常标准:

22/tcp (OpenSSH)           ALLOW IN    Anywhere                  
80,443/tcp (Nginx Full)    ALLOW IN    Anywhere                  
80,443/tcp                 ALLOW IN    Anywhere                  
25                         ALLOW IN    Anywhere                  
143                        ALLOW IN    Anywhere                  
993                        ALLOW IN    Anywhere                  
22                       ALLOW IN    Anywhere                  
21                       ALLOW IN    Anywhere                  
21/tcp                   ALLOW IN    Anywhere                  
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)             
80,443/tcp (Nginx Full (v6)) ALLOW IN    Anywhere (v6)             
80,443/tcp (v6)            ALLOW IN    Anywhere (v6)             
25 (v6)                    ALLOW IN    Anywhere (v6)             
143 (v6)                   ALLOW IN    Anywhere (v6)             
993 (v6)                   ALLOW IN    Anywhere (v6)             
22 (v6)                  ALLOW IN    Anywhere (v6)             
21 (v6)                  ALLOW IN    Anywhere (v6)             
21/tcp (v6)              ALLOW IN    Anywhere (v6) 

我怎样才能摆脱这些?

答案1

在阅读此答案之前,请考虑以下几点:

  1. 连接到系统时有 65,534 个可用端口(1 - 65534)和一堆不同的协议;这意味着根据防火墙规则中为“允许的流量”设置的任何标准,存在大量潜在的“被阻止”的连接。

  2. 任何面向互联网的设备都会从各种设备获取到该盒子的连接尝试,例如:

    • 合法允许的流量
    • 服务扫描仪
    • 暴力破解者
    • 恶意软件/黑客
    • 等等(几乎任何想要尝试并连接(无论是否允许)。
  3. 任何公开面向互联网的东西都会试图找到系统上运行的服务,或尝试扫描盒子以寻找潜在的突破点。因此BLOCK系统日志中才会出现警报。

  4. 防火墙“阻止”警报意味着您的防火墙正在按预期工作,您不必过于担心看到大量此类警报,特别是当您的系统直接面向互联网(而不是在路由器等后面)时。


现在来解答您在评论中关于“有很多这样的条目”和“这就是我担心的原因”的担忧。

当您使用 UFW 运行白名单防火墙时,默认 UFW 配置会添加一条默认规则,该规则会自动为LOG防火墙规则未接受或未处理的任何流量添加规则。例如,假设我有一台服务器,我将其设置为仅允许来自 IP 地址 1.2.3.4 的 SSH。与从服务器出站的流量或从 1.2.3.4 到我的服务器的 SSH 流量(反之亦然)无关的任何其他到我的服务器的流量都将被阻止,并且UFW BLOCK系统日志将发出警报,指示与我的允许规则之一不匹配的流量已被阻止。(也就是说,只有从 1.2.3.4 到端口 22(SSH)的流量或与该连接相关的双向流量才会触发警报BLOCK

你应该担心这个吗? 绝对不。 面向 Web 的服务、服务器、网络等获得对他们来说,来自服务扫描器、合法连接、恶意威胁行为者等的流量。常见的如果您的系统/服务器面向互联网,您会看到大量从外部通过大范围的 IP 地址尝试连接网络,因为这种类型的流量通常会被阻止。


现在来回答你最初的问题:如何禁用警报UFW BLOCK。虽然我不建议禁用警报(因为这表明你的防火墙按预期工作),您可以通过执行以下操作来禁用UFW警报日志项:

sudo ufw logging off

请注意我真的不建议您禁用阻止流量的日志记录,除非您真的需要(例如 syslog 占用了太多磁盘空间,即使在这些情况下也不常见),但是否这样做取决于您。

答案2

如果这些日志让您感到烦恼,因为它们会污染您的系统日志,请编辑/etc/rsyslog.d/20-ufw.conf,最后一行(在 18.04 中)内容为

# & stop

删除#然后重新开始记录:

sudo service rsyslog restart

现在你应该能够找到你的 ufw 日志/var/log/ufw.log

答案3

本文现有规则中没有明确拒绝 tcp/23(telnet) 的规则,隐含规则是拒绝/记录(默认)。要停止记录并仍然拒绝 - 在 ens3 上创建一个显式拒绝规则。

ufw 拒绝 ens3 上的任何 23 端口

或者简单地通过防火墙 telnet 来拒绝主机上所有接口的 telnet 访问:

ufw 拒绝 23

答案4

为了消除这些,我创建了一个 Python 脚本来解析这些 IP 并明确拒绝与我的服务器的通信。这样,系统日志中就没有警告了,那些(大约 3000 个)恶意 IP 就无法再 ping 我了。

import glob
import gzip
import re
import subprocess

def get_lines(log_glob):
    """Return an iterator of each line in all files matching log_glob.
    Lines are sorted most recent first.
    Files are sorted by the integer in the suffix of the log filename.
    Suffix may be one of the following:
         .X (where X is an integer)
         .X.gz (where X is an integer)
    If the filename does not end in either suffix, it is treated as if X=0
    https://www.saltycrane.com/blog/2010/01/iterating-over-lines-multiple-linux-log-files-using-python/
    """
    def sort_by_suffix(fname):
        m = re.search(r'.(?:\.(\d+))?(?:\.gz)?$', fname)
        if m.lastindex:
            suf = int(m.group(1))
        else:
            suf = 0
        return suf

    filelist = glob.glob(log_glob)
    for filename in sorted(filelist, key=sort_by_suffix):
        if filename.endswith('.gz'):
            fh = gzip.open(filename)
        else:
            fh = open(filename)
        for line in reversed(fh.readlines()):
            yield line
        fh.close()

if __name__ == "__main__":

    ip = "here.your.ip.goes"
    mac = "here::your::mac"
    eth = "here your eth name"
    # https://stackoverflow.com/questions/11264005/using-a-regex-to-match-ip-addresses-in-python
    pat = re.compile(r" \[UFW BLOCK\] IN="+eth+" OUT= MAC="+mac+" SRC=(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) DST="+ip+" LEN=")

    badips = []
    for i, line in enumerate(get_lines('/var/log/ufw*')):
        line = line.rstrip()
        line = str(line)
        # ~ print(i, line)
        res = re.search(pat,line)
        if res is None:
            if re.search(r"SRC=your\.ip\.addr\.", line) is not None:
                # ~ print('Broadcast',line)
                continue
            else:
                # ~ print(line)
                continue
        else:
            badip = '.'.join(res.groups(0))
            badips.append(badip)
    badips = sorted(list(dict.fromkeys(badips)))
    # ~ print(badips)
    ips24 = []
    for ip in badips:
        if len(ips24):
            lastip = ips24[-1].split('.')
            thisip = ip.split('.')
            if lastip[0:3] == thisip[0:3]:
                if lastip[3] != "0/24" :
                    lastip[3] = "0/24"
                    ips24[-1] = '.'.join(lastip)
            else:
                ips24.append(ip)
        else:
            ips24.append(ip)
    # Remove anyway all from subnet
    for i, ip in enumerate(ips24):
        theip = ip.split('.')
        if theip[3] != "0/24":
            theip[3] = "0/24"
            ips24[i] = '.'.join(theip)
    ips24 = sorted(list(dict.fromkeys(ips24)))
    # ~ print(ips24)
    ips16 = []
    for ip in ips24:
        if len(ips16):
            lastip = ips16[-1].split('.')
            thisip = ip.split('.')
            if lastip[0:2] == thisip[0:2]:
                if lastip[3] != "0/16" or lastip[2] != "0":
                    lastip[3] = "0/16"
                    lastip[2] = "0"
                    ips16[-1] = '.'.join(lastip)
            else:
                ips16.append(ip)
        else:
            ips16.append(ip)
    ips16 = sorted(list(dict.fromkeys(ips16)))
    # ~ print(ips16)

    ufips = str(subprocess.run(['sudo','ufw','status'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)).split('\\n')
    uips = []
    pat = re.compile(r"Anywhere[ ]+DENY[ ]+(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?[/]?[12][46])")
    for uip in ufips:
        res = re.search(pat,uip)
        if res is None:
            # ~ print (uip)
            continue
        else:
            badip = '.'.join(res.groups(0))
            # ~ print(badip)
            uips.append(badip)
    uips = sorted(list(dict.fromkeys(uips)))
    # ~ print(uips[:10])

    newips = []
    for ip in ips16:
        if not ip in uips:
            newips.append(ip)
    print(len(badips),len(ips24),len(ips16),len(uips),len(newips))

    for ip in newips:
        print(ip)
        proc = subprocess.Popen(['sudo','ufw','deny','from',ip,'to','any'])
        proc.wait()

    print('Done.')

相关内容