概要
IPtablesは、最もよく知られているファイアウォールの1つであり(非常に効果的です)、デフォルトでプリインストールされている多くのLinuxディストリビューションにも搭載されています。この投稿の目的は、Iptablesがいかに強力であるかを考慮して、Iptablesコマンドのチートシートとして機能することです。また、多くのネットワークシナリオに対応する多数のコマンドがあります。 Iptablesは、複数のチェーンを持つさまざまな異なるテーブルルールを使用して、トラフィックをブロックおよび許可します。
- フィルター: これは、トラフィックルールをフィルタリングするためのデフォルトのテーブルです
- 入力 :入力チェーンの下で、着信接続を制御するためのルールと動作を定義します。
- 出力 :出力チェーンの下で、発信接続を制御します
- フォワード :名前が示すように、転送チェーンを使用して、別のルート、アドレス、またはポートにすぐにリダイレクトする着信接続を指定します(転送します)。転送は通常、NATと一緒に使用されます。
- NAT –新しいルートを確立するために複数のローカルトラフィックリソースを発信接続にマッピングするために使用されるネットワークアドレス変換テーブル。 NATテーブルには、次のチェーンルールが含まれています。
- 事前設定 –パケットが到着するとすぐに制御/変更するために使用されます(着信接続)
- 出力 –ローカルで生成されたパケットを変更するために使用されます
- ポスティング –パケットが出ようとするとすぐに、パケットを制御/変更するために使用されます(発信接続)
- MANGLE –マングルテーブルは、パケットの変更またはパケットの変更に使用されます。マングルテーブルには5つの連鎖律があります:
- 事前設定 –着信接続を変更するため
- 出力 –ローカルで生成されたパケットを変更するため
- 入力 –着信パケットの場合
- ポスティング –パケットが送信されようとしているときにパケットを変更する場合
- フォワード –ボックスを介してルーティングされた(または新しい接続/ルートに転送する必要がある)パケットの場合
このチートシートには、ダウンロード可能なバージョンが.pdfにあるgithubリポジトリがあります:LINK
IPtablesコマンド
ファイアウォールルールを表示する方法
–すべてのルールを表示
# iptables -L
–すべてのルールを行番号で表示
# iptables -L --line-numbers
–アクティブなパケットの詳細な出力を含むすべてのルールを表示します
# iptables -n -L -v
-NATチェーンのルールを表示する
# iptables -t nat -L
これらの出力/表示オプションは、次のような他の表示コマンドと組み合わせることもできます。
# iptables -t nat -L --line-numbers
–特定のチェーンルールのルールを表示する
# iptables -L INPUT
–ルールを表示しますが、チェーン仕様を使用します
# iptables -S INPUT
-チェーンおよびアクティブなパケットのルールを表示します
# iptables -S INPUT -v
ルールを削除および追加する方法
–行番号でルールを削除します
# iptables -D INPUT 10
–仕様によるルールの削除
# iptables -D INPUT -m conntrack --ctstate
–すべてのチェーンをフラッシュします(すべてのチェーンルールを削除します)
# iptables -F
–単一のチェーンをフラッシュします
# iptables -F INPUT
# Iptables -t nat -F
# Iptables -t mangle -F
–新しいチェーンを追加する
# iptables -N custom-filter
–新しいルールを追加する
# iptables -I INPUT -s 123.123.123.133 -j DROP
# iptables -A INPUT -p tcp --dport 22 -j REJECT
注 ルールの追加に関して–ここでわかるように、オプションが異なる2つの異なるルールがあります。 iptablesの直後に最初に定義されたオプションに注意してください:-Iおよび-A。
これらのオプションは、テーブルのどこにルールが配置されるか、チェーンルールの先頭(-Iオプション)、または下部(-A)。
Iptablesは、チェーンの一番上にある最初のルールから下に移動してルールを読み取り、その順序で適用します。
例と最も一般的に使用されるIPtablesコマンド
トラフィックをブロックする
–着信にアクセスできるようにIPアドレスをブロックする
# iptables -A INPUT -s 192.168.100.1 -j DROP
–特定のIPサブネットを着信に対してブロックします
# iptables -A INPUT -s 192.168.1.100/24 -j DROP
–IPアドレスをブロックしてすべてのパケットを拒否します
# iptables -A INPUT -s 192.168.1.100 -j REJECT
–着信時に特定のネットワークインターフェースへのIPアドレスをブロックする
# iptables -A INPUT -i eth0 -s 192.168.1.102 -j DROP
–特定のIPアドレスまたはIP範囲のTCPトラフィックのみをブロックする
# iptables -A INPUT -p tcp -s 192.168.1.100 -j DROP
# iptables -A INPUT -p tcp -s 192.168.1.100/24 -j DROP
–特定のポート(ポートを閉じる)のトラフィックをドロップします
# iptables -A INPUT -p tcp --dport xxx -j DROP
# iptables -A INPUT -p tcp --dport 22 -j DROP
–着信時にすべての無効なネットワークパケットをドロップします
# iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
IPtablesでトラフィックを許可するかポートを開く
– SSHでのトラフィック(着信および発信)を許可する
# iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
注 :これらのポートのトラフィックをブロックするには、ACCEPTオプションをDROPに変更します
– SSH着信で特定のIPまたはネットワーク範囲を許可する(CIDRを削除してIPのみを設定する)
# iptables -A INPUT -p tcp -s 192.168.1.100/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
注 :ネットワーク範囲の同じ構成は、以下にリストされている他の着信ルールに適用できます
注 :これらのポートのトラフィックをブロックするには、ACCEPTオプションをDROPに変更します
– HTTPおよびHTTPS(着信および発信)でのトラフィックを許可する
# iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT
# iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
–マルチポート構成
# iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
注:これらのポートのトラフィックをブロックするには、ACCEPTオプションをDROPに変更します
–MySQLでのトラフィックを許可する
# iptables -A INPUT -p tcp -s 192.168.1.100/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT
–特定のネットワークインターフェースへのMySQLトラフィックを許可する
# iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT
–PostgreSQLトラフィックを許可する
# iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT
–特定のネットワークインターフェースへのPostgreSQLトラフィックを許可する
# iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT
– SMTP / IMAP / IMAPS / POP3 /POP3S/での着信を許可する
SMPT
# iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT
IMAP
# iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT
IMAPS
# iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT
POP3
# iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT
POP3S
# iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT
–IPtablesでポート転送を構成する方法
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j REDIRECT --to-port 2525
たとえば、このコマンドは、 eth0上のすべての着信トラフィックをリダイレクトします ポート25からポート2525へのポート
ここでのこのパラメーターは、例としても使用されます。ここで達成されるのは、ポート80で、すべての着信が1分あたり100の確立された接続に制限/削減され、200の一致するパケットのリミッターバーストが設定されることです。
–着信ping要求をブロックする
# iptables -A INPUT -p icmp -i eth0 -j DROP
–特定のMACアドレスへのアクセスをブロックまたは許可する
# iptables -A INPUT -m mac --mac-source 00:00:00:00:00:00 -j DROP
# iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:00:00:00:00:00 -j ACCEPT
–Alliowループバックアクセス
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A OUTPUT -o lo -j ACCEPT
–IPアドレスごとの同時接続数を制限する
# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT
上記のコマンドは、ポート22(ssh)への接続数を制限し、クライアントごとにそれ以上の接続を許可しません。もちろん、ポート番号は変更できます。
–ドロップされたパケットをログに記録する
# iptables -A INPUT -i eth0 -j LOG --log-prefix "Dropped packets:"
–log-prefixを選択に変更できます。次のコマンドでログを検索できます:
# grep "IPtables dropped packets:" /var/log/messages
–特定のネットワーク範囲からのドロップされたパケットをログに記録する
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
–grepを使用してIPtables内のエントリ/ルールを検索する方法
# iptables -L INPUT -v -n | grep 192.168.0.100
より高度なサイバー攻撃を防ぐためのIptablesコマンド
–httpポートでのネットワークフラッディングをブロックする方法
# iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/minute --limit-burst 200 -j ACCEPT
–ポートスキャン保護を構成する
# iptables -N port-scanning
# iptables -A port-scanning -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURN
# iptables -A port-scanning -j DROP
–SSHのブルートフォース保護
# iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --set
# iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 10 -j DROP
–SYNフラッド攻撃に対する保護
# iptables -N syn_flood
# iptables -A INPUT -p tcp --syn -j syn_flood
# iptables -A syn_flood -m limit --limit 1/s --limit-burst 3 -j RETURN
# iptables -A syn_flood -j DROPiptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 1 -j ACCEPT
# iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 1 -j LOG --log-prefix PING-DROP:
# iptables -A INPUT -p icmp -j DROPiptables -A OUTPUT -p icmp -j ACCEPT
–SYNPROXYによるSYNフラッド攻撃の軽減
# iptables -t raw -A PREROUTING -p tcp -m tcp --syn -j CT --notrack
# iptables -A INPUT -p tcp -m tcp -m conntrack --ctstate INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460
# iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
–SYNではない着信パケットをブロックする
# iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
–着信時にすべてのパケットのフラグメントチェックを強制する
# iptables -A INPUT -f -j DROP
– XMASパケット攻撃を防ぐために、着信時にすべてのパケットをブロックします
# iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
–着信時にすべてのNULLパケットをブロックする
# iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
–偽のTCPフラグを持つすべてのパケットを傍受してドロップします
# iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
# iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
# iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
# iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP
# iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP
# iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP
# iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP
# iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP
# iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP
# iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
# iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP
# iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
–IPtablesルールをファイルに保存して復元します
# iptables-save > ~/iptables.rules
# iptables-restore < ~/iptables.rules
–netfilterを使用してIPtablesルールを永続的に保存する
注:iptablesプラグインが必要です「iptables-persistent」 インストールする。 「aptinstalliptables-persistent」でインストールできます Debian/Ubuntuディストリビューションで。
# netfilter-persistent save
概要
投稿を要約すると、IPtablesコマンドのチートシートリストと、さまざまなユースケースに合わせてIPtablesを構成するための最も一般的なルールのリストをまとめました(多くのWebサービスやネットワーク経由で機能するサービスで毎日使用される許可とドロップのルールがいくつかあります) )また、さまざまなサイバー攻撃を防ぐことができるいくつかの高度なIPtablesコマンドをリストしました。
iptablesは素晴らしいファイアウォールですが、適用するルールに注意してください。