iptables

Show setting
iptables -L

Delete setting (關防火牆?)
iptables -F


from https://www.atmarkit.co.jp/ait/articles/0112/18/news002_2.html
# すべてのパケットを拒否
/sbin/iptables -P INPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -P OUTPUT DROP


# すべてのパケット許可
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT

from https://qiita.com/fusagiko/items/bc2e9ae9392a28b73734

iptablesはIPv4用。
ip6tablesはIPv6用。
設定が別々になっているので、ご注意を。

まずはiptablesの仕組みを知る

iptablesは複数のチェックポイント(チェインと呼ぶ)ごとにパケットの通過を許可、拒否、破棄する条件を設定できます。
各チェインはfilter、nat、mangleという3つのカテゴリ(テーブルと呼ぶ)に分類されますが、ここではLinuxサーバにおけるファイアウォールを扱うことが目的なのでfilterテーブルにのみ言及します。

filterテーブルに属するチェイン

filterテーブルにはINPUT、OUTPUT、FORWARDという3種類のチェインがあり、それぞれ次のような役割を持ちます。
  • INPUT 受信したパケットのうち、宛先IPアドレスが自分であるものを対象とするチェイン
  • OUTPUT 自分の内側、すなわち自分の上で動作しているプログラムのプロセスから送信されるパケットを対象とするチェイン
  • FORWARD 受信したパケットのうち、宛先IPアドレスが自分ではないために転送されるパケットを対象とするチェイン

filterテーブルによるフィルタリングの流れ

FORWARDチェイン

宛先IPアドレスが自分ではないパケットはFORWARDチェインへ行きます。
それらはFORWARDチェインに記述されている条件に照会され、許可されたり、拒否されたり、破棄されます。
FORWARDチェインにおいて許可されたパケットはそのまま自分の外へ出ていきます。
ので、サーバにおけるiptablesを扱う本稿ではあんまり関係なかったりします。

INPUTチェイン

宛先IPアドレスが自分であるパケットはINPUTチェインへ行きます。
それらもやはりINPUTチェインの条件に照会され、許可されたもののみがPCの内側、すなわちLinux上で動作しているサーバプログラムのプロセスへ到達します。

OUTPUTチェイン

自身の内側から外側へ送信されるパケットは必ずOUTPUTチェインへ行きます。
OUTPUTチェインも当然各パケットを設定されている条件に照会するわけですが、その対象となるパケットの範囲については注意する必要があります。

FORWARDチェインを通過したパケットはOUTPUTチェインには到着しない

OUTPUTチェインはiptablesの内側から送信されるパケットに対してフィルタリングを行うチェインです。
FORWARDチェインを通過したパケットは外側から外側へ転送されるのみでiptablesの内側には入っていないのでOUTPUTチェインの対象ではありません。

ループバック接続はOUTPUTチェインを通過した後、INPUTチェインに到着する

Linux上で動作するプログラムには、同じコンピュータ上で動作していてもループバック接続によって接続を行うプログラムが少なからず存在します。
具体的にはMySQLなどでして、UNIX/Linuxではネットワーク越しに複数のコンピュータが連携することが当たり前ですから同じコンピュータ上で動作しているかどうかを区別せず全てIP通信で行ってしまうことが当然なのでしょう。
というわけで、同じコンピュータ上で動作するプロセスにIP通信を用いて接続する際には127.0.0.1を宛先としたパケットが送信されます。127.0.0.1は自分自身を意味するIPアドレスです。
iptablesはIPv4を対象とするファイヤーウォールなので直接は関係ありませんが、IPv6では[::1]です。
内側で動作するプロセスからiptablesの外側であるネットワーク層まで出ていくのですから当然OUTPUTチェインを通過しますし、自分自身が宛先でiptablesの内側へ到着しようとするのですから当然、INPUTチェインを通過します。

iptablesにおける許可、拒否、破棄

前節では許可、拒否、破棄という単語を用いましたが、設定ファイルに記述する場合は当然英語で、それぞれACCEPT、REJECT、DROPという語を用います。
  • ACCEPT 許可 読んで字のごとく、該当するパケットにチェインの通過を許可します。
  • REJECT 拒否 該当するバケットの送信元に対して、接続を拒否する旨のicmpパケットを送信します。
  • DROP 破棄 該当するパケットを捨てます。送信元に対しては何もしません。

iptablesの設定ファイルを読んでみる

さて、前節の知識をベースに下のファイルを上から順に読んでみましょう。
iptables
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

-A INPUT -m state --state NEW -s 127.0.0.1 -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
COMMIT

*filter

filterテーブルについての設定を始めるという宣言です。
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

各チェインのデフォルト動作とパケットカウンタの初期値を設定しています。
INPUTはデフォルト動作がDROP、FORWARDとOUTPUTはACCEPTになっています。

-A INPUT -m state --state NEW -s 127.0.0.1 -j ACCEPT

  • -A INPUT INPUTチェインにルールを追加(Append)する
  • -m state --state NEW フローの状態がNEW、すなわち新しい接続を確立するために送信されてきた最初のパケット(SYN)を対象とする
  • -s 127.0.0.1 送信元IPアドレスが127.0.0.1である
  • -j ACCEPT パケットを許可する

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

  • -A INPUT INPUTチェインにルールを追加(Append)する
  • -m state --state ESTABLISHED,RELATED パケットの状態がESTABLISHEDかRELATEDである
    • ESTABLISHED 既に確立済みである接続
    • RELATED 確立済みの接続に関係する接続 ex.FTPのデータ送信コネクションなど
  • -j ACCEPT パケットを許可する

-A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT

  • -A INPUT INPUTチェインにルールを追加(Append)する
  • -p tcp --dport 22 パケットの宛先ポートが22番である
  • -m state --state NEW フローの状態がNEW、すなわち新しい接続を確立するために送信されてきた最初のパケット(SYN)を対象とする
  • -j ACCEPT パケットを許可する




