ゲストLANを構築してみた

RTX1100と今流行の小型PC?の一種pcDuino(RaspberryPi見たいなやつ)使ってゲストLANを構築してみました。
今回ゲストLANに求める要件としては以下

  • ゲストLANはサブネットを分ける
    →今回はルータを挟むことにしました
  • ゲストLANは別に速くなくてもいい
    →なので100Mbpsで十分
  • ゲストには横着なことされたくない
    →通信をhttpとhttpsに制限して、なおかつproxy経由以外で通信できなくする

要件を満たすための今回設定したことを、備忘録的につらつらと書いていこうと思います。
ただし、結論から書くと、RTXの設定でわからなかった(思い通りいかなかった部分もある)のでそのへんご了承願ます。 フィルター難しい・・・。

RTXの設定

RTX側でやらせたいことは、すごく簡単にまとめちゃうと「proxyのwebな通信以外を禁止する」ことです。
ただ、最初は通信を完全に遮断したのですが、それやったらurlフィルター動かなくなったので許可しちゃってます。
また、そのurlフィルターもhttpの時は動くのですが、httpsの時動かなくてうーん。 まぁ、実際の設定を貼っつけたほうがいいと思うので貼っつけます。

ip route default gateway 192.168.128.1
ip lan1 address 192.168.132.1/24
ip lan1 secure filter in 100 101 102 103
url lan1 filter in 100 101
ip lan3 address 192.168.128.7/24
ip lan3 nat descriptor 1
ip filter 100 pass 192.168.132.2,192.168.132.100-192.168.132.191 * tcp * www,https
ip filter 101 pass * * udp * dhcps
ip filter 102 pass * * udp * domain
ip filter 103 pass * * icmp * *
ip filter 104 reject * * * *
nat descriptor type 1 masquerade
nat descriptor timer 1 protocol=tcp port=www 120
nat descriptor address outer 1 primary
nat descriptor address inner 1 auto
nat descriptor masquerade session limit 1 1 200
url filter use on
url filter port 80 443
url filter reject redirect http://proxy.local/block.html
url filter 100 pass * 192.168.132.2
url filter 101 reject * *
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.132.100-192.168.132.191/24 gateway 192.168.132.1
dhcp scope option 1 dns=192.168.132.1 252=68,74,74,70,3a,2f,2f,70,72,6f,78,79,2e,6c,6f,63,61,6c,2f,70,72,6f,78,79,2e,70,61,63
dns server 8.8.8.8
dns cache max entry 1024
dns private address spoof on
ip host proxy.local 192.168.132.2
schedule at 1 */* *:00 * ntpdate ntp.nict.jp
  • フィルターの設定
    内容、かなり未熟だと思う。。
    ここに書きながら「こうすればいいのになんで?」ッて思う箇所あるけど、実際こうやって設定ましたっていうのを正直に載せます。
ip lan1 secure filter in 100 101 102 103
url lan1 filter in 100 101
ip filter 100 pass 192.168.132.2,192.168.132.100-192.168.132.191 * tcp * www,https // ホントは192.168.132.2だけにしたかたんだけど、urlフィルタうまく動かなかった
ip filter 101 pass * * udp * dhcps // dhcp動かしたかった
ip filter 102 pass * * udp * domain // dns動かしたかった
ip filter 103 pass * * icmp * * // ping使いたかった
ip filter 104 reject * * * * // 使いたかった奴以外を使いたくなかった
url filter use on
url filter port 80 443 // httpsが動かねー!!
url filter reject redirect http://proxy.local/block.html 
url filter 100 pass * 192.168.132.2 // プロキシ以外からのwebアクセス禁止
url filter 101 reject * *
dhcp scope option 1 dns=192.168.132.1 252=68,74,74,70,3a,2f,2f,70,72,6f,78,79,2e,6c,6f,63,61,6c,2f,70,72,6f,78,79,2e,70,61,63
  • DNSの設定
    proxy.pacの配布にローカル用の名前解決させないといけないかなーって思ったので
dns cache max entry 1024 // キャッシュ増やせばそれだけ上位の負荷減るかなーって
dns private address spoof on // 要るか要らないかわからなかった・・・
ip host proxy.local 192.168.132.2 // プロキシサーバを設定
  • NATの設定
    NATの設定の仕方調べてたら、NATテーブルを使い過ぎないようにする設定があったので、その辺もノリで設定しました。
nat descriptor type 1 masquerade
nat descriptor timer 1 protocol=tcp port=www 120 // NATテーブルの保持時間をデフォルトの15分→2分に!?
nat descriptor address outer 1 primary
nat descriptor address inner 1 auto
nat descriptor masquerade session limit 1 1 200
  • その他
    なんか設定中にルータの時間が1980年になってたので、勢いで時刻の同期設定
schedule at 1 */* *:00 * ntpdate ntp.nict.jp

