DirectAdmin在FreeBSD系统下配置IPFW的例子

作者:袖梨 2022-06-30

请先确定你可以顺利的访问自己的服务器,不管是本地访问、VM控制台或者是telnet,保证防火墙没有因为意外的错误配置导致系统无法访问。

这里是本文是适用条件:
1.FreeBSD 7.x, 8.x or 9.x; x86 or x64
2.ipfw + tables support
3.DirectAdmin's Brute Force Monitor (version 1.40 required)

跟随本文设置完成之后你将获得一下的功能:
1.通过DirectAdmin的BFM(强力监控)模块自动的封禁IP。
2.根据在DirectAdmin后台BFM中设置的指定时间间隔取消相关的IP封禁。
3.一个强力的防火墙。
4.拥有干净和规整的防火墙规则表。
5.最小的系统修改。

1.在FreeBSD上打开IPFW

先修改rc.conf文件并且打开IPFW

 代码如下 复制代码
 
# ee /etc/rc.conf

把下面的内容增加到rc.conf
 

 代码如下 复制代码
firewall_enable="YES"

重启系统来打开防火墙
一旦系统启用,再次修改rc.conf文件并在firewall_enable="YES"增加以下内容:
 

 代码如下 复制代码
firewall_type="simple"
firewall_script="/etc/ipfw.rules"
firewall_logging="YES"

考虑到防火墙最大规则的限制,附加的改变可能需要sysctl,如果你的服务器很繁忙,你可能会得到以下的错误信息:

 代码如下 复制代码

 
ipfw: install_state: Too many dynamic rules www.111com.net

如果想在以后避免这样的情况,使用下面命令在sysctl.conf(默认值4096)增加一下的内容,这样允许FreeBSD在IPFW中拥有创建和获取动态规则的权限。

 代码如下 复制代码
 
# echo "net.inet.ip.fw.dyn_max=65536" >> /etc/sysctl.conf

或者你可以手动编辑sysctl.conf文件并增加“net.inet.ip.fw.dyn_max=65536”,这里的最大值为65535。

2.为你的防火墙增加一些基本规则

下面的内容可以自己自定义设置,这里我们将标准的服务端口加入防火墙:FTP、SSH、POP、SMTP/EXIM、DNS、HTTP、SSL和DirectAdmin的2222端口,你可以根据自己的实际情况修改相关的设置。

命令“setup limit src-addr ”是用来限制连接主机的IP数目,这是一个非常安全的方法,已经在非常多的大型服务器上成功的使用了很多年。

先修改/etc/ipfw.rules文件,采用命令:

 代码如下 复制代码

# ee /etc/ipfw.rules

将一下内容添加到文件内:
 

 代码如下 复制代码
#!/bin/sh
#################################################
# ipfw Firewall Commands
#################################################
cmd="ipfw -q add"
ipfw -q -f flush
pif="em0"
 
#################################################
# Allow Loopback and Deny Loopback Spoofing
#################################################
$cmd allow all from any to any via lo0
$cmd deny all from any to 127.0.0.0/8
$cmd deny all from 127.0.0.0/8 to any
$cmd deny tcp from any to any frag
 
#################################################
# Stateful rules
#################################################
$cmd check-state
$cmd deny tcp from any to any established
$cmd allow all from any to any out keep-state
$cmd allow icmp from any to any
 
#################################################
# Table 10 for IP blocks
#################################################
ipfw -q table 10 add 127.0.0.2
ipfw -q add 900 deny ip from 'table(10)' to any
 
#################################################
# Incoming/Outgoing Services
#################################################
$cmd 60001 allow tcp from any to any 21 setup limit src-addr 10
$cmd 60002 allow tcp from any to any 22 setup limit src-addr 8
$cmd 60003 allow tcp from any to any 25 setup limit src-addr 10
$cmd 60004 allow tcp from any to any 587 setup limit src-addr 20
$cmd 60005 allow tcp from any to any 53 setup limit src-addr 3
$cmd 60006 allow udp from any to any 53 limit src-addr 3
$cmd 60007 allow tcp from any to any 80 setup limit src-addr 20
$cmd 60008 allow tcp from any to any 110 setup limit src-addr 20
$cmd 60009 allow tcp from any to any 143 setup limit src-addr 10
$cmd 60010 allow tcp from any to any 443 setup limit src-addr 10
$cmd 60011 allow tcp from any to any 2222 setup limit src-addr 12
$cmd 60012 allow tcp from any to any 35000-35999 in setup limit src-addr 10
$cmd 60013 allow tcp from any to any 993 setup limit src-addr 10
$cmd 60014 allow tcp from any to any 995 setup limit src-addr 10
$cmd 60015 allow tcp from any to any 465 setup limit src-addr 10
$cmd 60016 allow tcp from any to any 585 setup limit src-addr 10
 
#################################################
# Deny Port scanning (Nmap)
#################################################
$cmd 00600 deny log logamount 50 ip from any to any ipoptions rr
$cmd 00610 deny log logamount 50 ip from any to any ipoptions ts
$cmd 00620 deny log logamount 50 ip from any to any ipoptions lsrr
$cmd 00630 deny log logamount 50 ip from any to any ipoptions ssrr
$cmd 00640 deny log logamount 50 tcp from any to any tcpflags syn,fin
$cmd 00650 deny log logamount 50 tcp from any to any tcpflags syn,rst
 
#################################################
# Deny and Log
#################################################
$cmd deny log all from any to any

3.创建必要的DirectAdmin的封禁和解除封禁的脚本,并赋予执行的权限:

 

 代码如下 复制代码
# cd /usr/local/directadmin/scripts/custom
# touch block_ip.sh unblock_ip.sh brute_force_notice_ip.sh show_blocked_ips.sh
# chmod 755 block_ip.sh unblock_ip.sh brute_force_notice_ip.sh show_blocked_ips.sh

4.将文件准备好之后复制并粘贴以下内容:

block_ip.sh:

 

 代码如下 复制代码

#!/bin/sh
 
echo "Blocking IP: $ip
";
 
/sbin/ipfw -q table 10 add $ip
 
echo "

Result:";
echo "

<textarea cols=160 rows=60>";
 
/sbin/ipfw table 10 list
 
echo "www.111Cn.net";
 
exit 0;

unblock_ip.sh:

 
#!/bin/sh
 
echo "Unblocking IP: $ip
";
 
/sbin/ipfw -q table 10 delete $ip
 
exit 0;

brute_force_notice_ip.sh:

 

#!/bin/sh
 
SCRIPT=/usr/local/directadmin/scripts/custom/block_ip.sh
 
ip=$value $SCRIPT
 
exit $?;

show_blocked_ips.sh:
 

#!/bin/sh
 
/sbin/ipfw table 10 list | sed 's//32 0//g'
 
exit 0;

现在核实一下DirectAdmin已经在BFM模块中提供了Block IPs的功能,就可以重启服务,来确保系统重启之后仍然可用,然后可以逐个检查其他的服务。

相关文章

精彩推荐