mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-02-03 23:40:14 +08:00
PRF:20170829 How To Set Up PF Firewall on FreeBSD to Protect a Web Server.md
@ucasFL
This commit is contained in:
parent
8da63a23a0
commit
e7144341d9
@ -3,13 +3,13 @@
|
|||||||
|
|
||||||
[![How To Set Up a Firewall with PF on FreeBSD to Protect a Web Server][1]][1]
|
[![How To Set Up a Firewall with PF on FreeBSD to Protect a Web Server][1]][1]
|
||||||
|
|
||||||
我是从 Linux 迁移过来的 FreeBSD 新用户,Linux 中使用的是 netfilter 防火墙框架(LCTT 译注:netfilter 是由 Rusty Russell 提出的 Linux 2.4 内核防火墙框架)。那么在 FreeBSD 上,我该如何设置 PF 防火墙,从而来保护只有一个公共 IP 地址和端口的 web 服务器呢?
|
我是从 Linux 迁移过来的 FreeBSD 新用户,Linux 中使用的是 netfilter 防火墙框架(LCTT 译注:netfilter 是由 Rusty Russell 提出的 Linux 2.4 内核防火墙框架)。那么在 FreeBSD 上,我该如何设置 PF 防火墙,来保护只有一个公共 IP 地址和端口的 web 服务器呢?
|
||||||
|
|
||||||
PF 是<ruby>包过滤器<rt>packet filter</rt></ruby>的简称。它是为 OpenBSD开发的,但是已经被移植到了 FreeBSD 以及其它操作系统上。PF 是一个状态包过滤引擎。在这篇教程中,我将向你展示如何在 FreeBSD 10.x 以及 11.x 中设置 PF 防火墙,从而来保护 web 服务器。
|
PF 是<ruby>包过滤器<rt>packet filter</rt></ruby>的简称。它是为 OpenBSD 开发的,但是已经被移植到了 FreeBSD 以及其它操作系统上。PF 是一个包状态过滤引擎。在这篇教程中,我将向你展示如何在 FreeBSD 10.x 以及 11.x 中设置 PF 防火墙,从而来保护 web 服务器。
|
||||||
|
|
||||||
### 第一步:开启 PF 防火墙
|
### 第一步:开启 PF 防火墙
|
||||||
|
|
||||||
你需要把下面这几行内容添加到文件 “/etc/rc.conf” 文件中:
|
你需要把下面这几行内容添加到文件 `/etc/rc.conf` 文件中:
|
||||||
|
|
||||||
```
|
```
|
||||||
# echo 'pf_enable="YES"' >> /etc/rc.conf
|
# echo 'pf_enable="YES"' >> /etc/rc.conf
|
||||||
@ -17,20 +17,22 @@ PF 是<ruby>包过滤器<rt>packet filter</rt></ruby>的简称。它是为 OpenB
|
|||||||
# echo 'pflog_enable="YES"' >> /etc/rc.conf
|
# echo 'pflog_enable="YES"' >> /etc/rc.conf
|
||||||
# echo 'pflog_logfile="/var/log/pflog"' >> /etc/rc.conf
|
# echo 'pflog_logfile="/var/log/pflog"' >> /etc/rc.conf
|
||||||
```
|
```
|
||||||
|
|
||||||
在这里:
|
在这里:
|
||||||
|
|
||||||
1. **pf_enable="YES"** - 开启 PF 服务
|
1. `pf_enable="YES"` - 开启 PF 服务
|
||||||
2. **pf_rules="/usr/local/etc/pf.conf"** - 从文件 “/usr/local/etc/pf.conf” 中读取 PF 规则
|
2. `pf_rules="/usr/local/etc/pf.conf"` - 从文件 `/usr/local/etc/pf.conf` 中读取 PF 规则
|
||||||
3. **pflog_enable="YES"** - 为 PF 服务打开日志支持
|
3. `pflog_enable="YES"` - 为 PF 服务打开日志支持
|
||||||
4. **pflog_logfile="/var/log/pflog"** - 存储日志的文件,即日志存于文件 “/var/log/pflog” 中
|
4. `pflog_logfile="/var/log/pflog"` - 存储日志的文件,即日志存于文件 `/var/log/pflog` 中
|
||||||
|
|
||||||
### 第二步:在 “/usr/local/etc/pf.conf” 文件中创建防火墙规则
|
### 第二步:在 `/usr/local/etc/pf.conf` 文件中创建防火墙规则
|
||||||
|
|
||||||
输入下面这个命令打开文件(超级用户模式下):
|
输入下面这个命令打开文件(超级用户模式下):
|
||||||
|
|
||||||
```
|
```
|
||||||
# vi /usr/local/etc/pf.conf
|
# vi /usr/local/etc/pf.conf
|
||||||
```
|
```
|
||||||
|
|
||||||
在文件中添加下面这些 PF 规则集:
|
在文件中添加下面这些 PF 规则集:
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -98,35 +100,56 @@ pass out quick on $ext_if proto udp to any port $int_udp_services
|
|||||||
|
|
||||||
保存并关闭文件。欢迎来参考我的[规则集][2]。如果要检查语法错误,可以运行:
|
保存并关闭文件。欢迎来参考我的[规则集][2]。如果要检查语法错误,可以运行:
|
||||||
|
|
||||||
`# service pf check`
|
```
|
||||||
|
# service pf check
|
||||||
|
```
|
||||||
|
|
||||||
或
|
或
|
||||||
`/etc/rc.d/pf check`
|
|
||||||
|
```
|
||||||
|
/etc/rc.d/pf check
|
||||||
|
```
|
||||||
|
|
||||||
或
|
或
|
||||||
`# pfctl -n -f /usr/local/etc/pf.conf `
|
|
||||||
|
```
|
||||||
|
# pfctl -n -f /usr/local/etc/pf.conf
|
||||||
|
```
|
||||||
|
|
||||||
### 第三步:开始运行 PF 防火墙
|
### 第三步:开始运行 PF 防火墙
|
||||||
|
|
||||||
命令如下。请小心,如果是基于 SSH 的会话,你可能会和服务器断开连接。
|
命令如下。请小心,如果是基于 SSH 的会话,你可能会和服务器断开连接。
|
||||||
|
|
||||||
*开启 PF 防火墙:*
|
#### 开启 PF 防火墙:
|
||||||
|
|
||||||
`# service pf start`
|
```
|
||||||
|
# service pf start
|
||||||
|
```
|
||||||
|
|
||||||
*停用 PF 防火墙:*
|
#### 停用 PF 防火墙:
|
||||||
|
|
||||||
`# service pf stop`
|
```
|
||||||
|
# service pf stop
|
||||||
|
```
|
||||||
|
|
||||||
*检查语法错误:*
|
#### 检查语法错误:
|
||||||
|
|
||||||
`# service pf check`
|
```
|
||||||
|
# service pf check
|
||||||
|
```
|
||||||
|
|
||||||
*重启服务:*
|
#### 重启服务:
|
||||||
|
|
||||||
`# service pf restart`
|
```
|
||||||
|
# service pf restart
|
||||||
|
```
|
||||||
|
|
||||||
*查看 PF 状态:*
|
#### 查看 PF 状态:
|
||||||
|
|
||||||
|
```
|
||||||
|
# service pf status
|
||||||
|
```
|
||||||
|
|
||||||
`# service pf status`
|
|
||||||
示例输出:
|
示例输出:
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -168,7 +191,8 @@ Counters
|
|||||||
|
|
||||||
#### 开启/关闭/重启 pflog 服务的命令
|
#### 开启/关闭/重启 pflog 服务的命令
|
||||||
|
|
||||||
输入下面这些命令
|
输入下面这些命令:
|
||||||
|
|
||||||
```
|
```
|
||||||
# service pflog start
|
# service pflog start
|
||||||
# service pflog stop
|
# service pflog stop
|
||||||
@ -181,7 +205,10 @@ Counters
|
|||||||
|
|
||||||
#### 显示 PF 规则信息
|
#### 显示 PF 规则信息
|
||||||
|
|
||||||
`# pfctl -s rules`
|
```
|
||||||
|
# pfctl -s rules
|
||||||
|
```
|
||||||
|
|
||||||
示例输出:
|
示例输出:
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -204,11 +231,15 @@ pass out quick on vtnet0 proto udp from any to any port = ntp keep state
|
|||||||
|
|
||||||
#### 显示每条规则的详细内容
|
#### 显示每条规则的详细内容
|
||||||
|
|
||||||
`# pfctl -v -s rules`
|
```
|
||||||
|
# pfctl -v -s rules
|
||||||
|
```
|
||||||
|
|
||||||
在每条规则的详细输出中添加规则编号:
|
在每条规则的详细输出中添加规则编号:
|
||||||
|
|
||||||
`# pfctl -vvsr show`
|
```
|
||||||
|
# pfctl -vvsr show
|
||||||
|
```
|
||||||
|
|
||||||
#### 显示状态信息
|
#### 显示状态信息
|
||||||
|
|
||||||
@ -220,15 +251,22 @@ pass out quick on vtnet0 proto udp from any to any port = ntp keep state
|
|||||||
|
|
||||||
#### 如何在命令行中禁止 PF 服务
|
#### 如何在命令行中禁止 PF 服务
|
||||||
|
|
||||||
`# pfctl -d `
|
```
|
||||||
|
# pfctl -d
|
||||||
|
```
|
||||||
|
|
||||||
#### 如何在命令行中启用 PF 服务
|
#### 如何在命令行中启用 PF 服务
|
||||||
|
|
||||||
`# pfctl -e `
|
```
|
||||||
|
# pfctl -e
|
||||||
|
```
|
||||||
|
|
||||||
#### 如何在命令行中刷新 PF 规则/NAT/路由表
|
#### 如何在命令行中刷新 PF 规则/NAT/路由表
|
||||||
|
|
||||||
`# pfctl -F all`
|
```
|
||||||
|
# pfctl -F all
|
||||||
|
```
|
||||||
|
|
||||||
示例输出:
|
示例输出:
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -243,25 +281,36 @@ pf: interface flags reset
|
|||||||
|
|
||||||
#### 如何在命令行中仅刷新 PF 规则
|
#### 如何在命令行中仅刷新 PF 规则
|
||||||
|
|
||||||
`# pfctl -F rules `
|
```
|
||||||
|
# pfctl -F rules
|
||||||
|
```
|
||||||
|
|
||||||
#### 如何在命令行中仅刷新队列
|
#### 如何在命令行中仅刷新队列
|
||||||
|
|
||||||
`# pfctl -F queue `
|
```
|
||||||
|
# pfctl -F queue
|
||||||
|
```
|
||||||
|
|
||||||
#### 如何在命令行中刷新统计信息(它不是任何规则的一部分)
|
#### 如何在命令行中刷新统计信息(它不是任何规则的一部分)
|
||||||
|
|
||||||
`# pfctl -F info`
|
```
|
||||||
|
# pfctl -F info
|
||||||
|
```
|
||||||
|
|
||||||
#### 如何在命令行中清除所有计数器
|
#### 如何在命令行中清除所有计数器
|
||||||
|
|
||||||
`# pfctl -z clear `
|
```
|
||||||
|
# pfctl -z clear
|
||||||
|
```
|
||||||
|
|
||||||
### 第五步:查看 PF 日志
|
### 第五步:查看 PF 日志
|
||||||
|
|
||||||
PF 日志是二进制格式的。使用下面这一命令来查看:
|
PF 日志是二进制格式的。使用下面这一命令来查看:
|
||||||
|
|
||||||
`# tcpdump -n -e -ttt -r /var/log/pflog`
|
```
|
||||||
|
# tcpdump -n -e -ttt -r /var/log/pflog
|
||||||
|
```
|
||||||
|
|
||||||
示例输出:
|
示例输出:
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -305,7 +354,10 @@ Aug 29 16:01:36.990050 rule 0/(match) block in on vio0: 182.18.8.28.23299 > 45.F
|
|||||||
```
|
```
|
||||||
|
|
||||||
如果要查看实时日志,可以运行:
|
如果要查看实时日志,可以运行:
|
||||||
`# tcpdump -n -e -ttt -i pflog0`
|
|
||||||
|
```
|
||||||
|
# tcpdump -n -e -ttt -i pflog0
|
||||||
|
```
|
||||||
|
|
||||||
如果你想了解更多信息,可以访问 [PF FAQ][3] 和 [FreeBSD HANDBOOK][4] 以及下面这些 man 页面:
|
如果你想了解更多信息,可以访问 [PF FAQ][3] 和 [FreeBSD HANDBOOK][4] 以及下面这些 man 页面:
|
||||||
|
|
||||||
@ -325,7 +377,7 @@ via: https://www.cyberciti.biz/faq/how-to-set-up-a-firewall-with-pf-on-freebsd-t
|
|||||||
|
|
||||||
作者:[Vivek Gite][a]
|
作者:[Vivek Gite][a]
|
||||||
译者:[ucasFL](https://github.com/ucasFL)
|
译者:[ucasFL](https://github.com/ucasFL)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user