from https://www.atmarkit.co.jp/ait/articles/0912/01/news113.html

テーブルとチェイン

 iptablesを駆使するには「テーブル」と「チェイン」の理解が欠かせません。
 iptablesには「fiter」「nat」「mangle」といったテーブルが用意されており、フィルタリングの目的に応じて使い分けます。例えばパケットの通過や遮断を制御するには「filterテーブル」を使用し、送信先や送信元といったパケットの中身を書き換えるには「natテーブル」を使用します。
 またそれぞれのテーブルには「チェイン」が用意されており、どのタイミングで処理を施すか、「チェイン」を使って指定します。例えばfilterテーブルには、「INPUT」「OUTPUT」「FORWARD」といったチェインが用意されており、パケットが入ってきたタイミングで処理を行うにはINPUTチェインを、パケットが出て行くタイミングではOUTPUTチェインを使用します。natテーブルには「POSTROUTING」「PREROUTING」「OUTPUT」といったチェインが用意されています。
図1 パケット送受信において各チェインが処理されるタイミング図1 パケット送受信において各チェインが処理されるタイミング




filterテーブルに関する設定をリセット)
# /sbin/iptables -F (フィルタリングルールの削除)
# /sbin/iptables -Z (カウンターのリセット)
# /sbin/iptables -X (追加されたチェインの削除)(各チェインのデフォルトポリシーをACCEPTに戻す)
# /sbin/iptables -P INPUT ACCEPT
# /sbin/iptables -P OUTPUT ACCEPT
# /sbin/iptables -P FORWARD ACCEPT
iptablesの設定をリセットする〜手動でリセットする場合〜



テンプレート1
特定ホストからのsshのみを許可(
送信元IPアドレスで制限

受信パケットは基本的にすべて破棄(1)
送信パケットは基本的にすべて破棄(2)
ループバックアドレスに関してはすべて許可(3)
メンテナンスホストからのping、メンテナンスホストへのpingを許可(4)
メンテナンスホストからのssh(TCP 22)を許可(5)
サーバからメンテナンスホストへのsshは許可しない(6)
 サーバに接続する端末をメンテナンスホストとして固定して、そこからのssh接続のみを許可するようにします。ssh以外に、サーバの死活を監視する運用上の目的でpingを使用する可能性があるため、併せて許可します。


1 #! /bin/sh
2
3 trusthost='192.168.10.100'
4 myhost='192.168.20.200'
5
6 ##############
7 #Flush & Reset
8 ##############
9 /sbin/iptables -F
10 /sbin/iptables -Z
11 /sbin/iptables -X
12 ##############
13 #Deafult Rule
14 ##############
15 /sbin/iptables -P INPUT DROP
16 /sbin/iptables -P OUTPUT DROP
17 /sbin/iptables -P FORWARD DROP
18 #########
19 #loopback
20 #########
21 /sbin/iptables -A INPUT -i lo -j ACCEPT
22 /sbin/iptables -A OUTPUT -o lo -j ACCEPT
23 #######################
24 #ICMP trusthost->myhost
25 #######################
26 /sbin/iptables -A INPUT -p icmp --icmp-type echo-request -s $trusthost -d $myhost -j ACCEPT
27 /sbin/iptables -A OUTPUT -p icmp --icmp-type echo-reply -s $myhost -d $trusthost -j ACCEPT
28 ####################### 29 #ICMP myhost->trusthost
30 #######################\
31 /sbin/iptables -A OUTPUT -p icmp --icmp-type echo-request -s $myhost -d $trusthost -j ACCEPT
32 /sbin/iptables -A INPUT -p icmp --icmp-type echo-reply -s $trusthost -d $myhost -j ACCEPT
33 #######################
34 #ssh trusthost-> myhost
35 #######################
36 /sbin/iptables -A INPUT -p tcp -s $trusthost -d $myhost --dport 22 -j ACCEPT
37 /sbin/iptables -A OUTPUT -p tcp -s $myhost --sport 22 -d $trusthost -j ACCEPT
38 #########
39 #logging
40 #########
41 /sbin/iptables -N LOGGING
42 /sbin/iptables -A LOGGING -j LOG --log-level warning --log-prefix "DROP:" -m limit
43 /sbin/iptables -A LOGGING -j DROP
44 /sbin/iptables -A INPUT -j LOGGING
45 /sbin/iptables -A OUTPUT -j LOGGING
 
テンプレート1(行番号付き)



テンプレート1の解説

 3、4行目でメンテナンスホスト($trusthost)とサーバ($myhost)のIPアドレスを指定します。これらの値は何度も使用するため、シェルスクリプトの利点を生かしてパラメータとして埋め込みます。この2行は皆さんの環境に合わせて、適宜書き換えてください。
 9〜11行目で既存のiptablesの設定をリセットしています。
 15行目からようやく設定らしくなります。iptablesの基本は、いったんネットワークをふさいだ後、用途に応じて穴を開けるようにルールを追加していくことです。まず、すべての送受信パケットを破棄(DROP)します。ここでは、次の3つのタイミングでパケットを破棄します。
  • パケットが入ってくるタイミング(INPUTチェイン)
  • パケットが出て行くタイミング(OUTPUTチェイン)
  • パケットが転送されるタイミング(FORWARDチェイン)
図3 パケット送受信とINPUT/OUTPUT/FORWARDチェインが処理されるタイミング図3 パケット送受信とINPUT/OUTPUT/FORWARDチェインが処理されるタイミング
 15行目の「-P INPUT」は、INPUTチェインで受信パケットの破棄(DROP)を実行しています。同様に、16行目の「-P OUTPUT」で送信パケットを破棄し、17行目の「-P FORWARD」で転送パケットの破棄を実行します。
21、22行目で、ループバックインターフェイスを経由するすべての送受信パケットの通過を許可します。「-i」で受信側インターフェイス、「-o」で送信側インターフェイスを指定します。これでサーバからサーバ自身へのローカル接続をすべて許可することができます。
 26、27行目は、メンテナンスホストからサーバへのpingを許可するルールの追加です。pingでは、「request」(26行目)とそれに応える「reply」(27行目)がセットで必要になります。
 31、32行目は、サーバからメンテナンスホストへのpingを許可するルールです。26、27行目と比べると、送信元と送信先が入れ替わっています。送信元(ソース)ホストを指定するには「-s ホストまたはネットワーク」とし、送信先(ディスティネーション)ホストを指定するには「-d ホストまたはネットワーク」とします。
 36、37行目が肝心のsshの設定です。今回は、単に送信元IPアドレスで制限します。
36  iptables -A INPUT -p tcp -s $trusthost -d $myhost --dport 22 -j ACCEPT
37  iptables -A OUTPUT -p tcp -s $myhost --sport 22 -d $trusthost -j ACCEPT
-p tcp     プロトコルがTCP  
-s $trusthost   送信元IPアドレスが$trusthost  
-d $myhost    送信先IPアドレスが$myhost  
--dport 22    送信先サービスポートが22  
--sport 22    送信元サービスポートが22    
-j ACCEPT    ACCEPT(許可)する
 41行目以降で運用監視のための設定を行います。37行目までの設定のどれにも合致しなかったパケットに関しては、不正なパケットと判断し、ログファイルに記録した後、破棄します。そのために41行目のような「LOGGINGチェイン」を独自に定義します。
 42行目では、「--log-level」でログレベルをwarningに設定し、「--log-prefix」でログ出力時に「DROP:」とプレフィックスを付けるようにしています。このままでは無効な全パケットを記録してしまい、絶え間なく攻撃を受けたときなど、ログの出力だけでサーバの負担になる可能性があります。そこで、「-m limit」で制限します。立て続けに攻撃を受けたとしても、最初に5パケット分のログを5行出力した後は、20分置きにログを1行ずつ出力するようになります。
 ログ出力の後にパケットを破棄(DROP)するよう、43行目で無効なパケットの破棄を実行します。




from https://oxynotes.com/?p=6361



NATについて

NAT(Network Address Translation)とはパケットフィルタリング型のファイアーウォールに搭載されている「ネットワークアドレス変換機能」のことです。
内部ネットワークの構成を知られたくない場合や、1つのグローバルIPを複数の内部サーバに割り振る際に利用します。
つまり、ファイアーウォールで通信の制御をするルーターの役割を担うという仕組みです。
今回はNATについては詳しく解説しませんが「こちらのページ」で詳しく解説されています。興味のある方は調べてみてください。

パケットフィルタリングの概要と書式

それでは本題のパケットフィルタリングについて解説します。まずは基本的な書式を確認していきましょう。
それぞれのパラメータについては後ほど解説します。まずは概要だけ理解しておいてください。
設定ファイルは「/etc/sysconfig/iptables」に保存されています。この設定ファイルを直接編集することも可能ですが、コマンドやシェルスクリプトを利用した編集が一般的です。このページではシェルスクリプトを利用して編集する方法を解説します。

iptablesの書式

iptables [-t テーブル] コマンド [マッチ] [ターゲット/ジャンプ]

テーブルについて

iptablesではパケットを、4つのテーブルに分けて、それぞれのタイミングで制御します。テーブルには「filterテーブル」「natテーブル」「mangleテーブル」「rawテーブル」があります。


natテーブル

上で解説した、NAT(ネットワークアドレス変換機能)を担当します。送信先や送信元といったパケットの中身を書き換える際に利用します。各通信をローカルネットワーク上のサーバへ振り分けるルーターとして機能させることができます。

例)natテーブルの例

