免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: minok
打印 上一主题 下一主题

菜鸟100问 [复制链接]

论坛徽章:
0
121 [报告]
发表于 2006-12-09 09:00 |只看该作者
PF: 研究 FTP

------------------------------------------------------------------------------

^-^  (参见pf中文手册)
^-^
==============================================================================

论坛徽章:
0
122 [报告]
发表于 2006-12-09 09:10 |只看该作者

附加主题

PF: pf验证: 用Shell 进行网关验证

------------------------------------------------------------------------------
简介

Authpf(Cool是身份认证网关的用户shell。类似于普通网关,只不过用户必须在网关上通过身份验证后才能使用该网关。当用户 shell被设置为/usr/sbin/authpf时(例如,代替了ksh(1),csh(1)等),并且用户通过SSH登录,authpf将对pf (4)策略集做必要的修改,以便该用户的数据包可以通过过滤器或者(和)使用NAT、重定向功能。一旦用户退出登录或者连接被断开,authpf将移除加载到该用户上的所有策略,同时关闭该用户打开的所有会话。因此,只有当用户保持着他的SSH会话进程时他才具备透过防火墙发送数据包的能力。  

Authpf通过向附加到锚点的命名策略集增加策略来改变pf(4)的策略集。每次用户进行身份验证,authpf建立一个新的命名策略集,并将已经配置好的filter、nat、binat和rdr规则加载上去。被authpf所加载的策略,可以被配置为针对单一用户相关或者针对总体。

Authpf可以应用在:

* 在允许用户访问因特网之前进行身份验证。
* 赋予特殊用户访问受限网络的权利,例如管理员。
* 只允许特定的无线网络用户访问特定的网络。
* 允许公司员工在任何时候访问公司网络,而公司之外的用户不能访问。
* 通过PF限制guest用户对因特网的访问。Authpf可以用来向已注册用户开放完全的因特网连接。

Authpf通过syslogd(8)记录每一个成功通过身份验证用户的用户名、IP地址、开始结束时间。通过这些信息,管理员可以确定谁在何时登陆,也使得用户对其网络流量负责。

配置

配置authpf的基本步骤大致描述如下。详细的信息请查看man手册。

将authpf连入主策略集

通过使用锚点策略将authpf连入主策略集:

nat-anchor authpf
rdr-anchor authpf
binat-anchor authpf
anchor authpf

锚点策略放入策略集的位置,就是PF中断执行主策略集转为执行authpf策略的位置。上述4个锚点策略并不需要全部存在,例如,当authpf没有被设置加载任何nat策略时,nat-anchor策略可被省略。

配置加载的策略

Authpf通过下面两个文件之一加载策略:

* /etc/authpf/users/$USER/authpf.rules
* /etc/authpf/authpf.rules

第一个文件包含只有当用户$USER(替换为具体的用户名)登录时才被加载的策略。当特殊用户(例如管理员)需要一系列不同于其他默认用户的策略集时可以使用每用户策略配置。第二个文件包含没定义authpf.rules文件的用户所默认加载的策略。如果用户定义的文件存在,将覆盖默认文件。这两个文件至少存在其一,否则authpf将不会工作。

过滤器和传输策略与其他的PF策略集语法一样,但有一点不同:authpf允许使用预先定义的宏:

* $user_ip – 登录用户的IP地址
* $user_id – 登录用户的用户名

推荐使用宏$user_ip,只赋予通过身份验证的计算机透过防火墙的权限。

访问控制列表

可以通过在/etc/authpf/banned/目录下,建立以用户名命名的文件来阻止该用户使用authpf。文件的内容将在authpf断开与该用户连接之前显示给他,这为通知该用户被禁止访问的原因。

相反,如果只允许特定的用户访问,可以将用户名写入/etc/authpf/authpf.allow文件。如果该文件不存在或者文件中输入了“*”,则authpf将允许任何成功通过SSH登录的用户进行访问(没有被明确禁止的用户)。  

如果authpf不能断定一个用户名是被允许还是禁止,它将打印一个摘要信息并断开该用户的连接。明确禁止将会使明确允许失效。

将authpf配置为用户shell

authpf必须作为用户的登录shell才能正常工作。当用户成功通过sshd(8)登录后,authpf将被作为用户的shell执行。它将检查该用户是否有权使用authpf,并从适当的文件中加载策略,等等。

有两种途径将authpf设置为用户shell:

1.为每个用户手动使用chsh(1), vipw(Cool, useradd(Cool, usermod(Cool,等。
2.通过把一些用户分配到一个登录类,在文件/etc/login.conf中改变这个登录类的shell属性

查看登陆者

一旦用户成功登录,并且authpf调整了PF的策略,authpf将改变它的进程名以显示登录者的用户名和IP地址:

# ps -ax | grep authpf
23664 p0 Is+ 0:00.11 -authpf: charlie@192.168 (authpf)

用户chalie从IP地址为192.168.1.3的主机登录。用户可以通过向authpf进程发送SIGTERM信号退出登录。

Authpf也将移除加载到该用户上的策略,并关闭任何该用户打开的会话连接。

# kill -TERM 23664

更多信息请查询man手册

实例

对一个大型校园无线网的用户进行身份验证。一旦某个用户验证通过,假设他不在禁用列表中,他将被允许SSH并访问网页(包括安全网站https),也可以访问该校园的任一个DNS服务器。

文件 /etc/authpf/authpf.rules包含下列策略:

wifi_if = "wi0"
dns_servers = "{ 10.0.1.56, 10.0.2.56 }"

pass in quick on $wifi_if proto udp from $user_ip to $dns_servers \
port domain keep state
pass in quick on $wifi_if proto tcp from $user_ip to port { ssh, http, \
https } flags S/SA keep state

管理员charlie除了网页冲浪和使用SSH外,还需要访问校园网的SMTP和POP3服务器。下列策略被配置在/etc/authpf/users/charlie/authpf.rules 中:

wifi_if = "wi0"
smtp_server = "10.0.1.50"
pop3_server = "10.0.1.51"
dns_servers = "{ 10.0.1.56, 10.0.2.56 }"

pass in quick on $wifi_if proto udp from $user_ip to $dns_servers \
port domain keep state
pass in quick on $wifi_if proto tcp from $user_ip to $smtp_server \
port smtp flags S/SA keep state
pass in quick on $wifi_if proto tcp from $user_ip to $pop3_server \
port pop3 flags S/SA keep state
pass in quick on $wifi_if proto tcp from $user_ip to port { ssh, http, \
https } flags S/SA keep state

定义在/etc/pf.conf中的主策略集配置如下:

# macros
wifi_if = "wi0"
ext_if = "fxp0"

scrub in all

# filter
block drop all

pass out quick on $ext_if proto tcp from $wifi_if:network flags S/SA \
modulate state
pass out quick on $ext_if proto { udp, icmp } from $wifi_if:network \
keep state

pass in quick on $wifi_if proto tcp from $wifi_if:network to $wifi_if \
port ssh flags S/SA keep state

anchor authpf in on $wifi_if

该策略集非常简单,作用如下:

* 阻断所有(默认拒绝)。
* 放行外部网卡接口上的来自无线网络并流向外部的TCP,UDP和ICMP数据包。
* 放行来自无线网络,目的地址为网关本身的SSH数据包。该策略是用户登录所必须的。
* 在无线网络接口上为流入数据建立锚点“authpf”。

设计主策略集的主导思想为:阻断任何包并允许尽可能小的数据流通过。用户一旦通过验证,用户数据包被允许通过无线接口进入,并穿过网关到达其他网络。

论坛徽章:
0
123 [报告]
发表于 2006-12-11 11:07 |只看该作者

菜鸟简单解决

首先你应该是ADSL宽带上网吧.请别笑我!你把那个网卡的IP地址随便设置成一个类别.比如E类,192.168.0.1.子网掩码:255.255.255.0当然其它类的也行.试试吧.我的问题是和你的一样.也是自己做梦解决掉的.

论坛徽章:
0
124 [报告]
发表于 2006-12-11 21:33 |只看该作者

实例规则集

PF: 实例:家庭和小型办公室防火墙

------------------------------------------------------------------------------
概况

在这个例子中,PF作为防火墙和NAT网关,为家庭或办公室的小型网络提供服务。目标是向内部网提供因特网接入,允许从因特网到防火墙的限制访问。下面将详细描述:

^-^  (参见pf中文手册)
^-^

可参考: OpenBSD 封包過濾器


来源: http://bbs.chinaunix.net/forumdisplay.php?fid=5

[ 本帖最后由 新杂人 于 2007-1-13 09:33 编辑 ]

论坛徽章:
0
125 [报告]
发表于 2006-12-12 16:09 |只看该作者

FreeBSD 6.2 上使用 PF 防火墙

要在 FreeBSD 6.2 上使用 PF 防火牆,有二個方式,一個是編譯進入核心,另外是以動態模組方式載入。 編譯進入核心的方式

#FreeBSD log traffic,如果有使用 pflog,就要編譯進核心
device bpf
#啟動 PF Firewall
device pf
#啟動虛擬網路設備來記錄流量(經由 bpf)
device pflog
#啟動虛擬網路設備來監視網路狀態
device pfsync

以動態模組載入
vi /etc/rc.conf
加入下面四行
#啟用 PF
pf_enable="YES"
#PF 防火牆規則的設定檔
pf_rules="/etc/pf.conf"
#啟用 inetd 服務
inetd_enable="YES"
#啟動 pflogd
pflog_enable="YES"
#pflogd 儲存記錄檔案的地方
pflog_logfile="/var/log/pflog"
#轉送封包
gateway_enable="YES"

#開啟 ftp-proxy 功能
vi /etc/inetd.conf
把下面這一行最前面的 # 刪除
ftp-proxy stream tcp nowait root /usr/libexec/ftp-proxy ftp-proxy

使用 sysctl 做設定(也可以重新開機讓設定生效)
sysctl -w net.inet.ip.forwarding=1

vi /etc/pf.conf

#對外的網路卡
ext_if = "sis0"
#對內的網路卡
int_if = "rl0"

#頻寬控管
#定義 std_out 總頻寬 512Kb
#altq on $ext_if cbq bandwidth 512Kb queue { std_out }
#定義 std_out 佇列頻寬 256Kb,使用預設佇列
#queue std_out bandwith 256Kb cbq (default)
#定義 std_in 總頻寬 2Mb
#altq on $int_if cbq bandwidth 2Mb queue { std_in }
#假設頻寬足夠的話,可以從父佇列借用額外的頻寬
#queue std_in bandwidth 768Kb cbq (brrrow)

#對外開放的服務
open_services = "{80, 443}"
#內部私有的 IP
priv_nets = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }"

# options
#設定拒絕連線封包的處理方式
set block-policy return
#
set optimization aggressive
#紀錄 $ext_if
set loginterface $ext_if

# scrub
#整理封包
scrub in all

#nat
#NAT 位址轉譯處理
nat on $ext_if from $int_if:network to any -> $ext_if

#ftp-proxy
#ftp-proxy 重新導向
rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 port 8021
#rdr on $ext_if proto tcp from any to 140.111.152.13 port 21 -> 192.168.13.253 port 21
#Transparent Proxy Server
rdr on rl0 proto tcp from 192.168.13.0/24 to any 80 -> 127.0.0.1 port 3128

#阻擋可疑封包在 $ext_if 網卡進出
antispoof log quick for $ext_if

#阻擋所有進出的封包
block all

#開放 loopback
pass quick on lo0 all

#拒絕內部私有 IP 對 $ext_if 網路卡連線
block drop in quick on $ext_if from $priv_nets to any
block drop out quick on $ext_if from any to $priv_nets


#開放對外的 80, 443 埠
pass in on $ext_if inet proto tcp from any to $ext_if port $open_services flags S/SA keep state
#只容許 140.111.152.0/24 網段對本機做 22 埠連線
pass in on $ext_if inet proto tcp from 140.111.152.0/24 to $ext_if port 22 flags S/SA keep state

#開放內部網路對外連線
#pass in on $inf_if proto rcp from any to any queue std_in
pass in on $int_if from $int_if:network to any keep state
pass out on $int_if from any to $int_if:network keep state


#開放對外網路的連線
#pass out $ext_if proto tcp from any to any queue std_out
pass out on $ext_if proto tcp all modulate state flags S/SA
pass out on $ext_if proto { udp, icmp } all keep state


啟動 PF,並讀取 pf 規則
pfctl -e;pfctl -f /etc/pf.conf

PF 指令的用法
#啟動 PF
pfctl -e
#載入 PF 規則
pfctl -f /etc/pf.conf
#檢查 PF 語法是否正確 (未載入)
pfctl -nf /etc/pf.conf
#停用 PF
pfctl -d
#重讀 PF 設定檔中的 NAT 部分
pfctl -f /etc/pf.conf -N
#重讀 PF 設定檔中的 filter rules
pfctl -f /etc/pf.conf -R
#重讀 PF 設定檔中的選項規則
pfctl -f /etc/pf.conf -O

#查看 PF 資訊
#顯示現階段過濾封包的統計資料
pfctl -s info
pfctl -si

pfctl -s memory


#顯示現階段過濾的規則
pfctl -s rules
pfctl -sr

pfctl -vs rules


#顯示現階段過濾封包的統計資料
pfctl -vsr

#顯示現階段 NAT 的規則
pfctl -s nat
pfctl -sn


#檢視目前佇列
pfctl -s queue

#顯示現階段所有統計的資料
pfctl -s all
pfctl -sa


#清除 PF 規則
#清空 NAT 規則
pfctl -F nat
#清空佇列
pfctl -F queue
#清空封包過濾規則
pfctl -F rules
#清空計數器
pfctl -F info
pfctl -F Tables

#清空所有的規則
pfctl -F all

#PF Tables 的使用
#顯示 table 內資料
pfctl -t ssh-bruteforce -Tshow
pfctl -t table_name -T add spammers.org
pfctl -t table_name -T delete spammers.org
pfctl -t table_name -T flush
pfctl -t table_name -T show
pfctl -t table_name -T zero


過濾掃描偵測軟體
block in quick proto tcp all flags SF/SFRA
block in quick proto tcp all flags SFUP/SFRAU
block in quick proto tcp all flags FPU/SFRAUP
block in quick proto tcp all flags /SFRA
block in quick proto tcp all flags F/SFRA
block in quick proto tcp all flags U/SFRAU
block in quick proto tcp all flags P


如果防火牆和 Proxy Server 不在同一台主機
Proxy Server:192.168.13.250
no rdr on rl0 proto tcp from 192.168.13.250 to any port 80
rdr on rl0 proto tcp from 192.168.13.0/24 to any port 80 -> 192.168.13.250 port 3128



简体版http://bbs.chinaunix.net/viewthread.php?tid=865065

[ 本帖最后由 新杂人 于 2007-1-13 09:23 编辑 ]

论坛徽章:
0
126 [报告]
发表于 2006-12-12 16:30 |只看该作者
真是好帖,收藏起來先。謝謝版主。版主的無私與做文章的細致認真值得敬佩!

论坛徽章:
0
127 [报告]
发表于 2006-12-13 11:27 |只看该作者
原帖由 @kang 于 2006-12-12 16:30 发表
真是好帖,收藏起來先。謝謝版主。版主的無私與做文章的細致認真值得敬佩!



嘿, 作为一只菜鸟不敢领这个功, 只不过是多Google, 抄袭前辈们的文章.

真正要谢的是为BSD作贡献的人们

论坛徽章:
0
128 [报告]
发表于 2006-12-13 12:43 |只看该作者
http://www.cublog.cn/opera/artic ... 701&frmid=32681

<转一台湾朋友文>  
FreeBSD PF 防火墙及 NAT 初次架设


这 台 FreeBSD 服务器第一个用途是作为防火墙,再来是做 IP 分享,然后架设各种服务器(如 HTTP)和一些服务(如 MLDonkey)。两张网卡,其中 vr0 对外连接 ADSL 调制解调器,设有固定 IP;vr1 则是对内连接另一台电脑。这里描述一个基本的设定。

首先是核心设定。因为要用 ftp-proxy 和 dhcpd 所以一定要开 bpf 选项。这在 GENERIC 中就有了,所以除非之前有特地关掉,不然可以不予理会。(ftp-proxy 是为了让 NAT 后面的客户端也能连上外面的 FTP 服务器。)接着修改 /etc/sysctl.conf 加入:

net.inet.ip.forwarding=1

然后在 /etc/inetd.conf 要开启 ftp-proxy 的功能(直接把最后一行批注「#」取消掉就好):

ftp-proxy stream tcp nowait root /usr/libexec/ftp-proxy ftp-proxy

再来改 /etc/rc.conf:

# inetd 一定要记得启动
inetd_enable="YES"
# pf 防火墙的东西
pf_enable="YES"
pf_rules="/etc/pf.conf"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""
# 要开下面这个才能玩 NAT
gateway_enable="YES"

最后,就是实际写 pf 的防火墙规则了。基本上都依照 OpenBSD PF 范例写,不过这里用的有点稍微不同。以下是依照我的 pf.conf 内容,然后加入说明:

# -------------------- 先定义基本宏
ext_if = "vr0" # 连往 ADSL 的界面
int_if = "vr1" # 连往内部网络的接口
# 定义内部网络区段,这些是绝不应该出现在连外接口 $ext_if 的
priv_nets = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }"
# -------------------- 再定义要开放的服务
# 这边是我们要开放给因特网的服务。我们有架 Apache,所以要开 HTTP
# 至于 113 则是 IDENT,一些服务如 IRC、台湾部份 BBS 会用到
tcp_services = "{ http, https, 113 }"
# MLDonkey 需要开的连接�
# 6881-6889 是 BT 用的,33333 是我设定的 ed2k 连接埠,UDP 就是 33333+4
# 至于 44444 则是我设定的 Kad 连接埠,这个在 TCP 和 UDP 都是一样的
# 其它 MLDonkey 连接埠参考:
# http://mldonkey.berlios.de/modul ... FirewallPortsToOpen
mldonkey_tcp_ports = "{ 6881, 6882, 6883, 6884, 6885, 6886, 6887, 6888, 6889, 33333, 44444 }"
mldonkey_udp_ports = "{ 33337, 44444 }"
# 下面这些是只打算开放给内部使用的服务
# 4001、4080 均是 MLDonkey 的控制接口
priv_tcp_services = "{ ssh, 4001, 4080, http }"
# 允许的 ICMP 类型(主要为 ping、tracert 等工具)
icmp_types = "echoreq"
# -------------------- 设定选�
# 好国民要用这个设定,狠心人就别用 return 改成 drop 吧
set block-policy return
# 只记录 $ext_if 的东西
set loginterface $ext_if
# -------------------- Normalization 动作
# 基本动作,把所有封包弄整齐
scrub in all
# -------------------- 地址转译 (NAT) 部份
# 做 NAT
nat on $ext_if from $int_if:network to any -> ($ext_if)
# 这个重新导向是给 ftp-proxy 用的
rdr on $int_if proto tcp from any to any port ftp -> 127.0.0.1 port 8021
# -------------------- 封来过滤规则
# 开始过滤封包,一开始先全挡
block all
# loopback 上的东西基本上都要允许
pass quick on lo0 all
# 把对外接口上绝对不应该出现的 IP 挡掉,避免伪造 IP 来源
block drop in quick on $ext_if from $priv_nets to any
block drop out quick on $ext_if from any to $priv_nets
# 开启要提供给外面的人用的服务
pass in on $ext_if inet proto tcp from any to ($ext_if) port $tcp_services flags S/SA keep state
# 开启 MLDonkey 要用的连接�
pass in on $ext_if inet proto tcp from any to ($ext_if) port $mldonkey_tcp_ports flags S/SA keep state
pass in on $ext_if inet proto udp from any to ($ext_if) port $mldonkey_udp_ports keep state
# 开启供内部网络用的服务
pass in on $int_if inet proto tcp from any to ($int_if) port $priv_tcp_services flags S/SA keep state
# 让 ICMP 数据通过
pass in inet proto icmp all icmp-type $icmp_types keep state
# 很松的规则,假定内部网络使用者都是好人。这个以后再锁紧
pass in on $int_if from $int_if:network to any keep state
pass out on $int_if from any to $int_if:network keep state
# 让对外接口的数据出得去
pass out on $ext_if proto tcp all modulate state flags S/SA
pass out on $ext_if proto { udp, icmp } all keep state

一切完成,先要用 sysctl 做单次设定(除非打算重新开机):

sysctl net.inet.ip.forwarding=1

然后启动 pf,并读入 pf 规则:

pfctl -e; pfctl -f /etc/pf.conf

注意事项:

pf.conf 里的顺序是很重要的(宏和表格除外,表格这里没用到)

论坛徽章:
0
129 [报告]
发表于 2006-12-13 12:48 |只看该作者

pf限制每ip的最大连接数、带宽

pf限制每ip的最大连接数、带宽

限制并发连接数:rainren老大给的解决方案
pass in on $int_if inet proto {tcp,udp} from <ip_www> to any keep state(source-track rule, max-src-nodes 100,max-src-states 10)
node是能有多少个ip可以用, max-src-state每一个ip 的并发连接数为多少, 你上面的意思是这条规则可以存100 个ip地址的state, 每一个ip的并发连接数最大为10

谁有需要的把这两个数值改一下,就可以在keep state的时候用了。

论坛徽章:
0
130 [报告]
发表于 2006-12-13 12:52 |只看该作者

CU朋友PF规则

转teczm老大规则

#定义私有网段
priv_nets = "{ 127.0.0.0/8, 192.168.11.0/24 }"

#下列两个选项用来设置阻断后的默认操作为反馈,并在外部接口设置开启日志记录:
set block-policy drop
set loginterface tun0

#流量整修
scrub in all
#

#NAT
#为所有内部网启用NAT通过下列策略:
#由于外部网卡的IP地址是动态获得的,因此在外部网卡接口处增加小括号以使当IP地址发生变化时PF可#以自适应。
nat on tun0 from rl0:network to any -> (tun0)
no nat on tun0 from {192.168.11.6,192.168.11.9}  to any


#url ACLs
rdr on rl0 proto {tcp udp} from any to any port 53 -> 127.0.0.1


#过滤规则
#过滤规则第一行是默认否规则:
block all  
#这时没有任何数据包可以流过防火墙,甚至来自内部网络的数据包。下面的规则将逐个依据上面提到的#目标开启防火墙上的虚拟接口

#开启lo0
pass quick on lo0 all

#保证墙不向外网泄漏内网地址,同时也阻断了来自外部网中源地址为这些私有地址的数据包流入内网。
block drop in quick on tun0 from $priv_nets to any
block drop out quick on tun0 from any to $priv_nets

#现在将打开GW对因特网开放的端口:
pass in on tun0 inet proto tcp from any to (tun0) port 5269 flags S/SA keep state
pass in on tun0 inet proto tcp from any to (tun0) port 5222 flags S/SA keep state
pass in on tun0 inet proto tcp from any to (tun0) port 80 flags S/SA keep state

#允许ICMP包通过防火墙
pass in inet proto icmp all icmp-type echoreq keep state

#现在数据流必须可以正常出入内部网络。
pass in on rl0 from rl0:network to any keep state

#下列策略可以使防火墙具备访问内网的能力:
pass out on rl0 from any to rl0:network keep state

#允许流出外部网卡接口的数据包通过防火墙
pass out on tun0 proto tcp all modulate state flags S/SA
#block drop out on tun0 from any to 61.129.66.78
pass out on tun0 proto { udp, icmp } all keep state
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP