見出し画像

【Linux】 FirewallとIptableの設定

Firewall

必要なアクセスを許可したり、外部から攻撃を防ぐために拒否したりするルールを決める。iptableより主流になる。

サービスはポート番号で指定することもできますが、httpやsshと言ったサービス名で指定することもできる。

--permanentを使用することで、恒久的な設定とすることができる。その後は必ずfirewall-cmd --reloadを行うこと


サービスの一覧

firewall-cmd --get-servicesで firewalld に定義されているサービス名を確認できる。/usr/lib/firewalld/services にサービスの定義ファイルがある。

サービスの追加

firewall-cmd --add-service=サービス名
サービスを現在のゾーンに追加

firewall-cmd --remove-service=サービス名
現在のゾーンからサービスを取り除く


zoneについて

どのインタフェースがどの場所(zone)に繋がっているかを示す。/etc/sysconfig/network-scripts/ifcfg-%インタフェース% の"ZONE="の項目で適用されるzoneの変更がかかる。

zone

public:デフォルトで使用されるルールwork会社のネットワークで想定されるルール (信頼できるネットワーク用)
home:家庭内での利用を想定したルール (workより緩い)
internal:内側のインタフェース用
external:外側のインタフェース用
dmz:DMZのインタフェース用block送信の戻りパケットだけを許可して、受信パケットを全て拒否するルールdrop送信の戻りパケットだけを許可して、受信パケットを全て破棄するルール
trusted:全ての通信を許可するルール

zoneの確認例

#デフォルト設定のゾーン確認
firewall-cmd --get-default-zone

#現在のアクティブゾーンを確認
firewall-cmd --get-active-zones

#すべてのゾーン確認
firewall-cmd --list-all-zones

#デフォルトのゾーン変更
#/etc/firewalld/firewalld.confファイルの「DefaultZone=trusted」箇所を変更している
firewall-cmd --set-default-zone=trusted

#インターフェース(NIC)のゾーン変更
firewall-cmd --zone=trusted --change-interface=enp0s3


その他の設定例

ZONEのtargetを変更する

firewall-cmd --zone=public --set-target=DROP --permanent
firewall-cmd --reload
#「--set-target=」は「DROP」、「REJECT」、「ACCEPT」と大文字を指定

ゾーンへのサービス許可と削除

firewall-cmd --zone=public --add-service=http
firewall-cmd --zone=public --remove-service=http


特定IPからの指定ポートだけを許可(解除)

firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.11.6" port protocol="tcp" port="80" accept"
firewall-cmd --zone=public --remove-rich-rule="rule family="ipv4" source address="192.168.11.6" port protocol="tcp" port="80" accept"

特定IPからの指定ポートだけを拒否

firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.11.6" port protocol="tcp" port="80" drop"

accept:この通信を許可する
drop: この通信を拒否し、何も返さない
reject:この通信を拒否し、ICMPメッセージを返す


特定IPからのアクセスをすべて拒否

192.168.3.1からのすべてのアクセスを拒否

firewall-cmd --zone=drop --add-source=192.168.3.1
firewall-cmd --zone=drop --list-all  # 確認


iptable

IP パケットフィルタルールのテーブルを 設定・管理・検査するために使われる。


iptablesの書式

iptables 〈テーブル〉〈コマンド〉 〈マッチ〉〈ターゲット〉

# 設定例
iptables -t filter -A INPUT -p tcp -j ACCEPT

# デフォルトとしてfilterテーブルが省略される。
iptables -A INPUT -p tcp -j ACCEPT
# は同じである。

主なテーブルとコマンド

テーブル

  • filter:一般的なフィルタテーブル

  • nat:ネットワークアドレス変換に使われる

  • mangle:Quality of Serviceなどが設定可能。

コマンド

  • -F 何も指定されてない場合すべてのフィルタルールを削除する。

  • -X 何も指定されてない場合デフォルト以外のすべてのチェインを削除する。

  • -A ルールの追加

  • -D ルールの削除

  • -P ポリシーの指定

そのほかパラメータ

  • -s パケットの送信元

  • -d パケットの送信先

  • -p パケットのプロトコル指定
    --sportSource Port。送信側のポート番号を指定。
    --dportDestination Port。受信側のポート番号を指定。-p tcp か -p udp の後に指定する。

  • -i 入ってくるインターフェイス指定 eth0など

  • -o 出てゆくインターフェイス指定

  • -j ターゲットの指定

チェイン

  • INPUT 入ってくるパケットに関して

  • OUTPUT 出てゆくパケットに関して

  • FORWARD パケットの転送

  • PREROUTING 受信時にアドレスを変換

  • POSTROUTING 送信時にアドレスを変換

ターゲット

  • ACCEPT パケットを許可

  • DROP パケットを拒否

  • REJECT パケットを拒否して制御メッセージを送信

  • LOG パケットのログを記録

  • REDIRECT:特定ポートにリダイレクト


設定例

この設定内容を/etc/sysconfig/ の下にiptables というファイル名で保存することもできる。

# 設定をクリア
iptables -F
iptables -X

# ポリシー設定
iptables -P INPUT   DROP
iptables -P FORWARD DROP
iptables -P OUTPUT  ACCEPT

# (2) ループバック(自分自身からの通信)を許可する
iptables -A INPUT -i lo -j ACCEPT

# (3) データを持たないパケットの接続を破棄する
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

# (4) SYNflood攻撃と思われる接続を破棄する
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

# (5) ステルススキャンと思われる接続を破棄する
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

# (6) icmp(ping)の設定
# hashlimitを使う
# -m hashlimit                   hashlimitモジュールを使用する
# —hashlimit-name t_icmp  記録するファイル名
# —hashlimit 1/m               リミット時には1分間に1パケットを上限とする
# —hashlimit-burst 10        規定時間内に10パケット受信すればリミットを有効にする
# —hashlimit-mode srcip    ソースIPを元にアクセスを制限する
# —hashlimit-htable-expire 120000   リミットの有効期間。単位はms
iptables -A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit-name t_icmp --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT

# (7) 確立済みの通信は、ポート番号に関係なく許可する
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

# (8) DNSアクセスの戻りパケットを受け付ける
iptables -A INPUT -p udp --sport 53 -j ACCEPT

# (9) SSHを許可する設定
# hashlimitを使う
# -m hashlimit                   hashlimitモジュールを使用する
# —hashlimit-name t_sshd 記録するファイル名
# —hashlimit 1/m              リミット時には1分間に1パケットを上限とする
# —hashlimit-burst 10       規定時間内に10パケット受信すればリミットを有効にする
# —hashlimit-mode srcip   ソースIPを元にアクセスを制限する
# —hashlimit-htable-expire 120000   リミットの有効期間。単位はms
iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m hashlimit --hashlimit-name t_sshd --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT

# (10) 個別に許可するプロトコルとポートをここに書き込む。
# この例では、HTTP(TCP 80)とHTTPS(TCP 443)を許可している。
iptables -A INPUT -p tcp --dport 80   -j ACCEPT
iptables -A INPUT -p tcp --dport 443  -j ACCEPT

# ポート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


この記事が参加している募集

この経験に学べ

よろしければサポートお願いします!よりいい情報を発信します。