AlpineLinux 3.6: awallでファイアウォール制御

awallでファイアウォールを制御する手順を記載します。

1 awallのインストール

awallパッケージをインストールします。

$ sudo apk add awall
$ sudo rc-update add iptables

2 ファイアウォールの有効化と無効化

iptablesサービスを開始することでファイアウォールが有効になります。

$ sudo rc-service iptables start

iptablesサービスを停止することでファイアウォールが無効になります。

$ sudo rc-service iptables stop

3 ポリシーの追加

ファイアウォールで許可するパケット拒否するパケットはポリシーで定義します。

ここではサンプル用ポリシーのsample-policy.jsonを使用します。ポリシーの追加後にawall enableでポリシーを有効化し、awall activateで有効化したポリシーをファイアウォールに組み込みます。

$ sudo cp /usr/share/awall/sample/sample-policy.json \
          /etc/awall/optional/sample-policy.json
$ sudo awall enable sample-policy
$ sudo awall activate -f

以降ではsample-policy.jsonの内容について記載します。

3.1 zone

"zone"で"internet"というzoneを定義します。

"variable": { "internet_if": "eth0" },

"zone": {
  "internet": { "iface": "$internet_if" }
},
  • "variable"は変数定義で、$internet_ifでeth0を表します。"zone"の$internet_ifをeth0にすれば"variable"は不要です。
  • "internet"というzoneはインターフェースがeth0のzoneです。
  • "_fw"という特別なzoneがあり、ホスト自身を表します。

3.2 policy

"policy"でデフォルトの挙動を定義します。

"policy": [
  { "in": "internet", "action": "drop" },
  { "action": "reject" }
],
  • "internet"からのパケット(eth0から入ってくるパケット)はすべてdropします(パケットを破棄)。
  • それ以外のパケットはすべてrejectします(ICMPエラーを返す)。つまり、"_fw"からのパケット(ホストから外部へのパケット)もrejectされるので、インターネットからホストへのsshやpingのパケットだけでなく、ホストからインターネットへのsshやpingのパケットも通りません。
  • 以下のようにホストからのパケットをacceptすれば、ホストからインターネットへのsshやpingのパケットは通ります。
"policy": [
  { "in": "internet", "action": "drop" },
  { "in": "_fw", "action": "accept" },
  { "action": "reject" }
],

3.3 filter

"filter"で"policy"の例外を定義します。

"filter": [
  {
    "in": "internet",
    "service": "ping",
    "action": "accept",
    "flow-limit": { "count": 10, "interval": 6 }
  },
  {
    "in": "internet",
    "out": "_fw",
    "service": "ssh",
    "action": "accept",
    "conn-limit": { "count": 3, "interval": 60 }
  },

  {
    "in": "_fw",
    "out": "internet",
    "service": [ "dns", "http", "ntp" ],
    "action": "accept"
  },
  {
    "in": "_fw",
    "service": [ "ping", "ssh" ],
    "action": "accept"
  }
]
  • "service"のサービス名は/usr/share/awall/mandatory/services.jsonで定義されているものを使います。
  • "internet"からのpingパケットはacceptしますが、6秒に10回までしかパケットをacceptしません。
  • "internet"からのsshパケットはacceptしますが、60秒に3回までしかパケットをacceptしません。
  • "_fw"から"internet"へのdns、http、ntpのパケットをacceptします。よって、ホストで立ち上げたDNSサーバに名前解決する場合はrejectされます。
  • "_fw"からのping、sshのパケットはacceptします。

以下のように"internet"から0.2秒間隔でpingパケットを送信すると11個目のパケットはacceptされません。

$ ping -i 0.2 alpinelinux-3-6-awall.hiroom2.com
PING alpinelinux-3-6-awall.hiroom2.com (192.168.11.93) 56(84) bytes of data.
64 bytes from 192.168.11.93: icmp_seq=1 ttl=64 time=0.609 ms
64 bytes from 192.168.11.93: icmp_seq=2 ttl=64 time=0.631 ms
64 bytes from 192.168.11.93: icmp_seq=3 ttl=64 time=0.618 ms
64 bytes from 192.168.11.93: icmp_seq=4 ttl=64 time=0.595 ms
64 bytes from 192.168.11.93: icmp_seq=5 ttl=64 time=0.554 ms
64 bytes from 192.168.11.93: icmp_seq=6 ttl=64 time=0.578 ms
64 bytes from 192.168.11.93: icmp_seq=7 ttl=64 time=0.705 ms
64 bytes from 192.168.11.93: icmp_seq=8 ttl=64 time=0.658 ms
64 bytes from 192.168.11.93: icmp_seq=9 ttl=64 time=0.586 ms
64 bytes from 192.168.11.93: icmp_seq=10 ttl=64 time=0.559 ms
# 11th ping packet is not accepted.