*nat
 #ここにnat関係の記述
COMMIT

例)IP マスカレードの指定

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE

例)インターフェイスeth0から受信したポート80のTCPパケットをローカルのApacheサーバ(172.31.0.1:80)へフォワーディング

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 172.31.0.1:80

mangleテーブル

TOS(Type Of Service)フィールド等の値を書き換えます。TOSはパケット処理の優先度付けを行い、通信品質を制御する際に利用されます。
また特定の通信マークを置き換える事もできます。

例)mangleテーブルの例

*mangle
 #ここにmangle関係の記述
COMMIT

例)ポート80の通信のTOSを高スループットのものへ書き換え

iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TOS --set-tos Maximize-Throughput

例)ポート443の通信マークをポート80のものと合わせ、マークマッチを使って通信を破棄

iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 80
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 80
iptables -t mangle -A PREROUTING -m mark --mark 80 -j DROP

チェインについて

それぞれのテーブルの中で、どのタイミングでフィルタリングするかを決めるのがチェインです。例えば受信時についてはINPUT、送信時についてはOUTPUTといった具合です。

チェインの種類

チェインには以下の種類があります
INPUT入力(受信)に対するチェイン
OUTPUT出力(送信)に対するチェイン
FORWARDフォアード(転送)に対するチェイン
PREROUTING受信時に宛先アドレスを変換するチェイン。タイミングとしてはfilterで適用されるルールより手前
POSTROUTING送信時に送信元アドレスを変換するチェイン。これもfilterの後でパケットが送信される直前
上記のチェインを各テーブルに記述してパケットを制御しますが、それぞれのテーブルで使えるチェインは以下のように決まっています。
filterテーブルINPUT、OUTPUT、FORWARD
natテーブルPOSTROUTING、PREROUTING、OUTPUT
mangleテーブルPOSTROUTING、PREROUTING、INPUT、OUTPUT、FORWARD
RawテーブルPREROUTING、OUTPUT
各テーブルとチェインの関係を図にすると以下のようになります。思わぬ失敗を避けるため、実際に設定する際はどこにルールを追加しているか意識しながら作業を行うようにしてください。
iptables01

オプションについて

