iptablesの記事一覧

iptablesでFTP(パッシブモード)を許可する

今回はパッシブモードでの接続を許可する設定方法について見ていきます。

まず、パッシブモードで使用するポートを確認しましょう。

FTPパッシブモード使用ポート
上図のように、データコネクションで使用するポートはランダムであり定まっていません。そのため、単純なパケットフィルタで許可しようとすると、次のようなパケットフィルタルールを適用する必要があります。

FTPクライアント(From) FTPサーバー(To)
1024~65535 許可 21 許可
1024~65535 許可 1024~65535 許可

上表のとおり、ほとんどのポートを開放する必要があり、これではパケットフィルタを設定する意味がありません。そこでiptablesにその問題を解決してくれるモジュールを組み込む対応を取ります。

「ip_conntrack_ftp」というモジュールを組み込んでおくと、データコネクションやパッシブモードの対応を自動で行ってくれます。

コントロールコネクション用のポート開放

「ip_conntrack_ftp」モジュールの組み込み設定を行う前に、まずはFTPサーバーで待ち受けるコントロールコネクション用のポートを開放する必要があります。
ポートは21番になりますので21番ポートの入力(受信)パケットを許可する必要があります。21番ポートを開けるには以下コマンドを実行します。

# iptables -I INPUT 4 -p tcp --dport 21 -j ACCEPT

ルールを挿入する場所は適宜変更してください。上記例では4番目に挿入しています。

FTP関連モジュールの設定

「ip_conntrack_ftp」モジュールはFTPプロトコルを識別し、使うポートを追跡して適宜開けてくれます。(つまり、ポートレベルでフィルタリングするのではなく、Windowsファイアウォールなどと同じようにアプリケーションレベルでフィルタリングしてくれます。)
また、IPマスカレードを使用している場合は、「ip_nat_ftp」モジュールもロードします。

二つのモージュールをロードするには、「/etc/sysconfig/iptables-config」に以下のように記述します。

IPTABLES_MODULES="ip_conntrack_ftp ip_nat_ftp"

これでiptablesが起動するタイミングで自動的にロードされるようになりました。。

あとは、iptablesを再起動します。

# service iptables restart

以上で、パッシブモードでのFTPファイル送受信が可能になりました。

2016年01月31日(日)|vsftpd FTPサーバー構築

iptablesでFTP(アクティブモード)を許可する

CentOSは、iptables(ファイアウォール)の設定が自動的に有効になっており、初期設定では外部からFTPでの接続ができません。

そのため、アクティブモードのFTPアクセスできるようにするには以下のいずれからの方法をとらなくてはなりません。

  • iptablesを無効にする。
  • iptablesにFTP(20、21番ポート)でのアクセスを許可する設定を追加する。

「iptablesを無効にする」方法は前回の記事で行いましたが、サーバーを運用していく上でファイアウォールの機能を無効にするということはセキュリティ対策がまったくできていないということと同意のため、当然ですが、実運用ではやってはいけない行為です。

ですので今回は「iptablesにFTP(20、21番ポート)でのアクセスを許可する設定を追加する」方法について見ていきます。

アクティブモードで使用するポート

iptablesの設定を行う前にアクティブモードでFTPアクセスする際に使用するポート番号について確認しましょう。
FTPアクティブモード使用ポート
上図のようにアクティブモードの場合、FTPサーバー側で使用するポートは20番(送信元ポート)、21番(宛先ポート)で固定となります。

iptablesにFTPアクセス許可設定を追加

まずは現状のファイアウォール(iptables)設定を確認します。

# service iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

アクティブモードの場合、FTPサーバーで待ち受けるポートは21番になりますので21番ポートの入力(受信)パケットを許可する必要があります。21番ポートを開けるには以下コマンドを実行します。

# iptables -I INPUT 4 -p tcp --dport 21 -j ACCEPT

 ※ルールを挿入する場所は適宜変更してください。上記例では4番目に挿入しています。

データコネクションで20番ポートを使用しますが、その際使用するのはFTPサーバーから見た場合、送信元ポートに当たるため、出力(送信)パケットかつ送信元ポート20番のパケットを許可する必要があります。ただし、今回の例では出力(送信)パケットの制御は何も行っておらず、全て許可する設定となっているため、設定不要です。

続いて、設定を保存します。

# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

最後にiptablesを再起動させて設定は反映させます。

# service iptables restart
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]

以上でアクティブモードにおけるiptablesの設定は完了です。

FTPクライアントからのファイル送信

では早速、FTPサーバーに対してファイルを送信してみましょう。今回もWindows標準のFTP機能を使用して、ファイル送信の確認をします。

