awallによるファイアウォール

2018-10-06 12:54:52 +09:00 Post Comments

9月27日ごろから始まった世界的なSYN floodは, WWWの辺境としか言いようのない当サイトまで標的としていました. SYN cookiesを利用することで サーバが機能停止に至ることはありませんでした. しかし,サーバを無線LANの先に設置していたため, このネットワークの接続速度がかなり損なわれてしまいました.

SYN floodでは送信元IPアドレスは偽装されているため IPアドレスによるアクセス拒絶は無効であると言われています. しかし,今回についていえば,送信元として書かれたIPアドレスが 海外の,日本人は使わないであろう ホスティング業者が保有するものとなっていました. ここからのアクセスを拒絶したとしても, どうでもいいマイナーなクローラーが 当サイトをクロールできなくなるだけと考えられるため, 今回は練習も兼ねてIPアドレスによる拒絶をやってみることにしました.

当サイトではこれまでサーバにファイアウォールを設定していませんでした. それは,このサーバがルータの配下に静的NATで配置されており, 必要なポート以外にはもともとアクセスできなかったからです. しかし,今回はIPアドレスによるアクセス拒否数十件という, ルータに設定するのは難しいアクセス設定が必要でした. そこでサーバのVM上でファイアウォールを設定することにしました.

サーバのOSがAlpine Linuxですから,「alpine linux firewall」で検索して awall (Alpine wall)を使用することにしました.

手順

  • インストールはapkコマンドを利用して行いました.

    apk add -u awall
    
  • このソフトウェアはiptableによって動くらしいので,iptableを起動しました.

    modprobe ip_tables
    rc-update add iptables
    
  • 設定ファイルはいまひとつ似た設定を行う例がなかったので Zero-To-AwallAlpine Wall User’s Guideを 参考に次のようなファイルを作成しました.

    • /etc/awall/optional/main.json
      {
        "description": "Main firewall",
      
        "import": [ "base" ]
      }
      
    • /etc/awall/private/base.json
      {
        "description": "Base zones and policies",
      
        "zone": {
          "WAN": { "iface": "eth0" },
          "LAN": { "iface": "eth0", "addr": ["192.168.0.0/24"] }
        },
      
        "policy": [
          { "in": "_fw", "out": "WAN", "action": "accept" },
          { "in": "LAN", "action": "accept" },
          { "in": "WAN", "action": "drop" }
        ]
      }
      
    • /etc/awall/optional/http.json
      {
        "description": "Allow HTTP on WAN",
      
        "filter": [
          {
            "in": "WAN",
            "out": "_fw",
            "service": "http",
            "action": "accept"
          },
          {
            "in": "WAN",
            "out": "_fw",
            "service": "https",
            "action": "accept" 
          } 
        ]
      }
      
    • /etc/awall/optional/ban.json
      {
        "description": "Sample awall policy; copy to /etc/awall to use",
      
        "filter": [
          {
            "src": [
      "192.0.2.3","192.0.2.38","192.0.2.39","192.0.2.40",
      "198.51.100.0/24","203.0.113.0/30","203.0.113.6/31"
            ],
            "action": "drop"
          }
        ]
      }
      
      • srcにIPアドレスを書くことで送信元IPアドレスによるフィルタリングが可能
      • “action”: “drop"でACKを返すことなく通信を終了可能.
      • ※IPアドレスは架空のものです
  • 有効化

    awall enable main
    awall enable http
    awall enable ban
    awall translate -V
    awall activate
    
  • 以降

    • /etc/awall/optional/ban.jsonを書き換え

    • 設定を反映

      awall translate -V
      awall activate