オプションで設定できるのは、「コマンド」と「パラメータ」です。「コマンド」でチェインの扱いを決めて、「パラメータ」で細かな指定をするという流れになります。

コマンドについて

コマンドはチェインをどのように扱うかを指定します。下の一覧にあるように「-A INPUT」とすれば新しい受信時のルールを追加。「-D INPUT」とすれば受信時のルールを削除という指定ができます。

よく使うコマンドの一覧

指定方法内容
-A(--append)指定チェインに1つ以上の新しいルールを追加
-D(--delete)指定チェインから1つ以上のルールを削除
-P(--policy)指定チェインのポリシーを指定したターゲットに設定
-N(--new-chain)新しいユーザー定義チェインを作成
-X(--delete-chain)指定ユーザー定義チェインを削除
-I(--insert)指定したチェーンにルール番号を指定してルールを挿入する。(ルール番号を省略した際にはルール番号は1に設定され、チェーンの先頭に挿入される。)

例)filterテーブルのINPUTに登録されたルール番号3番のルールを削除

iptables -t filter -D INPUT 3

パラメータについて

受信や送信はチェインで指定できますが、特定のIPだけ遮断、プロトコルによって遮断といった細かい制御をしたい場合はパラメータで指定します。

よく使うパラメータの一覧

指定方法内容
-s (--source)パケットの送信元を指定。特定のIP(192.168.0.1)や範囲(192.168.0.0/24)を指定する
-d (--destination)パケットの宛先を指定。指定方法は-sと同じ。
-p (--protocol)チェックされるパケットのプロトコル。 指定できるプロトコルは、 tcp、udp、icmp、allのいずれか1つか、数値。
-i (--in-interface)パケットを受信することになるインターフェース名。eth0、eth1など
-o (--out-interface)送信先インターフェース名を指定
-j (--jump)ターゲット(ACCEPT、DROP、REJECT)を指定

例)224.0.0.1宛の受信パケットを破棄

iptables -A INPUT -d 224.0.0.1 -j DROP

「-j」で指定するターゲットについて

書式のtargetに当たる部分です。ターゲットは指定したパケットをどのように扱うかを指定します。ACCEPTであれば許可、DROPであれば破棄といった具合です。この他にユーザー定義チェインも指定することができます。

ターゲットの一覧

指定方法内容
ACCEPTパケットの通過を許可
DROPパケットを破棄。応答を返さない。
REJECTパケットを拒否し、ICMPメッセージを返信
REDIRECT特定ポートにリダイレクト
LOGマッチしたパケットのログを記録

拡張パラメータについて

上記のパラメータに加え、一致する条件を更に細かく指定をする際に利用します。パケットマッチングモジュールとも呼ばれます。
拡張であることを明示することなく利用できる「-p」の後に追記するタイプと、「-m」で拡張を明示してから追記するタイプがあります。

-p」オプションによって(暗示的に)呼び出されるタイプ

指定方法内容
--sportSource Port。送信側(クライアント側)のポート番号を指定。-p tcp か -p udp の後に指定します。
--dportDestination Port。受信側(サーバ側)のポート番号を指定-p tcp か -p udp の後に指定します。
--tcp-flagsTCP のときだけ指定することができる。第1引数に評価されるTCPフラグを指定し、第2引数に設定されていなければならないフラグを指定します。指定可能なフラグは、SYN、ACK、FIN、RST、URG、PSH、ALL、NONE です。複数指定する場合はカンマで区切り、引数の間は半角スペースで区切ります。(--tcp-flags SYN,RST,ACK SYN)
--synTCP のときだけ指定することができる。SYNビットがセットされた、いわゆるTCPの接続確立時に、正規のスリーハンドシェイク手順を踏んだ通信を指定します。上記のSYN,RST,ACK SYNの省略形。
--icmp-typeICMP のタイプを指定。pingに限定した指定をする際などに指定します。

例)ポート80で受信したTCPの受信パケットを破棄

iptables -A INPUT -p tcp --dport 80 -j DROP

例)ポート80で受信したTCPかつ、SYN、RST、ACKのうちSYNフラグだけを持った受信パケットを許可

iptables -A INPUT -p --tcp-flags SYN,RST,ACK SYN --dport 80 -j ACCEPT

-m」オプションを付けることで(明示的に)呼び出されるタイプ

リミット拡張モジュール

limitリミット拡張モジュールを読み込み。
--limit時間あたりに何パケットまで許可するかを指定する。second(秒)、minute(分)、hour(時)、day(日)を指定することができます。--limit の初期値は 3/hour
--limit-burst上記のリミットが有効になる通信の回数を指定。「○回受信したら1時間に1回に制限」という際の「○回」の部分を指定する。初期値は5。

例)TCPのポート80宛の受信パケットを、ハッシュリミットで5回まで無条件で受け入れ、それ以上のパケットを1分間に1度だけ許可する

バーストしても1分経つごとに1アクセスだけ受け入れるパケットが増える。つまり5分経てば再び5パケットまで受け入れる
iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-burst 5 --hashlimit 1/m --hashlimit-mode srcip -j ACCEPT

length拡張モジュール

lengthlength拡張モジュールを読み込み。パケットのサイズをフラグとしてマッチさせることができる。
--length「○:○」という書式で「前半の○から、後半の○サイズまで」と指定する。後半の指定を外せば○以上、前半の指定を外せば○以下という指定も可能。

例)85から65535バイトまでに一致。

iptables -A INPUT -p tcp --dport 80 -m length --length 85:65535

例)85バイト以下に一致。

iptables -A INPUT -p tcp --dport 80 -m length --length :85

state拡張モジュール

statestate拡張モジュールを読み込み。パケットを追跡することでステートフル・パケットインスペクションが可能になります。詳細は後述
--state追跡しているパケットの状態を指定。新規か、既に許可をしたものか、などを指定する。

state拡張で指定可能なパラメータ