Windows標準のFTP機能はコマンドプロンプトから使用します。
(コマンドプロンプトの起動は画面左下のWindowsマークをクリックし「プログラムとファイル検索」欄に「cmd」と入力し、Enterキーを押下します。)

まずは送信するテスト用ファイルを作成します。

> type nul > testfile02

続けて、作成したテスト用ファイルをFTPサーバーに送信します。

C:\Users\user> ftp 172.16.0.10
172.16.0.10 に接続しました。
220 (vsFTPd 2.2.2)
ユーザー (172.16.0.10:(none)): anonymous
331 Please specify the password.
パスワード:
230 Login successful.
ftp> cd /pub/upload
250 Directory successfully changed.
ftp>
ftp> put "C:\Users\user\testfile02" ./testfile02
200 PORT command successful. Consider using PASV.
425 Failed to establish connection.

putコマンドでファイル送信を試みましたが、失敗してしまいました。エラーメッセージからデータコネクションの確立に失敗しているようです。FTPサーバー側のファイアウォールの設定はしたはずですが、なぜでしょう。

それは、FTPクライアント側の設定に問題があります。アクティブモードの場合、ファイル転送用に使用するデータコネクションはFTPサーバーからFTPクライアントに対して接続することを思い出してください。

今回のケースでは、FTPクライアントとなるローカルホストのファイアウォールで、その接続要求がブロックされてしまっていました。

この問題を回避するには、Windowsファイアウォールの設定を変更する必要があります。

Windows7を例にすると、画面左下のWindowsマークをクリックし「コントロールパネル」→「Windows ファイアウォール」→「Windows ファイアウォールを介したプログラムまたは機能を許可する」をクリックします。

Windowsファイアウォール設定

「許可されたプログラムおよび機能」で「ファイル転送プログラム」にチェックが入っていることを確認し、入っていなければチェックを入れます。

これで、データコネクションも確立できるようになったはずです。

ではもう一度、ファイル送信してみます。

ftp> put "C:\Users\user\testfile02" ./testfile02
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.

今度はうまくいきました。

アクティブモードの問題

実際にアクティブモードでFTP送信を行ってみましたが、その過程でアクティブモードの問題が垣間見えたのではないでしょうか。

その問題とは、アクティブモードの場合、FTPクライアント側のファイアウォール設定を変更しないといけないということです。

FTPでファイルの送受信するのはパソコンに詳しい人だけではありませんのでファイアウォールの設定を変更させるということは簡単なようで敷居は高いです。例えば、以下のような構成となっているケースを考えてみます。

ネットワーク構成例

今回の例ではWindowsファイアウォールだけの設定変更で済みましたが、上図構成の場合はルータの設定も変更してやらなくてはいけません。例えば会社のネットワーク機器の設定を一般社員が変更することは社内の管理体制上の理由でできないのが普通です。仮に設定変更できたとしてもセキュリティを緩めてしまうことになります。

そもそも、FTPサーバーからFTPクライアントへの接続要求が必要なのが問題なのです。FTPサーバーからの逆接続をやめて、接続要求はあくまでFTPクライアントからとすることが理想です。

そこで登場するのがパッシブモードです。
パッシブモードでは接続要求を出すのはFTPクライアントからのみとなり、上記の問題を解決します。最近では、セキュリティを考慮してパッシブモードが使われることが多いです。

次回は、iptablesでパッシブモードでのFTPを許可する方法について見ていきます。

2016年01月30日(土)|vsftpd FTPサーバー構築

BINDの起動

BINDはデーモンとして動作させる必要があるのでserviceコマンドを使用して起動させます。

serviceコマンドはデーモンの起動・再起動・停止・状態確認などの操作を行なえます。

まずはBINDの状態を確認します。状態確認は以下のコマンドで行なえます。

# service named status
rndc: connect failed: 127.0.0.1#953: connection refused
named is stopped

「stopped」と表示されたので、現在、BINDは停止中となっています。逆に「running…」と表示されれば、BINDは既に起動中であることを示します。

BINDを起動する

BINDを起動するには以下のコマンドを実行します。

# service named start
Starting named:                            [  OK  ]

named.conf、正引き用設定ファイルや逆引き用設定ファイルなどを更新した場合、その設定を反映させるためには、BINDを再起動させる必要があります。BINDの再起動は以下コマンドで行います。

# service named restart
Stopping named:                            [  OK  ]
Starting named:                            [  OK  ]

