awallでファイアウォールを制御する手順を記載します。
Table of Contents
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.