NEW全くの新参の接続
ESTABLISHED既に許可された接続
RELATED新参ではあるが許可された接続
INVALIDパラメータの不明な無効な接続

例)TCPの受信パケットの内、新規の接続に関しては破棄

iptables -A INPUT -p tcp -m state --state NEW -j DROP
この他にも多くの拡張モジュールが存在します。
こちらのページ」で詳しく解説しているので興味のある方は調べてみてください。

from 

全設定削除

iptablesが真っ白になる
command
iptables -F

//delete nat setting
sudo  iptables -t nat -F


//save iptables setting
sudo iptables-save



run as root

sudo -s

Save current firewall rules to file

iptables-save > /etc/firewall.conf

INCLUDE ON BOOT

echo ‘#!/bin/sh’ > /etc/network/if-up.d/iptables
echo “iptables-restore < /etc/firewall.conf” >> /etc/network/if-up.d/iptables
chmod +x /etc/network/if-up.d/iptables

SAVE ON SHUTDOWN/REBOOT

echo ‘#!/bin/sh’ > /etc/network/if-down.d/iptables
echo “iptables-save > /etc/firewall.conf” >> /etc/network/if-down.d/iptables
chmod +x /etc/network/if-down.d/iptables
is working for me
if you what to save your iptables rules after an change to iptables just run below… but it will run the same command on reboot or shutdown.
iptables-save > /etc/firewall.conf













from http://www.phcno1.net/modules/tad_book3/html_all.php?tbsn=4



3. iptables基本語法

我們在Linux上要實做不論是防火牆、NAT、連線限制或管理都必須要動到iptables,一般iptables參數很多,我們常會用到不多,只要熟 用就可做出一台稱職的firewall,所以這一部份就是要來談談一些基本觀念及參數使用。
防火牆入門手冊

3-1 iptables結構圖



iptables 指令結構圖
iptables -I INPUT -p tcp -s 192.168.1.0/24 --dport 23 -j ACCEPT
1.--->-I INPUT 檢查目標
2.--->-p tcp -s 192.168.1.0/24 --dport 23 比對規則做判斷
3.--->-j ACCEPT處理方式
所以上面的規則就是說明從192.168.1.0/24來的IP,通訊協定是TCP,目標port是23允許進入

封包進入規則表及規則鏈圖:

上圖取自 http://www.knowplace.org/netfilter/syntax.html


netfilter封包路徑圖,可以讓我清楚了解到封包整個情形
防火牆入門手冊

3-2 表格的功能

iptables依功能不同把表格分為三種:
1.filter---這個表格最主要就是設定封包過濾
2.nat---這個表格主要是做 ip 轉換用的,例如把虛擬IP轉成真實IP,才能正常上網
3.mangle---這個是自訂,最主要是進階設定用的

一般我們在設定防火牆時,最主要都是做封包過濾,所以一般都放置在filter,如果我們沒有指定table,iptable內定就是filter。
每一種表格又包含有不同的鏈:
1.filter---input.ouput.forward
2.nat---prerouting.output.postrouting
3.mangle---prerouting.output.postrouting.input.forward

對於各個表格相同名稱的鏈,先後順序:
mangle-->nat--->filter
我們來想想如果有一個封包在mangle是禁止,在filter是允許通過的,那封包可以通過嗎?
答案是不行,在第一關就不過那能通過呢?
同樣如果在mangle和nat都允許通過,在filter設定禁止,那前二個通過,到第三關不過,一樣不能過。
這樣應該了?
防火牆入門手冊

3-3 鏈的作用

我們以我們海關的流程來做個舉例,我們一般人進出海關都必須經過出入境檢查,在iptables中,各個檢查處稱稱為「鏈」。
要入境就在入境處接受檢查,而要出國就必須在出境處接受檢查。
我們以下面說明各個鏈的做用及意義:
1.prerouting--封包進入主機時首先就是必須通過prerouting,它會決定封包往何處送。
2.postrouting--對外送的封包通過了output或forward後就會經過postrouting然後才會往外送。
3.input--這是封包進入主機前需通過的鏈,也就經過路由判斷後目的是本機時就會交給input鏈處理。
4.output--從本機送出的封包會交給output處理
5.forward--這時處理封包轉送,也就封包經過路由判斷後發現目前為其他主機,封包就不會進入本機而會經過另一個網路介面出去,這時候就會使用到 forward。
防火牆入門手冊

3-4 檢查目標語法

我們來看看常用iptables語法:
$IPTABLES -t filter -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT
$IPTABLES -t filter(-t是指定table為filter)
我來講一下參數有那些:
參數功能
-t就是要指定表格名稱
-I在鏈的最前面插入規則
-A附加在鏈的最後
-D在鏈中刪除規則
-N自訂新的鏈
來 舉個例 子比較清楚:
$IPTABLES -t filter -A INPUT (在table為filter的INPUT鏈最後加入規則)
$IPTABLES -t filter -I OUTPUT (在table為filter的OUTPUT鏈最前插入規則)
$IPTABLES -t filter -D FORWARD (刪除table為filter的FORWARD鏈中規則)
(使用刪除參數,必須要完整描述刪除那一條規則。如:iptables -D INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT)
$iptables -t nat -N newchain(在nat表格中新增一個名為newchain鏈)
防火牆入門手冊

4. 防火牆的基本原理

防火牆入門手冊

5. 單機型防火牆

一般我們中小目前都使用是這種防火牆,把所有規則都寫入到server中,因為不用考慮到內外網的問題,所以設定上比閘道防火牆容易多了,我們就以 b2d-server上的/etc/init.d/rc.local來說明,下一節就舉這個實例來講。
防火牆入門手冊

5-1 單機防火牆的架構

所請單機防火牆就是學校沒有防火牆,所以我們必須在每一台server做防火牆設定,如下圖:
防火牆入門手冊

5-2 OB2D-Server的防火牆設定