※正引き用設定ファイルや逆引き用設定ファイルを更新した場合、必ずSOAレコードのSerialの値を加算してください。加算しないと設定がうまく反映されません。加算忘れはBINDをさわったことがあるエンジニアが一度は必ずといって良いほどやってしまうミスです。

ファイアウォール設定を確認する

CentOSの初期設定では外部からの接続はssh(22)以外を拒否する設定となっており、DNSで使用する通信(TCP:53、UDP:53)はファイアウォールでドロップされてしまいます。そのため、ファイアウォールの設定を変更する必要があります。

まずはファイアウォール(iptables)の設定を確認します。iptablesはLinuxの標準的なファイアウォール・アプリケーションです。

# service iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443
7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:81
8    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

上記状態では、外部からの接続はssh(22)、http(80、81)、https(443)のみ許可しており、それ以外は拒否されます。DNSの接続許可の設定を追加してみましょう。

# iptables -I INPUT 8 -p tcp --dport 53 -j ACCEPT
# iptables -I INPUT 8 -p udp --dport 53 -j ACCEPT

「-I」でチェインと番号を指定すると、指定したチェインの指定した番号にルールが挿入されます。指定した番号以降のルールは、それぞれ一つ下にずれます。番号をつけない場合は、先頭(1番)にルールを挿入されます。

続いて、変更した内容を保存します。

# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

最後にもう一度iptablesの設定を確認し、上記で追加したルールが追加されていることを確認します。

# service iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443
7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:81
8    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53
9    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53
10   REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

これで、DNSでの接続が可能になりました。

/etc/resolv.confの編集

「/etc/resolv.conf」は、自身が利用するDNSサーバーの情報(IPアドレス)を記述してあるファイルのことです。今回、BINDを構築したことで自身がDNSサーバーとなったため、名前解決の際に参照するDNSサーバーを自身に設定します。

# vi /etc/resolv.conf
# Generated by NetworkManager
nameserver 172.16.0.10

nameserverディレクティブに、参照するDNSサーバーのIPアドレスを指定します。最大3行まで定義することが可能で、上から順番に利用されます。上記例では、IPアドレス「172.16.0.10」のDNSサーバーを参照するよう設定しています。

自動起動の設定

DNSサーバーは、常時稼動させておく必要があります。そのためにOS起動と同時にBINDも起動するように設定します。

# chkconfig named on

以上で自動起動するように設定されたため、CentOSを再起動しても、OS起動とともにBIND(named)が起動されるようになります。

2016年01月05日(火)|BIND DNSサーバー構築

Apacheを起動してWebページを表示する

Apacheはデーモンとしてさせる必要があるのでserviceコマンドを使用して起動させます。

serviceコマンドはデーモンの起動・再起動・停止・状態確認などの操作を行なえます。

まずはApacheの状態を確認します。状態確認は以下のコマンドで行なえます。

# service httpd status
httpd is stopped

「stopped」と表示されたので、現在、Apacheは停止中となっています。「running…」と表示されれば、Apacheは既に起動中であることを示します。

Apacheを起動する

Apacheを起動するには以下のコマンドを実行します。

# service httpd start
Starting httpd:                              [  OK  ]

httpd.confを編集する

Apacheを起動したら、テストページを用意し、実際にそのテストページを表示させてみましょう。

テストページを表示させるため、「httpd.conf」ファイルを編集し、Apacheを設定します。

# cd /etc/httpd/conf
# vi httpd.conf
Listen 80

ServerAdmin root@localhost

ServerName www.test.com:80

UseCanonicalName On

DocumentRoot "/var/www/html"

「httpd.conf」ファイルを開いたら、何百もの行がずらずらと記述されていますが、まずは上記の5つの設定を確認します。(上記以外のディレクティブの記述については削除せず、そのままとしておきます。)

「Listen」ディレクティブにはApacheが待ち受けるポート番号を、「ServerAdmin」にはWebサーバー(Apache)の管理者のメールアドレスを記述します。必要に応じて編集してください。

「ServerName」ディレクティブはWebサーバーが自分自身のホスト名を示す時に使われる名前を指定します。例えば、Apacheがエラー表示をする場合に、自分自身を表すホスト名も合わせて表示する場合などに、ここで指定したホスト名が使われます。(「ServerName」ディレクティブが指定されていない場合はWebサーバーに割り当てられているIPアドレスをDNSで逆引きして取得したホスト名が表示されます。)

「ServerName」ディレクティブの指定は「ホスト名:ポート番号」のフォーマットで記述します。

「ServerName」ディレクティブで指定した設定を有効にするには、「UseCanonicalName」ディレクティブを「On」に設定する必要があります。「On」に設定するとサーバー名として「ServerName」ディレクティブの指定を使うようになります。

