私のiptablesスクリプトでは、できる限り細かいルールを書く実験を行っています。一部のユーザーはセキュリティを確保し、一部は学習課題として、どのユーザーがどのサービスを使用できるかを制限します。
3.6.2カーネルを実行しているDebian 6.0.6でiptables v1.4.16.2を使用します。
しかし、まだよくわからない問題が発生しました。
すべてのユーザーの送信ポート
これは完璧に機能します。一般的な状態追跡ルールはありません。
##発信ポート81 $ IPTABLES -A OUTPUT -p tcp --dport 81 -m conntrack --ctstate NEW、ESTABLISHED -j ACCEPT $ IPTABLES -A INPUT -p tcp --sport 81 -s $ MYIP -m conntrack --ctstate ESTABLISHED -j ACCEPT
ユーザーが一致する送信ポート
##ユーザーアカウントの送信ポート80 $ IPTABLES -A OUTPUT --match owner --uid-owner useraccount -p tcp --dport 80 -m conntrack --ctstate NEW、ESTABLISHED --sport 1024:65535 -j ACCEPT $ IPTABLES -A INPUT -p tcp --sport 80 --dport 1024:65535 -d $ MYIP -m conntrack --ctstate ESTABLISHED -j ACCEPT
これにより、アカウント「useraccount」に対してのみポート80が許可されますが、TCPトラフィックに対するこのようなルールには問題があります。
##デフォルトの送信ログ+ブロックルール $ IPTABLES -A OUTPUT -j LOG --log-prefix "BAD OUTGOING" --log-ip-options --log-tcp-options --log-uid $ IPTABLES -A OUTPUT -j DROP
問題
上記は機能し、ユーザー「useraccount」はファイルを完全に正常に取得できます。システム上の他のユーザーは、ポート80への発信接続を行うことができません。
useraccount @ host:$ wget http://cachefly.cachefly.net/10mb.test
しかし、上記のwgetは私のsyslogにx7のドロップされたエントリを残します:
10月18日02:00:35 xxxxカーネル:悪い送信IN = OUT = eth0 SRC = xx.xx.xx.xx DST = 205.234.175.175 LEN = 40 TOS = 0x00 PREC = 0x00 TTL = 64 ID = 12170 DF PROTO = TCP SPT = 37792 DPT = 80 SEQ = 164520678 ACK = 3997126942 WINDOW = 979 RES = 0x00 ACK URGP = 0
UDPトラフィックを使用する同様のルールでは、これらのドロップは発生しません。どのユーザーがDNS要求を行うことができるかを制限するルールが既に用意されています。
ドロップされた発信ACKパケットは、理解できないルートアカウント(URGP = 0)から送信されているようです。ユーザーアカウントをrootに入れ替えても。
3ウェイハンドシェイクの3番目のステップの後でconntrackが接続の追跡を開始するため、ACKパケットは新しいものとして分類されていると思いますが、なぜドロップされるのですか?
これらの低下は安全に無視できますか?
編集する
したがって、私は次のようなルールをよく目にします。
$ IPTABLES -A OUTPUT -s $ MYIP -p tcp -m tcp --dport 80 -m state --state NEW、ESTABLISHED -j ACCEPT $ IPTABLES -A INPUT -p tcp -m tcp --sport 80 -d $ MYIP -m state --state ESTABLISHED -j ACCEPT
状態の一致が明らかに廃止されたため、「-m state --state」を「-m conntrack --ctstate」に交換しました。
一般的な状態追跡ルールを作成することはベストプラクティスですか?上記のルールは正しいと見なされていませんか?
発信ユーザー接続を厳密に制御するには、このようなものが良いでしょうか?
$ IPTABLES -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT $ IPTABLES -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT $ IPTABLES -A OUTPUT -p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m conntrack --ctstate NEW -m owner --uid-owner useraccount -j ACCEPT $ IPTABLES -A OUTPUT -p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m conntrack --ctstate NEW -m owner --uid-owner otheraccount -j ACCEPT