2018年6月24日日曜日

firewalld and ipset on CentOS7

CentOS 7でipsetを利用してみました。
firewalldが標準になり、ipsetはどうやって使うんだろうと思っていましたが、firewalldの設定でOKのようです。
先日設定したVPN接続を国内からのみ許可するように設定しました。

IPアドレスのリストは、http://nami.jp/ipv4bycc/で配布されているものを利用させてもらうのが簡単かと思います。
私は、IPv6のリストも欲しかったので、RIRが提供してるリストを加工して利用することにしました。
  • ftp://ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest
  • ftp://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-extended-latest
  • ftp://ftp.apnic.net/pub/stats/apnic/delegated-apnic-extended-latest
  • ftp://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-extended-latest
  • ftp://ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-extended-latest
設定するにあたり、IPアドレスのリストをCIDRの形式でx.x.x.x/nやx::/nの形式で用意しておきます。

以下の環境で設定しています。
$ cat /etc/centos-release
CentOS Linux release 7.5.1804 (Core) 
$ uname -rv
3.10.0-862.3.2.el7.x86_64 #1 SMP Mon May 21 23:36:36 UTC 2018
$

まず、国内からのアクセスを扱うように新しいゾーンを作成します。
# firewall-cmd --permanent --new=zone=domestic
次に、IPv4、IPv6用のipsetを作成します。
# firewall-cmd --permanent --new-ipset=DOMESTICv4 --type=hash:net
# firewall-cmd --permanent --new-ipset=DOMESTICv6 --type=hash:net --family=inet6
リロードして確認すると次のようになります。
# firewall-cmd --reload
# firewall-cmd --get-ipsets
DOMESTICv4 DOMESTICv6
#
作成したipsetへのエントリ追加は、次のようにファイル指定で行うことができます。
# firewall-cmd --permanent --ipset=DOMESTICv4 --add-entries-from-file=./ipv4_list
# firewall-cmd --permanent --ipset=DOMESTICv6 --add-entries-from-file=./ipv6_list
追加したエントリは、次のように確認できます。
$ firewall-cmd --ipset=DOMESTICv4 --get-entries |head
1.0.16.0/20
1.0.64.0/18
1.1.64.0/18
1.5.0.0/16
1.21.0.0/16
1.33.0.0/16
1.66.0.0/15
1.72.0.0/13
1.112.0.0/14
14.0.8.0/22
ここまででipsetの設定ができましたので、firewalldのゾーンとipsetを関連づけます。
# firewall-cmd --permanent --zone=domestic --add-source=ipset:DOMESTICv4
# firewall-cmd --permanent --zone=domestic --add-source=ipset:DOMESTICv6
これで、DOMESTICv4, DOMESTICv6に定義したIPアドレスからのアクセスは、domesticゾーンが適用されるようになりました。

あとは、domesticゾーンに必要なサービスを追加して、デフォルトゾーン(ここではpublic)から不要なサービスを削除すればOKです。
# firewall-cmd --permanent --zone=domestic --add-service=ssh
# firewall-cmd --permanent --zone=domestic --add-service=ipsec
# firewall-cmd --permanent --zone=domestic --add-port=5555/tcp
#
# firewall-cmd --permanent --zone=public --remove-service=ssh
# firewall-cmd --permanent --zone=public --remove-service=ipsec
# firewall-cmd --permanent --zone=public --remove-port=5555/tcp
#
# firewall-cmd --reload
# firewall-cmd --info-zone=domestic
domestic (active)
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: ipset:DOMESTICv4 ipset:DOMESTICv6
  services: ssh ipsec
  ports: 5555/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

permanent指定なので、適宜リロードが必要です。

0 件のコメント:

コメントを投稿