「DocumentRoot」ディレクティブではドキュメントルートを指定します。ドキュメントルートはWebページに使うファイルを置くディレクトリの起点となる、いわばWebサーバーのルートディレクトリのことです。そのドキュメントルート配下に格納したファイルがWebページとして公開されます。上記例では「/var/www/html」がドキュメントルートとなります。

ドキュメントルート配下にコンテンツを格納する

ドキュメントルート配下にテスト用のWebページを格納します。

# cd /var/www/html
# vi index.html
<html>
<head><title>テストページ</title></head>
<body>
<p>テストページです。</p>
</body>
</html>

httpd.confを反映する

「httpd.conf」ファイルを編集しただけではApacheに設定は反映されません。設定を反映させるためにはApacheを再起動させる必要があります。Apache再起動は以下のコマンドで行なえます。

# service httpd restart
Stopping httpd:                              [  OK  ]
Starting httpd:                              [  OK  ]

以上でWebサApacheの設定は完了です。

ファイアウォール設定を確認する

CentOSの初期設定では外部からのポートはssh(22)以外は拒否する設定となっており、http(80)への通信はファイアウォールでドロップされてしまいます。

まずはファイアウォール(iptables)の設定を確認します。iptablesはLinuxの標準的なファイアウォール・アプリケーションです。

# service iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

上記状態では、外部から本サーバーへの接続はssh(22)のみ許可しており、それ以外は拒否されます。httpの接続許可の設定を追加してみましょう。

# iptables -I INPUT 5 -p tcp --dport http -j ACCEPT

「-I」でチェインと番号を指定すると、指定したチェインの指定した番号にルールが挿入されます。指定した番号以降のルールは、それぞれ一つ下にずれます。番号をつけない場合は、先頭(1番)にルールを挿入されます。

続いて、変更した内容を保存します。

# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

最後にもう一度iptablesの設定を確認し、上記で追加したルールが追加されていることを確認します。

# service iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
6    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

以上で、httpでの接続が可能になりました。

SELinuxを無効化する

SELinuxはセキュリティ管理するLinuxカーネル用のセキュリティ拡張機能です。SELinuxを利用することで強力なアクセス制限が可能になりますが、その制限により、インストール作業や運用業務でつまづくことが多々あります。

Apacheについて覚えていく上で、SELinuxは趣旨からはずれるため、ここではSELinuxを無効にします。

# setenforce 0

SELinuxの状態は以下のコマンドで確認できます。

# getenforce
Permissive

「Permissive」と表示されれば、SELinuxによるアクセス制限は無効になっています。

Enforcing SELinux機能、アクセス制御が有効。
Permissive SElinuxは警告を出力するが、アクセス制限は無効。
Disabled SElinux機能、アクセス制御が無効。

ただし、上記設定ではOSを再起動するとSELinuxが再び有効になってしまいます。再起動後もSELinuxを無効にするには、「/etc/selinux/config」を直接編集します。

# vi /etc/selinux/config
SELINUX=disabled

以上でSELinuxは常に無効になります。

Webページを表示する

Apache以外の設定もたくさんありましたが、これで準備が整いました。早速、テストページを表示させてみます。

クライアントパソコンからブラウザを起動し、アドレスバーにURLを入力し、Enterキーを押してください。ここまでの手順では、DNSにホスト名を登録していないので、URLのホスト名部分にはWebサーバーのアドレスを直接入力します。(もしくはhostsファイルを編集してください。)
また、上記したテスト用Webページの作成手順ではHTMLファイル名を「index.html」としたので、URLは「http://<WebサーバーのIPアドレス>」となります。(「/index.html」の記述は省略できます。)

テストページ

テストページが表示されれば成功です。

2015年11月19日(木)|Apache2.2構築

サイト内検索

カテゴリー

  • Apache2.2構築
  • BIND DNSサーバー構築
  • Linux基礎知識
  • NTPサーバー構築
  • vsftpd FTPサーバー構築

サイト情報

  • 当サイトについて
  • 免責
  • お問い合わせフォーム
  1. CentOSサーバー構築入門
  2. iptablesの記事一覧

CentOSサーバー構築入門

CentOSによるサーバー構築方法をわかりやすく解説しています。
  • 特定商取引法に基づく表示
  • 運営者情報
  • お問い合わせ
  • サイトマップ
  • twitter
  • facebook
  • Google +1
  • RSS
Copyright ©2025 CentOSサーバー構築入門 All Rights Reserved.

[↑]このページの先頭へ