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
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 };