使用OB2D來做firewall時,請關閉不必要的服務,請使用ntsysv
僅保留 anacron, atd, autofs, cron, gdm, kerneld, klogd, makedev, rmnologin, ssh, sysklogd, xinetd,其餘全部取消後重開機

#! /bin/bash
# iptables 範本
# written by OLS3 (ols3@lxer.idv.tw)
#請自行參考修改,把註解拿掉即可啟用該項設定

#sbin/route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.1
(增加路由,表示192.168.1.0/24這個網段要出去從192.168.1.1)

###-----------------------------------------------------###
# 設定 iptables 的路徑
###-----------------------------------------------------###
echo "Set path of iptables"
echo
IPTABLES="/sbin/iptables"

FW_IP="192.168.1.95"
FW_IP_RANGE="192.168.1.0/24"
#FW_IFACE="eth0"
(這一部因為是單機所以就設有所謂的外部與內部之分,所以就Lan_IP註解)
#LAN_IP="192.168.1.1"
#LAN_IP_RANGE="192.168.1.0/24"
#LAN_BCAST_ADRESS="192.168.1.255"
#LAN_IFACE="eth1"

# loopback interface
LO_IFACE="lo"
LO_IP="127.0.0.1"
(這是本機的 interface)

#echo "1" > /proc/sys/net/ipv4/ip_forward
(打開核心 forward 功能,當要做nat時就必須用到)

###-----------------------------------------------------###
# 清除先前的設定
###-----------------------------------------------------###
echo "Flush fiter table ......"(這是封包過濾表格)
echo

# Flush filter
$IPTABLES -F (-F是清除表格中的規則)
$IPTABLES -X (-X是清除自訂的鏈)

echo "Flush mangle table ......"(這個是自訂的table)
echo
# Flush mangle
$IPTABLES -F -t mangle (-F是清除表格中的規則)
$IPTABLES -t mangle -X (-X是清除自訂的鏈)


echo "Flush nat table ......" (這個是nat的table)
echo
# Flush nat
$IPTABLES -F -t nat (-F是清除表格中的規則)
$IPTABLES -t nat -X (-X是清除自訂的鏈)

###-----------------------------------------------------###
# 設定 filter table 的預設政策
###-----------------------------------------------------###
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
(accept就是都允許通過,接下我們去設定那些要擋)

###-----------------------------------------------------###
# 啟動內部對外轉址
###-----------------------------------------------------###

#$IPTABLES -t nat -A POSTROUTING -o $FW_IFACE -j SNAT --to-source $FW_IP
(這是單機所以就註解不用)

###-----------------------------------------------------###
# 啟動外部對內部轉址
###-----------------------------------------------------###
# 凡對 $FW_IP:8080 連線者, 則轉址至 192.168.1.3:80
#$IPTABLES -t nat -A PREROUTING -p tcp -d $FW_IP --dport 8080 -j DNAT --to 192.168.1.3:80
(這是單機所以就註解不用)

###-----------------------------------------------------###
# 拒絕某一內部 IP 使用某一通道
###-----------------------------------------------------###

# 以下封掉內部主機連到外部主機的 port 6677, 請自行針對不同服務 port 號做修改
# 讓 192.168.1.6 通過
#$IPTABLES -A FORWARD -o $FW_IFACE -p tcp -s 192.168.1.6 --dport 6677 -j ACCEPT
# 其餘擋掉
#$IPTABLES -A FORWARD -o $FW_IFACE -p tcp --dport 6677 -j DROP
(這是單機所以就註解不用)

###-----------------------------------------------------###
# 拒絕外部 IP 連至內部 port 號
###-----------------------------------------------------###

# 以下擋掉外部主機連至內部主機 port 6677
# 讓 192.168.1.0/24 通過
#$IPTABLES -A INPUT -i $FW_IFACE -p tcp -s 192.168.1.0/24 --dport 6677 -j ACCEPT
# 其餘擋掉
#$IPTABLES -A INPUT -i $FW_IFACE -p tcp --dport 6677 -j DROP
(這是單機所以就註解不用)

# 只有本主機所屬網段才能連到這台主機的 FTP server port 21
$IPTABLES -A INPUT -p tcp -s 192.168.1.0/24 --dport 21 -j ACCEPT
(在filter中加入一條規則,通訊協定是tcp,來源是192.168.1.0/24這網段,目標是21port是允許通過)
$IPTABLES -A INPUT -p tcp -s 127.0.0.1 --dport 21 -j ACCEPT
(在filter中加入一條規則,通訊協定是tcp,來源是127.0.0.1,就是本機,目標是21port是允許通過)
$IPTABLES -A INPUT -p tcp --dport 21 -j DROP
(其他都不允許)
以下其他一樣,只是通訊協定及port不一樣而以)

# 只有本主機所屬網段才能連到這台主機的 Telnet server port 23
$IPTABLES -A INPUT -p tcp -s 192.168.1.0/24 --dport 23 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 127.0.0.1 --dport 23 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 23 -j DROP

# 只有本主機所屬網段才能連到這台主機的 ssh port 22
$IPTABLES -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 127.0.0.1 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 22 -j DROP

# 只有本主機所屬網段才能連到這台主機的 Samba port tcp 139,445 / udp 137,138
$IPTABLES -A INPUT -p tcp -s 192.168.1.0/24 --dport 139 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 192.168.1.0/24 --dport 445 -j ACCEPT
$IPTABLES -A INPUT -p udp -s 192.168.1.0/24 --dport 137 -j ACCEPT
$IPTABLES -A INPUT -p udp -s 192.168.1.0/24 --dport 138 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 127.0.0.1 --dport 139 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 127.0.0.1 --dport 445 -j ACCEPT
$IPTABLES -A INPUT -p udp -s 127.0.0.1 --dport 137 -j ACCEPT
$IPTABLES -A INPUT -p udp -s 127.0.0.1 --dport 138 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 139 -j DROP
$IPTABLES -A INPUT -p tcp --dport 445 -j DROP
$IPTABLES -A INPUT -p udp --dport 137 -j DROP
$IPTABLES -A INPUT -p udp --dport 138 -j DROP

