状況に応じて、新しいファイアウォールルールを定義するときにiptables
パケット接続状態(通常はおよびNEW
/または)を指定できます。たとえば、次のルールペアは、自分のホストによって開始されたときにのみ接続が許可され、リモートホストによって起動された場合に接続が切断されることを保証しますESTABLISHED
。http
iptables -A INPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
しかし、代替案を探し始めたとき、firewalld
ファイアウォールはステートフルファイアウォール管理サービスであり、何らかの方法で内部的にパケットの状態を処理しているように見える以外に、その状態に関するドキュメントはあまり見つかりませんでした。iptables
上記の例のように、ファイアウォールルールの作成を使用するときにパケットの状態を定義できるかどうかを説明するのに役立つ人はいますかfirewalld
?それ以外の場合、どのように使用すると同じ効果が得られますかfirewalld
?
答え1
--direct
コマンドでルールを使用できますfirewall-cmd
。あなたの場合、実行するコマンドは次のとおりです。
# Check for existing firewalld direct rules
$ sudo firewall-cmd --direct --get-all-rules
# Now add your direct rule
$ sudo firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport=80 -j ACCEPT -m state --state NEW
# Return traffic (ESTABLISHED for example) is automatically allowed due to firewalld's stateful nature
# Reload firewalld
$ sudo firewall-cmd --reload
# Check if your direct rule was successfully added
$ sudo firewall-cmd --direct --get-all-rules
# From server side create a listening port (if there is no service listening on TCP 80)
$ nc -vlt 80
# From client side, initiate a connection to server on port 80
# Where X.X.X.X is server IP or hostname (with a 3 seconds timeout)
$ nc -v -w 3 X.X.X.X 80
答え2
もちろんいいえESTABLISHED
RELATED
ほとんどのマニュアル、チュートリアル、およびファイアウォールでは、これら3つのルールを作成し、対応するINPUT / OUTPUT / FORWARDチェーンの一番上に配置するため、特定のルールごとに個別にステータスを指定するのが合理的です。
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
nftの場合は次のようになります。
ct state { established, related } accept
これらのグローバルルールを使用しない状況はほとんど想像できません。 TCP/IP スタックをテストすることもできますが、この場合は事前定義されたルールを使用しない方がよいでしょう。