CentOS7 のBIND9で不正アクセスが多い場合の設定

CentOS7 のBIND9で不正アクセスが多い場合の設定手順を紹介いします。

firewalld を利用すする場合

CentOS7 標準のファイアウォール「firewalld」を用いる場合の設定です。

方法1:rich-rule (高度なルール)を利用する方法

高度なルールを利用する場合の設定方法です。
以下のコマンドを実行します。
firewall-cmd --permanent --add-rich-rule='rule family="ipv4"
 destination address="(このサーバーのIPアドレス)" service name="dns" accept limit value="60/m"' 
1分間に60回まで接続を受け入れる設定です。

具体例

firewall-cmd --permanent --add-rich-rule='rule family="ipv4"
 destination address="192.168.0.96/24" service name="dns" accept limit value="60/m"' 

実行結果

コマンドが正しく実行できれば"SUCCESS"が帰ります。

GUIの[ファイアウォールの設定]の[高度なルール]の一覧に追加されます。

高度なルールを設定した場合は、動的にファイアウォールが開くため、サービス欄のチェックは外しておきます。(チェックがついていると常に許可されてしまうため)

方法2:ダイレクト設定を利用する

ダイレクト設定を利用して、iptablesのコマンドを直接設定する方法です。 ダイレクト設定を利用する場合は下記のコマンドを実行します。
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -p udp -m state --state NEW --dport 53 -i eth0 -m hashlimit --hashlimit-burst 5 --hashlimit 1/m --hashlimit-mode srcip --hashlimit-htable-expire 120000 --hashlimit-name named-limit -j ACCEPT
コマンドの詳細は後述するiptablesの説明を参照してください。

実行結果

正常に実行されると、下図の結果となります。


GUIの[ファイアウォールの設定]の[ダイレクト設定]のタブに項目が追加されます。


または
firewall-cmd --direct --get-all-rules
コマンドでも確認可能です。

参考

セカンダリDNSの通信を常に許可する場合は以下のような書式になります。
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -p tcp -s (セカンダリDNSのIPアドレス) --dport 53 -j ACCEPT

firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 2 -p udp -s (セカンダリDNSのIPアドレス) --dport 53 -j ACCEPT

firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 3 -p udp -m state --state NEW --dport 53 -i eth0 -m hashlimit --hashlimit-burst 5 --hashlimit 1/m --hashlimit-mode srcip --hashlimit-htable-expire 120000 --hashlimit-name named-limit -j ACCEPT

iptablesを利用する場合

CentOS7標準のファイアウォール"firewalld"を停止してiptablesを利用する場合の設定手順です。

iptableを利用して同一のIPアドレスから多くの接続を受け入れないように設定します。

firewalldの停止

CentOS7ではデフォルトではfirewalldが起動ししているため、先にfirewalldを停止すする必要があります。
以下のコマンド実行します。

su
systemctl stop firewalld
systemctl diable firewalld

解説

systemctl stop firewalld
により、firewalld を停止します。

systemctl diable firewalld
コマンドで、firewalld の自動起動を停止します。

実行結果


iptables 設定ファイルの変更

iptablesの設定ファイル "/etc/sysconfig/iptables"を編集します。

変更前

# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

変更後

# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
#-A INPUT -p tcp --dport 53 -j ACCEPT
#-A INPUT -p udp --dport 53 -j ACCEPT
-A INPUT -p tcp -s (セカンダリDNSのIP) --dport 53 -j ACCEPT
-A INPUT -p udp -s (セカンダリDNSのIP) --dport 53 -j ACCEPT
-A INPUT -p udp -m state --state NEW --dport 53 -i eth0 -m hashlimit --hashlimit-burst 5 --hashlimit 1/m --hashlimit-mode srcip --hashlimit-htable-expire 120000 --hashlimit-name named-limit -j ACCEPT
-A INPUT -p udp --dport 53 -i eth0 -j DROP
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
解説
下記設定により、条件が一致した場合のみ通信を受け入れます。
-A INPUT -p udp -m state --state NEW --dport 53 -i eth0 -m hashlimit --hashlimit-burst 5 --hashlimit 1/m --hashlimit-mode srcip --hashlimit-htable-expire 120000 --hashlimit-name named-limit -j ACCEPT

意味は以下の通りです
  • --dport 53 : ポート番号 53
  • -i eth0 : インターフェイス (eth0)
  • --hashlimit-burst 5 : 同一ホストからの最大接続回数 1
  • --hashlimit 1/m : 同一ホストからの接続受入れ頻度 - 1分に1回
  • --hashlimit-mode srcip : 接続数のカウント方法 - srcip (クライアント接続元IP)
  • --hashlimit-htable-expire : 各クライアントのレコードの有効期限(ミリ秒) - 有効期限は2分間
  • -j ACCEPT : 条件にマッチした通信の処理方法 - ACCEPT (受け入れ)

下記設定によりそれ以外のポート53への通信は遮断します。
-A INPUT -p udp --dport 53 -i eth0 -j DROP


上記の設定でも動作しますが、セカンダリDNSへのドメイン情報の転送も拒否してしまうため、セカンダリDNSからの通信は常に許可するよう設定します。下記を上記のリミット制限のルールの手前に記述します。
-A INPUT -p tcp -s (セカンダリDNSのIP) --dport 53 -j ACCEPT
-A INPUT -p udp -s (セカンダリDNSのIP) --dport 53 -j ACCEPT

iptablesの起動

iptablesを起動します。以下のコマンドを実行します。
systemctl start iptables

iptablesの自動起動

systemctl enabled iptables

実行結果


著者
かつて日本を代表したスーパーエンジニア (自称)
ハードウェア、電気設備、ガーデニング関係の記事を担当。
最終更新日: 2024-01-06
作成日: 2014-12-16
iPentec all rights reserverd.