/sbin/ip6tables -F
/sbin/ip6tables -A INPUT -p tcp --dport 21 -j DROP
/sbin/ip6tables -A INPUT -p tcp --dport 22 -j DROP
/sbin/ip6tables -A INPUT -p tcp --dport 23 -j DROP
/sbin/ip6tables -A INPUT -p tcp --dport 139 -j DROP
/sbin/ip6tables -A INPUT -p tcp --dport 445 -j DROP
/sbin/ip6tables -A INPUT -p udp --dport 137 -j DROP
/sbin/ip6tables -A INPUT -p udp --dport 138 -j DROP
防火牆入門手冊

5-2-1 OB2D做防火牆的網卡設定

如果你是單機那就安裝一張網卡就可以了,裝完會有eth0
如果你是做NAT或Bridge的話就安裝二張,一張對內,一張對外,裝完會有eth0 eth1
如果你是做NAT或Bridge加DMZ的話就安裝三張,一張對內,一張對外,一張做DMZ,安裝完就會有eth0 eth1 eth2

【舉例】
1. eth0 : 140.127.xxx.xxx (用來模擬真實 IP 段),gw : 140.127.xxx.yyy
2. eth1 : 192.168.2.1 ( LAN 區,使用私有 IP 段)
3. eth2 : 192.168.3.1 ( DMZ 區,使用私有 IP 段。若沒有 DMZ 這一部份就不用做)

/etc/network/interfaces 的內容如下:
auto lo eth0 eth1 eth2
iface lo inet loopback

# 這裡代表真實 IP
iface eth0 inet static
address 140.127.aaa.xxx
netmask 255.255.255.0
network 140.127.aaa.0
broadcast 140.127.aaa.255
gateway 140.127.aaa.254

# 這裡代表 NAT 內部網路
iface eth1 inet static
address 192.168.2.1
netmask 255.255.255.0
network 192.168.2.0
broadcast 192.168.2.255

# 這裡代表 DMZ 網路
iface eth2 inet static
address 192.168.3.1
netmask 255.255.255.0
network 192.168.3.0
broadcast 192.168.3.255

設定完成後存檔,接著執行
service networking restart
讓網卡 IP 設定生效
接著使用
#ifconfig
查看是否正確,也可以使用ping來看看各介面是否回應正確。
防火牆入門手冊

5-2-2 修改防火牆設定

OB2D防火牆的設定是寫成script放在/etc/rc.local 中,所以安裝完b2d、設定網卡及關閉不必要服務後就要修改/etc/rc.local  舊的b2d-server是放在/etc/init.d/rc.local

#vim /etc/rc.local

1. 設定內外網卡
# 對外的網卡 IP
FW_IP="140.127.aaa.xxx"
# 真實 IP 段
FW_IP_RANGE="140.127.aaa.0/24"
# 對外網路介面設備的名稱
FW_IFACE="eth0"

# 對內部的網卡 IP
LAN_IP="192.168.2.1"
# 內部網段範圍
LAN_IP_RANGE="192.168.2.0/24"
# 內部網段的廣播位址
LAN_BCAST_ADRESS="192.168.2.255"
# 對內部網卡設備名稱
LAN_IFACE="eth1"

2. 打開 FORWARD 功能:
echo "1" > /proc/sys/net/ipv4/ip_forward

3. 啟用IP 偽裝(這是source NAT)
$IPTABLES -t nat -A POSTROUTING -o $FW_IFACE -j SNAT --to-source $FW_IP

5. 執行 /etc/rc.local
. /etc/rc.local
防火牆入門手冊

6-1 Socket pair

所謂的socket pair就是由來源的IP+PORT和目的 IP+PORT所組成,每一個封包都含有一對的socket pair
source socket:
-source address
-source port
destination socket:
-destination address
-destination port

nat的工作原理:

我們可以很清楚的看到,首先由client向ftp-server要資料,因為從192.168.1.2這個虛擬的IP出去,無法路由,到了防火牆後會把 source ip改成防火牆的對外的IP,這樣就可出去到internet了,回來的話先到防火牆的wan,進入防火牆後會把目的改成192.168.1.2就OK 了。
防火牆入門手冊

7. 圖形化的Firewall軟體

防火牆入門手冊

7-1 Firestarter

圖形化介面的防火牆設定軟體,debian安裝:(裝好Firestarter 就以系統服務常駐了)
#apt-get install firestarter
主選單的 "應用程式" - "系統工具" (Gnome)

第一次開啟會有設定精靈,完成設定後即進入主畫面︰(如上圖)

我們要注意的就第三個頁籤policy
Policy 分兩組︰Inbound traffic policy 及 Outbound traffic policy
1)Outbound traffic policy -
可使用預設值,就是所有對外連線均允許(Permissive by default, blacklist traffic),僅針對黑名單設限。
如果您對安裝特別的要求的人,那麼可以選 Restrictive by default, whitelist traffic ,再根據需求設定允許的連線。

2)Inbound traffic policy -
這個就是重點了,主要設定由外部到你的主機的連線,可針對你所開啟的服務來設定
2-1)Allow connections from host - 允許哪些外部電腦連線到你的主機。
2-2)Allow services - 允許哪些服務開啟。//這個設定比較好用
例如:
SSH 服務─
「Allow services」-- 「Add Rule」--「設定 port number 及要允許連線的外部電腦」--「按一下 Apply Policy」
防火牆入門手冊

7-2 fwbuilder

官方網站:
http://www.fwbuilder.org/

1)安裝:
FreeBSD使用ports安裝,分別在以下兩個目錄
/usr/ports/security/libfwbuilder
/usr/ports/security/fwbuilder
#make install clean
就可以了。

使用B2d-server debian or ubuntu
#apt-get install
(會連同fwbuilder-common,fwbuilder-linux,libfwbuilder6一起安裝)

