首页 > 解决方案 > 为什么 python-iptables 在使用 syslog 模块时会出现问题

问题描述

我遇到了一个奇怪的错误。我已经解决了 2 天,但未能解决它。所以我想在这里发布它,看看是否有人可以帮助解决这个问题。我发现 python-iptables(iptc) 不能与 syslog 模块一起使用。请看下面的代码。test1() 只会发送前 2 条日志消息。test2 和 test3 工作正常。我在 ubuntu16.04 和 20.04、python3.6 和 python3.8 上都对此进行了测试。

import syslog
import iptc # pip install python-iptables
import os
import socket

def log(msg):
    syslog.openlog(ident="xxxxxx")
    syslog.syslog(syslog.LOG_INFO, msg)
    syslog.closelog()

def log2(msg):
    sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM|socket.SOCK_CLOEXEC)
    sock.connect("/dev/log")
    sock.send(("  xxxxxx: "+msg).encode("utf-8"))
    sock.close()

def add_rule_cmdline():
    os.system("iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT")

def add_rule_iptc():
    table = iptc.Table(iptc.Table.FILTER)
    chain = iptc.Chain(table, "INPUT")
    rule1 = {'target': 'ACCEPT','conntrack': {'ctstate': 'RELATED,ESTABLISHED'}}
    chain.append_rule(iptc.easy.encode_iptc_rule(rule1))
    table.close()

#no test2 received
def test1():  
    log("test0")
    os.system("iptables -F")
    log("test1")
    add_rule_iptc()
    log("test2")

#working
def test2():  
    log("test0")
    os.system("iptables -F")
    log("test1")
    add_rule_cmdline()
    log("test2")

#working
def test3():  
    log2("test0")
    os.system("iptables -F")
    log2("test1")
    add_rule_iptc()
    log2("test2")

标签: pythonsyslogpython-iptables

解决方案


推荐阅读