気まぐれSE日記

地方でエンジニアしてます

SELinux+Squid3.1でFTP接続ができない


環境は:CentOS 5.6 64bit/SELinux=enforced/iptables=OFF

squid経由のFTPだけ通信できない症状

squid経由でのhttp/httpsは使えていたので問題ないのかなと思っていたら、なぜかFTPだけが通信できないことに気付いた。


ブラウザ上では↓squidのエラー画面が出てしまう

FTPプロトコル・エラーが、以下のURLから情報を得ようとしている間に発生しました: ftp://ftp.nantokae.org/pub/abc.tar.gz

Squidは以下のFTPコマンドを送りました:

Connect to server data port The server responded with:

どうも、FTPでデータを開いているがダウンロードできませんみたいなエラー。


squid.confのPASSIVEあたりの設定かなと思って設定を、ftp_pasv = off とかにしてもエラー内容は微妙に変化するものの通信できない状況は変わらず。

squidのlogを見る

access.log には↓こんなのが出て 502 Bad Gatewayとのエラー

"GET ftp://ftp.nantokae.org/pub/abc.tar.gz HTTP/1.1" 502 4513 TCP_MISS:DIRECT

cache.logには↓こんなの

comm_old_accept: FD 21: (22) Invalid argument
FTP AcceptDataConnection: FD 21: (22) Invalid argument

よくわからないのでSELinuxっぽいかなと思って調べた。

サーバから直接squidを経由しないでftpコマンドでの接続は問題なく通信ができたので、どうもsquidというよりはSELinuxっぽい。

SELinuxからは↓こんなログが出ていた

type=1400 audit(1308212697.476:6192): avc: denied { name_connect } for pid=2609 comm="squid" dest=50161 scontext=system_u:system_r:squid_t:s0 tcontext=system_u:object_r:port_t:s0 tclass=tcp_socket


squidのアクセスを許可させてあげるといい。

setsebool -P squid_connect_any 1


こうしたところ上記のログも消えた。


これと、このサーバではbondingも使っていて SELinuxから気になるログもあり...

type=1400 audit(1308214201.875:6230): avc: denied { read write } for pid=20377 comm="ethtool" path="socket:[3790133]" dev=sockfs ino=3790133 scontext=root:system_r:ifconfig_t:s0 tcontext=root:system_r:initrc_t:s0 tclass=tcp_socket
type=1400 audit(1308214201.879:6231): avc: denied { read write } for pid=20381 comm="mii-tool" path="socket:[3790133]" dev=sockfs ino=3790133 scontext=root:system_r:ifconfig_t:s0 tcontext=root:system_r:initrc_t:s0 tclass=tcp_socket



一応これも許可した。

setsebool -P allow_daemons_use_tty=1


↑は間違いで、この設定は関係なかったです。
SELinuxにこういうルールを追加しないとダメっぽい。

require {
type ifconfig_t;
type initrc_t;
class tcp_socket { read write };
}

#============= ifconfig_t ==============
allow ifconfig_t initrc_t:tcp_socket { read write };

これをやったらFTPでファイルのダウンロードが通るようになりました。

SELinuxは初めてでしたが、見事にはまりましたね。