ブリッジで VPN

$Id$ そもそもの話は、
    The Internet
	|
      ROUTER
    (10.0.0.1)
        |
  o--+--+------------+--o (10.0.0.0/28)
     |               |
(10.0.0.2)      (10.0.0.3)
    DNS           SERVER
こんなネットワークで、 SERVER はインターネット上の特定のユーザからアクセスできなければならないが、 一方で SERVER が攻撃されまくってるのをなんとかしたいってことなのだ。 そこでブリッジ兼ファイアウォール兼 VPN サーバを噛まして、
    The Internet ------------------- (10.0.0.5)VPN Client 
	|
      ROUTER
    (10.0.0.1)
        |
  o--+--+--(10.0.0.4)BRIDGE--+--o
     |                       |
(10.0.0.2)              (10.0.0.3)
    DNS                   SERVER
こうしようと。

最初から SERVER を firewall の中に入れといて、 VPN でアクセスさせるのが筋だと思うが、 既存のシステムなので政治層が云々てな感じ

FreeBSD なら簡単だ。

  1. fxp を 2 枚挿して、カーネルコンフィグ。
    options BRIDGE
    options IPFIREWALL
    options IPFIREWALL_VERBOSE
    options IPFIREWALL_VERBOSE_LIMIT=100
    
  2. /etc/rc.conf に追加。 外側を fxp0 とする。 fxp1 には IP アドレスは設定しなくてよい。
    gateway_enable="YES"
    ifconfig_fxp0="inet 10.0.0.4 netmask 255.255.255.240"
    defaultrouter="10.0.0.1"
    
  3. /usr/local/etc/rc.d/bridge.sh を作成し chmod 755
    #!/bin/sh
    case $1 in
    start)
    	echo -n ' bridge'
    	sysctl net.link.ether.bridge=1
    	sysctl net.link.ether.bridge_ipfw=1
    	sysctl net.link.ether.bridge_cfg="`ifconfig -l`"
    	;;
    stop)
    	sysctl net.link.ether.bridge=0
    	sysctl net.link.ether.bridge_ipfw=0
    	;;
    *)
    	echo "usage: $0 {start|stop}" 1>&2
    	exit 64
    	;;
    esac
    
  4. mpd インストール
    cd /usr/ports/net/mpd
    make && make install && make clean
    cd /usr/local/etc/mpd
    
  5. /usr/local/etc/rc.d/mpd.sh を作成し chmod 755
    #!/bin/sh
    case $1 in
    start)
    	echo -n ' mpd'
    	/usr/local/sbin/mpd -b pptp
    	;;
    stop)
    	/usr/local/sbin/mpd --kill &
    	sleep 5
    	killall -HUP mpd
    	;;
    *)
    	echo "usage: `basename $0` {start|stop}" 1>&2
    	exit 64
    	;;
    esac
    
  6. ipfw は、SERVER を守る設定の他、 PPTP を通す設定が必要。 (tcp port 1723, protocol 47 (GRE))
    # OIP=10.0.0.4 OIF=fxp0
    add pass tcp from any to OIP 1723 in recv OIF setup
    add pass gre from any to OIP in recv OIF
    add pass gre from OIP to any out xmit OIF
    add pass ip from any to any via ng0
    

    次はクライアント設定。

    以上