pcDuinoの設定

pcDuinoってなんぞやって人はこのサイト読んで下さい。
http://www.linksprite.com/linksprite-pcduino1/
中身は普通にlubuntuなので、こいつにsquid3とproxy.pac配布用にnginxをインストールしました。

  • ウザいネットワークマネージャの削除
$ sudo apt-get remove network-manager
  • 固定IPの設定
    /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.132.2
network 192.168.132.0
netmask 255.255.255.0
broadcast 192.168.132.255
gateway 192.168.132.1
dns-nameservers 192.168.132.1
  • squid3のインストール
$ sudo apt-get install squid3
  • squid3の設定
    /etc/squid3/squid.conf(抜粋)
# ポート
http_port 3128

# これやんないと使えないのでアクセス許可
acl localnet src 192.168.132.0/24
http_access allow localnet

# プロキシ経由を隠す
forwarded_for off

request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all
reply_header_access X-Forwarded-For deny all
reply_header_access Via deny all
reply_header_access Cache-Control deny all

# キャッシュ増やす
cache_mem 256 MB
maximum_object_size_in_memory 2048 KB
maximum_object_size 64 MB
  • squid3の再起動
$ sudo service squid3 restart 
  • nginxのインストール
    なんとなく、公式?リポジトリを追加してます。
$ wget -O - http://nginx.org/keys/nginx_signing.key | sudo apt-key add -
$ sudo sh -c 'echo "deb http://nginx.org/packages/ubuntu/ trusty nginx" >> /etc/apt/sources.list'
$ sudo sh -c 'sudo echo "deb-src http://nginx.org/packages/ubuntu/ trusty nginx" >> /etc/apt/sources.list'
$ sudo apt-get update
$ sudo apt-get install nginx
$ sudo service nginx start
$ sudo update-rc.d nginx defaults
  • proxy.pacの配置
    よくわからなかったのでテキトーに書いちゃいました
    /usr/share/nginx/www/proxy.pac
function FindProxyForURL(url, host) {
    if ( isInNet(host, "192.168.132.0"   , "255.255.255.0"  )
    || isInNet(host, "127.0.0.0"  , "255.0.0.0"  ) )
        return "DIRECT";
    else
        return "PROXY proxy:3128";
}
  • MIME-typeの設定
    いるかどうかわからんけど、一応
    /etc/nginx/mime.types(追加)
application/x-ns-proxy-autoconfig       pac;
  • リダイレクトの時のページの配置
    ついでのRTXでurlフィルターでrejectされた時のページをmarkdownをpandocで変換して作成して、配置しました。
    /usr/share/nginx/www/block.html

所感

今回、やりたいことは大体出来たかと思いますが、RTXのフィルターがかなり甘いのと、urlフィルターがhttpsなページでうまくリダイレクトかからないのが残念です。
ルーター設定はやっぱり難しいですね!!

あと、日頃markdown書くときはVSCode使ってますが、はてなブログへ投稿するとめちゃくちゃ崩れちゃって使いにくい!!
何かいい方法ナイカナー