2009年3月11日星期三

OpenBSD 之PF 基本防火牆啟動及 /etc/pf.conf 設定檔範例研究(转) From: 百度空间 Author: netnolimit

 Description:

  OpenBSD 之PF 基本防火牆啟動及 /etc/pf.conf 設定檔範例研究,我在想 OpenBSD 是不是天生開發出來,就是要擔任防火牆的角色,裝完 OpenBSD 後即可啟用 NAT 及 firewall 的能力,並不需要再去編譯 Kernel 即可使用。

  Setp 1.

  開機自動啟動:

  #vi /etc/rc.conf

  pf=YES

  #vi /etc/sysctl.conf

  #net.inet.ip.forwarding=1 # 將最前面的 # 號拿掉

  手動立即啟動:

  #pfctl -e

  #sysctl -w net.inet.ip.forwarding=1

  開啟 ftp-proxy 讓內部可以對外使用 FTP 的服務:

  #vi /etc/inetd.conf

  #127.0.0.1:8021 stream tcp nowait root /usr/libexec/ftp-proxy ftp-proxy # 將"# "號拿掉開通 127.0.0.1 的 ftp-proxy

  127.0.0.1:8021 stream tcp nowait root /usr/libexec/ftp-proxy ftp-proxy#kill -HUP `cat /var/run/inetd.pid`

  Setp 2.

  基本 PF 的 /etc/pf.conf 設定範例:

  # macros

  int_if = "de0" # 定義對內的網介面

  ext_if = "fxp0" # 定義對外的網路介面

  tcp_services = "{ 22, 113 }" # 定義 port 22, 113 服務

  icmp_types = "echoreq" # 定義 tcmp 回應狀態

  priv_nets = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }" # 定義符合 RFC 1918 私有IP 部份

  comp3 = "10.10.10.3" # 定義內部的一台電腦代號 comp3 對應 10.10.10.3 這個 IP

  # options

  set block-policy return

  set loginterface $ext_if

  # scrub

  scrub in all # 修整進入 NAT 的封包

  # nat/rdr

  nat on $ext_if from $int_if:network to any -> ($ext_if) # NAT 設定讓內部的 IP 可轉換出去

  rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 port 8021 # 讓內部可使用 ftp client 軟體連出去

  rdr on $ext_if proto tcp from any to any port 80 -> $comp3 # 內部電腦 comp3 的 80 port 服務對應到外面

  # filter rules

  block all # 所有封包都擋掉

  pass quick on lo0 all # 允許 localhost 封包通行

  block drop in quick on $ext_if from $priv_nets to any # 拒絕所有 priv_nets 定義的私有 IP 進入 ext_if 介面

  block drop out quick on $ext_if from any to $priv_nets # 拒絕所有 priv_nets 定義的私有 IP 出去 ext_if 介面pass in on $ext_if inet proto tcp from any to ($ext_if) port $tcp_services flags S/SA keep state # 允許 tcp_services 定義之 port 進入 ext_if 介面

  pass in on $ext_if proto tcp from any to $comp3 port 80 flags S/SA synproxy state # 讓內部 comp3 的 80 port 服務由 ext_if 介面出去

  pass in inet proto icmp all icmp-type $icmp_types keep state # 允許 icmp 封包進入通行

  pass in on $int_if from $int_if:network to any keep state # 允許封包由 de0 進到 10.10.10.0/24 暢通

  pass out on $int_if from any to $int_if:network keep state # 允許封包由 de0 出去 10.10.10.0/24 暢通pass out on $ext_if proto tcp all modulate state flags S/SA # 允許 tcp 封包由 fxp0 出去

  pass out on $ext_if proto { udp, icmp } all keep state # 允許 udp , icmp 封包由 fxp0 出去

  Setp 3.

  pfctl 的控制指令:

  #pfctl -f /etc/pf.conf # 重新載入pf.conf 設定檔

  #pfctl -nf /etc/pf.conf # 確認語法有無符合,但不載入

  #pfctl -Nf /etc/pf.conf # 只載入 NAT 的設定檔

  #pfctl -Rf /etc/pf.conf # 只載入防火牆的過濾設定檔

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

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

  #pfctl -ss # 顯示現階段封包運作狀態

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

  #pfctl -sa # 顯示現階段所有統計的資料net.inet.ip.forwarding=1

没有评论: