使用 Python3 循环在 Firewalld 中添加丰富的规则
Add Rich Rules in Firewalld using Python3 Loop
我正在尝试使用 Python3 遍历 IP 地址列表,然后使用 firewalld 阻止它们。
注意:我是Python的完全新手,所以如果有任何简单的错误,请原谅。
import subprocess
with open("ips.txt") as ipList:
ips = ipList.readlines()
for ip in ips:
process = subprocess.Popen(['firewall-cmd',
'--permanent',
'--add-rich-rule=\'rule family=\"ipv4\" source address=\"{0}\" reject\''.format(ip.rstrip())
])
我正在使用 format.rstrip 删除列表中每个 IP 地址后的换行符。
当 运行 运行脚本时,我收到以下错误;
root@mediaserver:~# python3 block.py
Error: INVALID_RULE: internal error in _lexer(): rule family="ipv4" source address="1.56.0.0/13" reject
Error: INVALID_RULE: internal error in _lexer(): rule family="ipv4" source address="1.48.0.0/15" reject
此错误消息遍历了我列表中的所有 IP 块。
如果我 运行 我的脚本之外的 firewall-cmd 我不会收到任何错误消息并且规则已正确添加。
root@mediaserver:~# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="223.198.0.0/15" reject'
success
root@mediaserver:~# firewall-cmd --reload
success
root@mediaserver:~# firewall-cmd --zone=public --list-all
public (default, active)
interfaces: eth0
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="223.198.0.0/15" reject
root@mediaserver:~# iptables -L IN_public_deny
Chain IN_public_deny (1 references)
target prot opt source destination
REJECT all -- 223.198.0.0/15 anywhere reject-with icmp-port-unreachable
root@mediaserver:~# which python3
/usr/bin/python3
root@mediaserver:~# firewall-cmd --version
0.3.7
我认为这个问题可能与我如何转义 python 脚本中的字符有关,但据我所知,它们被正确转义了。如果我可以提供任何其他调试信息,请告诉我。
解决方案是 multi-part。我们通过声明部分命令参数并使用行继续将所有内容分开来组织格式。这有助于保持一切井井有条并减少字符转义错误。此外,我们从 Popen 切换到 运行,因为 Popen 对于这种用法来说过多,并向我们的子流程添加了 shell=True 值。
import subprocess
with open("ips.txt") as ip_list:
ips = ip_list.readlines()
ips = (ip.strip() for ip in ips)
rules = ('rule family="ipv4" source address="{0}" reject'.format(ip) for ip in ips)
for rule in rules:
process = subprocess.run("firewall-cmd "
"--permanent "
" --add-rich-rule=\'{0}\'".format(rule),
shell=True)
我正在尝试使用 Python3 遍历 IP 地址列表,然后使用 firewalld 阻止它们。
注意:我是Python的完全新手,所以如果有任何简单的错误,请原谅。
import subprocess
with open("ips.txt") as ipList:
ips = ipList.readlines()
for ip in ips:
process = subprocess.Popen(['firewall-cmd',
'--permanent',
'--add-rich-rule=\'rule family=\"ipv4\" source address=\"{0}\" reject\''.format(ip.rstrip())
])
我正在使用 format.rstrip 删除列表中每个 IP 地址后的换行符。
当 运行 运行脚本时,我收到以下错误;
root@mediaserver:~# python3 block.py
Error: INVALID_RULE: internal error in _lexer(): rule family="ipv4" source address="1.56.0.0/13" reject
Error: INVALID_RULE: internal error in _lexer(): rule family="ipv4" source address="1.48.0.0/15" reject
此错误消息遍历了我列表中的所有 IP 块。
如果我 运行 我的脚本之外的 firewall-cmd 我不会收到任何错误消息并且规则已正确添加。
root@mediaserver:~# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="223.198.0.0/15" reject'
success
root@mediaserver:~# firewall-cmd --reload
success
root@mediaserver:~# firewall-cmd --zone=public --list-all
public (default, active)
interfaces: eth0
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="223.198.0.0/15" reject
root@mediaserver:~# iptables -L IN_public_deny
Chain IN_public_deny (1 references)
target prot opt source destination
REJECT all -- 223.198.0.0/15 anywhere reject-with icmp-port-unreachable
root@mediaserver:~# which python3
/usr/bin/python3
root@mediaserver:~# firewall-cmd --version
0.3.7
我认为这个问题可能与我如何转义 python 脚本中的字符有关,但据我所知,它们被正确转义了。如果我可以提供任何其他调试信息,请告诉我。
解决方案是 multi-part。我们通过声明部分命令参数并使用行继续将所有内容分开来组织格式。这有助于保持一切井井有条并减少字符转义错误。此外,我们从 Popen 切换到 运行,因为 Popen 对于这种用法来说过多,并向我们的子流程添加了 shell=True 值。
import subprocess
with open("ips.txt") as ip_list:
ips = ip_list.readlines()
ips = (ip.strip() for ip in ips)
rules = ('rule family="ipv4" source address="{0}" reject'.format(ip) for ip in ips)
for rule in rules:
process = subprocess.run("firewall-cmd "
"--permanent "
" --add-rich-rule=\'{0}\'".format(rule),
shell=True)