firewalld のダイレクトルールとは?
firewalld は iptables を利用してアクセス制御をしていますが、一般的な Zone を利用したルールでは受信 (INPUT) の通信しか制御できず、送信の制御はできません。
ですが、ダイレクトルールを使うことで、iptables を直接操作し、送信 (OUTPUT) の通信を制御することができます。
その際、インタフェースの Zone に関係なく、ルールが適用されます。
http 通信を禁止する例
例えばサーバがウィルスに冒された場合であっても、http通信による外部通信を禁止したい、というときは以下のようにします。
[root@localhost firewalld]# curl milestone-of-se.nesuke.com/http.txt
milestone-of-se.nesuke.com presents
studying about http!
上記の通り、外部へのhttp接続ができています。そこへ下記のように--direct ルールを追加します。
[root@localhost ~]# firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -m state --state NEW -m tcp -p tcp --dport 80 -j DROP success [root@localhost ~]# firewall-cmd --reload success [root@localhost ~]# curl milestone-of-se.nesuke.com/http.txt curl: (7) Failed connect to milestone-of-se.nesuke.com:80; 接続がタイムアウトし ました
設定後は、先程できていた http 接続ができなくなりました。
ルールの意味は、iptables の OUTPUT Chain (送信制御) の 1 行目に、tcp 80 の新規コネクションをドロップする、という意味です。
iptables ルールを直接見ると、OUTPUT_direct というチェインにルールが追加されています。
[root@localhost ~]# iptables -nvL --line-numbers
~~~
Chain OUTPUT_direct (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
[root@localhost ~]#
設定情報は /etc/firewalld/direct.xml に格納されます。
[root@localhost ~]# cat /etc/firewalld/direct.xml
<?xml version="1.0" encoding="utf-8"?>
<direct>
<rule priority="1" table="filter" ipv="ipv4" chain="OUTPUT">-m state --state NEW -m tcp -p tcp --dport 80 -j DROP</rule>
</direct>
[root@localhost ~]#
コメント