使用 ipfw 阻止 IP 地址

使用 ipfw 阻止 IP 地址

我对 ipfw 完全是个新手,所以如果我的问题很基础,我提前道歉,但我没有找到任何资源可以帮助解决使用 GUI 和熟悉命令行 ipfw 之间的差距。


我想阻止反复访问我的网络服务器的 IP。防火墙是 ipfw。我找到了这个命令:

ipfw 添加拒绝 ip 从.ip.to.block 到 my.computer.ip.address

有两点我不太清楚:

  1. 我知道规则将在重启时被清除。我想知道的是运行此命令是否会影响正在运行的任何现有规则?我猜不会,但我想确定一下。

  2. 是否有任何软件可以与 ipfw 相互关联,以便在短时间内添加 ip,然后将其删除?如果没有,我会为此编写一个脚本,但是是否有内置方法可以从多个 conf 文件中添加?如果我可以有一个包含稳定规则的文件和另一个包含动态规则的文件,那么这样做会容易得多。

任何帮助都将不胜感激,即使只是阅读手册,如果您可以提供一个资源链接来帮助我更好地理解它。


我的防火墙脚本:

\#!/bin/sh

/usr/bin/sudo /sbin/ipfw -q flush
/usr/bin/sudo /sbin/ipfw -q delete set 31

/usr/bin/sudo /sbin/ipfw -q /usr/local/bin/Firewall/default.conf

#Check dynamic rules
#anything that's already had the
# green light can continue
add 1000 check-state

add 1050 allow tcp from any to any established

add 1080 allow tcp from any to any out keep-state

add 1090 allow udp from any to any out keep-state

add 1095 allow icmp from any to any out

#loopback
add 1100 allow ip from 127.0.0.1/8 to 127.0.0.1/8 via lo0

add 1200 deny log ip from 127.0.0.1/8 to any in
add 1300 deny log ip from any to 127.0.0.1/8 in

#allow pings and traceroute
# Ping out; accept ping answers.
add 1400 allow icmp from any to any icmptypes 8 out
add 1410 allow icmp from any to any icmptypes 0 in

# Allow me to traceroute.
add 1420 allow icmp from any to any icmptypes 11 in

add 1500 allow tcp from any to any 11305 keep-state setup

#http and https
add 1600 allow tcp from any to any 80 keep-state setup

# rules for reverse proxying
add 1610 allow tcp from me to any 4567 keep-state setup
add 1611 allow tcp from me to any 4568 keep-state setup
add 1612 allow tcp from me to any 4569 keep-state setup

add 1620 allow tcp from me to any 4577 keep-state setup
add 1621 allow tcp from me to any 4578 keep-state setup
add 1622 allow tcp from me to any 4579 keep-state setup
add 1630 allow tcp from me to any 4560 keep-state setup
add 1631 allow tcp from me to any 4561 keep-state setup
add 1632 allow tcp from me to any 4562 keep-state setup
add 1640 allow tcp from me to any 4570 keep-state setup
add 1641 allow tcp from me to any 4571 keep-state setup
add 1642 allow tcp from me to any 4572 keep-state setup


add 1700 allow tcp from any to any 443 keep-state setup

#Bonjour
#add 2000 allow udp from any to any 5653 keep-state setup

#Everything that isn't in a prior rule 

add 65533 reject log udp from any to any in

add 65534 deny log ip from any to any in

答案1

  1. 每次重启都需要重新建立正确的规则。它不会直接影响其他规则,但会间接影响(例如,如果另一条规则出于某种原因允许该 IP,这可能会阻止该 IP...)

  2. 您正在寻找广受欢迎的 fail2ban,它可以读取日志文件并禁止做“坏事”的人的 IP。

此外,您确实不想继续为每个单独的禁令添加规则,这会很快污染规则。但是,您可以添加规则来阻止表,然后将 IP 添加到表中。表只是 IP 列表,因此您可以轻松地将规则应用于整个表,而不是单独指定它们。

例如,我有一个使用的“默认”防火墙脚本,该脚本中的前两个规则是:

00030 deny ip from "table(1)" to me
00031 deny ip from "table(2)" to me

关键字“me”表示我的任何本地 IP 地址。表 1 是 Fail2Ban 的,当它发现一个它不喜欢的 IP 时,它会将该 IP 添加到该表中一段时间​​。表 2 是 Spamhaus 的 DROP 列表,这是一份已知的专业垃圾邮件系统列表(详情请参阅其网站)。

您可以用以下命令手动将 IP 添加到表中:

ipfw table 2 add

在我的服务器上,表 2 在启动时由/usr/local/etc/rc.d/spamhaus-drop以下脚本自动填充:

#!/bin/csh
fetch -i /tmp/drop.lasso -o /tmp/drop.lasso "http://www.spamhaus.org/drop/drop.lasso"
sed -i '' "s/;.*//" /tmp/drop.lasso
ipfw table 2 flush
foreach IP ( `cat /tmp/drop.lasso` )
        ipfw table 2 add $IP
end

我强烈建议您编写自己的脚本来配置防火墙。在 FreeBSD 中使用 ipfw 非常容易,而且我不需要 GUI(我知道这听起来很难,因为这些都是新东西,但基本操作比您想象的要简单)。

我的配置脚本如下/etc/ipfw.rules

#!/bin/sh

#FOR KEAIRA  - The computer this script was customized for.

ipfw -q -f flush       # Delete all rules
cmd="ipfw add"

# Ban tables
$cmd 00030 deny ip from "table(1)" to me
$cmd 00031 deny ip from "table(2)" to me

# Statefull firewall config, more secure
$cmd 00060 check-state

# Allow outbound traffic
$cmd 00130 allow ip from me to any keep-state

# SSH - I have SSH on port 2222 to keep the script kiddies out.
$cmd 11020 allow tcp from any to me dst-port 2222 setup keep-state

# DNS
$cmd 11090 allow tcp from any to me domain setup keep-state
$cmd 11092 allow udp from any to me domain

# NTP
$cmd 11100 allow tcp from any to me ntp setup keep-state
$cmd 11101 allow udp from any to me ntp

# General Network - ICMP & IGMP
$cmd 61001 allow icmp from any to any
$cmd 61002 allow igmp from any to any

# Deny the rest
$cmd 65500 deny ip from any to any

此服务器正在运行 SSH(在备用端口上)、DNS 和 NTP(时间)。其余的只是我放入所有防火墙脚本中的通用内容。如果您需要打开其他服务,请告诉我,我会自定义示例。不过,您可以从中获得大多数服务名称/etc/services,这使得编写这些服务非常容易。每条规则不一定必须有不同的编号,但它使管理它们更容易。规则按编号顺序处理,但除此之外,数字没有任何意义。

通过将以下几行放入/etc/rc.conf

firewall_enable="YES"                   # Firewall On
firewall_script="/etc/ipfw.rules"       # Firewall Script

设置 Fail2Ban 需要做更多工作,但也非常简单。如果您想要了解更多详细信息,请直接询问。

答案2

任何帮助都将不胜感激,即使只是阅读手册,如果您可以提供一个资源链接来帮助我更好地理解它。

这里是:手册/防火墙.html

相关内容