2)執行:
#fwbuilder
會啟動fwbuilder,如下圖


詳細操作:
http://www.fwbuilder.org/UsersGuide.pdf

防火牆還是要有概念才比較容易上手,個人看法。
防火牆入門手冊

7-3 微軟系統下的防火牆軟體

如果學校沒有對外的閘道防火牆,那麼個人建議您一定要安裝單機防火牆,站長已經有錄製好多套常用防火牆的影音教學:
各那防火牆介紹底下的網址就影音教學(小弟錄製的)

1)費爾防火牆:
個人建議使用,比較安靜,可以及時監視TCP/IP封包,並根據設定的規則對網路封包做攔截或放行的動作,從而可以對 TCP/IP封包做一層過濾來達到防止駭客攻擊的目的。
http://203.68.253.130/~huang/video/fel-1/fel-1.html

2)Outpost:
功能不錯且免費的防火牆程式,還可以利用線上更新最新的資訊,使用上很容易上手
http://203.68.253.130/~huang/video/outpost/outpost.html

3)Comodo:
Comodo Inc 所開發的一套免費網路防火牆,它具有一般市售防火牆的多數功能,如封鎖特定通訊埠、封鎖特定軟體網路存取權限、監控網路使用情形、安全等級調整等,有中文 介面,很方便喔!
http://203.68.253.130/~huang/video/comodo/comodo.html

4)Jetico Personal Firewall
功能齊全,效果不錯。
http://203.68.253.130/~huang/video/jetico/jetico.html

個人建議使用費爾防火牆會是比較方便好用的























from https://blog.longwin.com.tw/2016/07/iptables-delete-rule-by-line-2016/

iptables 刪除某行規則

增加此行規則
  • iptables -A INPUT -s 123.123.123.123 -j DROP # 將 123.123.123.123 全部擋掉
列出所有規則,前面加上行號
  • iptables -L INPUT -n --line-numbers
要刪除某一行的規則
  • iptables -D INPUT 1 # 若只有上述那行,那就是 1
  • iptables -D INPUT 3 # 若有多行,只要刪除第三行

open 80 port
from https://www.linux.com/blog/open-http-port-80-iptables-centos

# iptables -I INPUT 5 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEP


from 
作者:海底苍鹰
地址:http://blog.51yip.com/linux/1404.html


iptables 添加,删除,查看,修改


iptables是linux系统自带的防火墙,功能强大,学习起来需要一段时间,下面是一些习iptables的时候的记录。如果iptables不熟悉的话可以用apf,是一款基于iptables的防火墙,挺好用的。请参考:linux apf 防火墙 安装 配置

一,安装并启动防火墙

[root@linux ~]# /etc/init.d/iptables start  

当我们用iptables添加规则,保存后,这些规则以文件的形势存在磁盘上的,以centos为例,文件地址是/etc/sysconfig/iptables,我们可以通过命令的方式去添加,修改,删除规则,也可以直接修改/etc/sysconfig/iptables这个文件就行了。

二,添加防火墙规则

1,添加filter表

查看复制打印?

[root@linux ~]# iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT  //开放21端口  

出口我都是开放的iptables -P OUTPUT ACCEPT,所以出口就没必要在去开放端口了。

2,添加nat表

[root@linux ~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE  

将源地址是 192.168.10.0/24 的数据包进行地址伪装

3,-A默认是插入到尾部的,可以-I来插入到指定位置

查看复制打印?

[root@linux ~]# iptables -I INPUT 3 -p tcp -m tcp --dport 20 -j ACCEPT  

  

[root@linux ~]# iptables -L -n --line-number  

Chain INPUT (policy DROP)  
num  target     prot opt source               destination  
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0  
2    DROP       icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 8  
3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:20                //-I指定位置插的  
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22  
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80  
6    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED  
7    DROP       all  --  0.0.0.0/0            0.0.0.0/0           state INVALID,NEW  
8    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:21                //-A默认插到最后  
  
Chain FORWARD (policy ACCEPT)  
num  target     prot opt source               destination           
  
Chain OUTPUT (policy ACCEPT)  
num  target     prot opt source               destination  
三,查下iptable规则
1,查看filter表
查看复制打印?
[root@linux ~]# iptables -L -n --line-number |grep 21 //--line-number可以显示规则序号,在删除的时候比较方便  
5    ACCEPT     tcp  --  192.168.1.0/24       0.0.0.0/0           tcp dpt:21  
如果不加-t的话,默认就是filter表,查看,添加,删除都是的
2,查看nat表
[root@linux ~]# iptables -t nat -vnL POSTROUTING --line-number  
Chain POSTROUTING (policy ACCEPT 38 packets, 2297 bytes)  
num   pkts bytes target     prot opt in     out     source               destination  
1        0     0 MASQUERADE  all  --  *      *       192.168.10.0/24      0.0.0.0/0  
四,修改规则
查看复制打印?
[root@linux ~]# iptables -R INPUT 3 -j DROP    //将规则3改成DROP  
五,删除iptables规则
查看复制打印?
[root@linux ~]# iptables -D INPUT 3  //删除input的第3条规则  
  
[root@linux ~]# iptables -t nat -D POSTROUTING 1  //删除nat表中postrouting的第一条规则  
  
[root@linux ~]# iptables -F INPUT   //清空 filter表INPUT所有规则  
  
[root@linux ~]# iptables -F    //清空所有规则  
  
[root@linux ~]# iptables -t nat -F POSTROUTING   //清空nat表POSTROUTING所有规则  
六,设置默认规则
查看复制打印?
[root@linux ~]# iptables -P INPUT DROP  //设置filter表INPUT默认规则是 DROP  
所有添加,删除,修改后都要保存起来,/etc/init.d/iptables save.上面只是一些最基本的操作,要想灵活运用,还要一定时间的实际操作。
98


留言

熱門文章