如何使用PF防火墙保护FreeBSD

本教程将向您展示如何使用OpenBSD PF防火墙保护FreeBSD服务器。我们将假定您具有由Vultr部署的全新FreeBSD安装,没有添加用户。除了防火墙配置外,我们还将做其他一些事情,这也将增强FreeBSD服务器的安全性。在配置防火墙之前,我们将安装一些软件包,因为默认的FreeBSD安装附带了最少的工具和软件包集(是正确的),以使我们的工作更轻松。

FreeBSD中的默认shell是/bin/sh。这是基本的外壳程序,没有自动完成功能。我们将使用更好的东西。我们将安装zsh

首先,安装以下软件包:

# pkg install zsh gnuls
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/freebsd:10:x86:64/latest, please wait...
...

GNULS是lsLinux中的程序。我们只想ls在Linux和FreeBSD中使用相同的命令。

向系统添加普通用户:(用您的用户名替换john,不要忘记将用户添加到wheel组)

# adduser
Username: john
Full name: John Doe
Uid (Leave empty for default): 
Login group [john]: 
Login group is john. Invite john into other groups? []: wheel
Login class [default]: 
Shell (sh csh tcsh zsh rzsh nologin) [sh]: zsh
Home directory [/home/john]: 
Home directory permissions (Leave empty for default): 
Use password-based authentication? [yes]: 
Use an empty password? (yes/no) [no]: 
Use a random password? (yes/no) [no]: 
Enter password: 
Enter password again: 
Lock out the account after creation? [no]: 
Username   : john
Password   : *****
Full Name  : John Doe
Uid        : 1001
Class      : 
Groups     : john wheel
Home       : /home/john
Home Mode  : 
Shell      : /usr/local/bin/zsh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (john) to the user database.
Add another user? (yes/no): no
Goodbye!

创建zsh配置文件:

# ee /home/your-username/.zshrc

将此复制到您的.zshrc文件:

PS1="<%U%m%u>$[%B%1~%b]%(#.#.$) "

bindkey -e
alias su='su -m'
alias du='du -h -d0'
alias df='df -h'
alias l=less
alias ll='gnuls --color=always -l'
alias ls='gnuls --color=always'
alias pkg_ver='pkg version -v -l "<" | > upgrade'

export EDITOR=ee

autoload -U colors && colors
autoload -U promptinit && promptinit
autoload -U compinit && compinit

# History settings
SAVEHIST=1000
HISTSIZE=1000
HISTFILE=~/.history
setopt histignoredups appendhistory

运行此命令:(用您的用户名替换john)

chown john:john /home/john/.zshrc

现在,使用您的用户名登录FreeBSD服务器并更改默认的root密码:

<vultr>[~]$ su
Password:
<vultr>[~]# passwd 
Changing local password for root
New Password:
Retype New Password:
<vultr>[~]# 

我们不需要sendmail。停止并禁用此服务:

<vultr>[~]# /etc/rc.d/sendmail stop
Stopping sendmail.
Waiting for PIDS: 7843.
sendmail_submit not running? (check /var/run/sendmail.pid).
Stopping sendmail_msp_queue.
Waiting for PIDS: 7846.

接下来,我们将rc.conf文件更改为更自然:

# ee /etc/rc.conf

将其更改为如下所示:

#----------- NETWORKING ------------------------------------------------#
hostname="ceph.domain1.com" # replace ceph.domain1.com with your domain
ifconfig_vtnet0="dhcp"
static_routes=linklocal
route_linklocal="-net 169.254.0.0/16 -interface vtnet0"

#--------- SERVICES BSD LOCAL ----------------------------------------#
sshd_enable="YES"
ntpd_enable="YES"

#pf_enable="YES"
#pf_rules="/etc/firewall"
#pf_flags=""
#pflog_enable="YES"              
#pflog_logfile="/var/log/pflog"  
#pflog_flags=""    

sendmail_enable="NONE"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"

编辑/etc/hosts文件:

# ee /etc/hosts

添加您的IP地址和主机名:

::1                     localhost localhost.ceph ceph
127.0.0.1               localhost localhost.ceph ceph
108.61.178.110          ceph.domain1.com       ceph

设置时区:

# bsdconfig

只要有可能,请禁用root用户的远程访问。大多数SSH攻击都会尝试通过root用户帐户进行访问。始终使用您的用户名连接,然后再suroot。只有该wheel组中的用户su才能root。因此,我们将用户添加到了车轮组。

禁用root登录:

# ee /etc/ssh/sshd_config

取消注释此行:

PermitRootLogin no

重启:

# reboot

重新启动完成后,您将在Vultr控制台中看到以下消息:

time correction of 3600 seconds exceeds sanity limit (1000); set clock manually to
correct UTC time.

这就是为什么我们需要手动更正时钟。首先遵循以下命令su

$ su
Password:
# ntpdate 0.europe.pool.ntp.org

现在,我们将配置防火墙。OpenBSD PF包含在FreeBSD内核中,因此您无需安装任何软件包。

使用ee编辑器,创建文件/etc/firewall

# ee /etc/firewall

插入以下内容:(用您的替换所有IP地址)

#######################################################################
me="vtnet0"                
table <bruteforcers> persist    
table <trusted> persist file "/etc/trusted"
icmp_types = "echoreq"          
junk_ports="{ 135,137,138,139,445,68,67,3222 }"
junk_ip="224.0.0.0/4"           

set loginterface vtnet0           
scrub on vtnet0 reassemble tcp no-df random-id

# ---- First rule obligatory "Pass all on loopback"
pass quick on lo0 all           

# ---- Block junk logs
block quick proto { tcp, udp } from any to $junk_ip 
block quick proto { tcp, udp } from any to any port $junk_ports

