iptables DNSを許可する

提供: セキュリティ
2015年6月14日 (日) 19:49時点におけるDaemon (トーク | 投稿記録)による版

移動: 案内検索
スポンサーリンク

Linuxのパケットフィルタ(いわゆるファイアーウォール)であるiptables でポートをいろいろ塞ぐと DNS 問い合わせをブロックしてしまうことがあります。DNSの通信をブロックしてしまうと、名前解決ができなくなり、ネットワーク通信ができなくなり、困ります。

概要

DNSは、インターネットを支える技術の1つで、名前解決の機能を提供します。名前解決とは、FQDNの名前をIPアドレスに変換する処理です。パッケージのアップデートをするときに、パッケージのサーバにアクセスするときに、名前解決をして、IPアドレスを元に通信します。

DNS 問い合わせは、主にUDP が利用されます。UDPを利用する主な理由は、TCPに比べてオーバーヘッドが少ないからです。TCPでも可能ですが、3ウェイ・ハンドシェイクがあり、オーバーヘッドが大きくなります。

iptables で domain (53ポート) の通信が通らないと外部のDNS サーバーを利用した 名前解決 ができなくなります。

DNSのクライアントとDNSサーバ

DNSの通信と一言でいっても、利用形態が以下の2つがあります。

  • DNSクライアント
  • DNSサーバ

DNSクライアントは、DNSのサービス(名前解決のサービス)を利用するコンピュータです。たいていの場合は、こちらです。家のパソコンや自分のもっているサーバは、たいていクライアントです。

DNSサーバとは、名前解決のサービスを提供するサーバです。自分のドメインを所有し、サブドメインなどを管理する、といったときに、DNSサーバをたてて、サービスすることになります。

DNSの通信

DNSの通信は、主に UDP で送ります。UDP は、セッションを持たない単発のパケットを投げ合うプロトコルであるため、iptablesでは、INPUT(インカミング) と OUTPUT(アウトゴーイング)のどちらのパケットのアクセスも許可しなければなりません。

使い方

DNSクライアントとして問い合わせをする

ここでの前提は、iptables を設定するホストが Domain Name System のサーバーとして機能するのではなく、DNS のクライアントとして動作する、ということです。 クライアントというのは、named/bind サービスを稼働するコンピュータではなく、パソコンやウェブサーバなどです。

ステート を利用して、通信を許可できます。

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

ステートを使わずにDNSクライアントとして問い合わせをする

iptables の下記設定を追加します。

-A INPUT -p udp --sport 53 -j ACCEPT
-A OUTPUT -p udp --dport 53 -j ACCEPT

UDP トラフィックをすべて遮断し、 53 だけ許す例です。

-A INPUT -p udp --sport 53 -j ACCEPT
-A OUTPUT -p udp --dport 53 -j ACCEPT
 
-A INPUT -p udp -j DROP
-A OUTPUT -p udp -j DROP

DNS サービスを許可する

DNS を外部に公開する例です。bindなどを利用して、DNSのサービスを提供する場合に利用します。

iptablesの設定は、以下の通りです。

-A INPUT -p tcp --dport 53 -j ACCEPT

iptables の設定ファイルの例です。ssh 22とdomain 53を許可しています。

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp --dport 53 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT

関連項目




スポンサーリンク