# ---- Second rule "Block all in and pass all out"
block in log all                
pass out all keep state         

############### FIREWALL ###############################################
# ---- Allow all traffic from my Home
pass quick proto {tcp, udp} from 1.2.3.4 to $me keep state

# ---- block SMTP out 
block quick proto tcp from $me to any port 25

# ---- Allow incoming Web traffic
pass quick proto tcp from any to $me port { 80, 443 } flags S/SA keep state

# ---- Allow my team member SSH access 
pass quick proto tcp from 1.2.3.5 to $me port ssh flags S/SA keep state

# ---- Block bruteforcers
block log quick from <bruteforcers>

# ---- Allow SSH from trusted sources, but block bruteforcers
pass quick proto tcp from <trusted> to $me port ssh \
flags S/SA keep state \
(max-src-conn 10, max-src-conn-rate 20/60, \
overload <bruteforcers> flush global)

# ---- Allow ICMP 
pass in inet proto icmp all icmp-type $icmp_types keep state
pass out inet proto icmp all icmp-type $icmp_types keep state

创建/etc/trusted文件。在此文件中,我们将放置我们“信任”的IP。

# ee /etc/trusted

添加一些IP:

# Hosting
1.2.0.0/16

# My friends
1.2.4.0/24

现在一些解释。垃圾端口和垃圾IP只是我们不想在日志中看到的一些端口/ IP。我们使用以下规则完成此操作:

# ---- Block junk logs
block quick proto { tcp, udp } from any to $junk_ip 
block quick proto { tcp, udp } from any to any port $junk_ports

这些只是默认值,您不必担心:

icmp_types = "echoreq"                                            
set loginterface vtnet0           
scrub on vtnet0 reassemble tcp no-df random-id
pass quick on lo0 all
block in log all                
pass out all keep state

此规则阻止来自服务器的传出SMTP通信(这是Vultr的默认设置)。

# ---- block SMTP out 
block quick proto tcp from $me to any port 25

除了bruteforcers其余的一切都非常简单。

# ---- Allow SSH from trusted sources, but block bruteforcers
pass quick proto tcp from <trusted> to $me port ssh \
flags S/SA keep state \
(max-src-conn 10, max-src-conn-rate 20/60, \
overload <bruteforcers> flush global)

Bruteforcers只是说:允许从<trusted> IP到端口22,但一个源IP只能建立10个并发连接。如果大于10,则阻止该IP并将其放入表暴力破解程序中。20/60规则也是如此。这意味着在60秒内最多20个连接。

启用防火墙:

# ee /etc/rc.conf

取消注释以下行:

pf_enable="YES"
pf_rules="/etc/firewall"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""

重启:

# reboot 

如果您做对了所有事情,那么您将能够登录并启用防火墙。您不必在每次更改/etc/firewall文件时都重新启动。做就是了:

# /etc/rc.d/pf reload

查看谁正在尝试实时连接到您的服务器:

# tcpdump -n -e -ttt -i pflog0

显示历史记录:

# tcpdump -n -e -ttt -r /var/log/pflog

查看您是否在bruteforcers表中有人:

# pfctl -t bruteforcers -T show

就是这样。您已经在FreeBSD服务器上成功实现了PF防火墙!

留下評論

在Arch Linux上使用Makepkg

在Arch Linux上使用Makepkg

在Arch Linux上使用Makepkg可以避免系统污染,确保仅安装必要的依赖关系。

如何在Ubuntu 16.04上安装OpenSIPS控制面板

如何在Ubuntu 16.04上安装OpenSIPS控制面板

快速学习如何在Ubuntu 16.04上安装OpenSIPS控制面板,为VoIP提供商提供支持的功能。

在Fedora 28上安装Akaunting

在Fedora 28上安装Akaunting

学习如何在Fedora 28上安装Akaunting,一款适合小型企业和自由职业者的开源会计软件。

如何在CentOS 7上安装Mailtrain新闻通讯应用程序

如何在CentOS 7上安装Mailtrain新闻通讯应用程序

使用其他系统?Mailtrain是一个基于Node.js和MySQL / MariaDB构建的开源自托管新闻通讯应用程序。

诊断Minecraft服务器延迟和低TPS

诊断Minecraft服务器延迟和低TPS

了解導致Minecraft延遲的原因和解決方案,包括優化伺服器性能和減少滯後的步驟。

AI 能否應對越來越多的勒索軟件攻擊?

AI 能否應對越來越多的勒索軟件攻擊?

勒索軟件攻擊呈上升趨勢,但人工智能能否幫助應對最新的計算機病毒?AI 是答案嗎?在這裡閱讀知道是 AI 布恩還是禍根

ReactOS:這是 Windows 的未來嗎?

ReactOS:這是 Windows 的未來嗎?

ReactOS,一個開源和免費的操作系統,這裡有最新版本。它能否滿足現代 Windows 用戶的需求並打倒微軟?讓我們更多地了解這種老式但更新的操作系統體驗。

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

Whatsapp 終於為 Mac 和 Windows 用戶推出了桌面應用程序。現在您可以輕鬆地從 Windows 或 Mac 訪問 Whatsapp。適用於 Windows 8+ 和 Mac OS 10.9+

人工智能如何將流程自動化提升到新的水平?

人工智能如何將流程自動化提升到新的水平?

閱讀本文以了解人工智能如何在小型公司中變得流行,以及它如何增加使它們成長並為競爭對手提供優勢的可能性。

macOS Catalina 10.15.4 補充更新引發的問題多於解決

macOS Catalina 10.15.4 補充更新引發的問題多於解決

最近,Apple 發布了 macOS Catalina 10.15.4 補充更新以修復問題,但似乎該更新引起了更多問題,導致 mac 機器變磚。閱讀這篇文章以了解更多信息