Linuxファイアウォールの分析(iptables)

序文

ファイアウォールの存在にはサーバーのセキュリティが関係しますが、実際の作業でファイアウォールをオフにすることが多いのはなぜですか?
まず、ソフトウェアレベルのファイアウォールにはスループットの上限があります。ファイアウォールはサーバー上のファイルを構成する必要があるため、これはシステムのメモリを占有し、パフォーマンスの浪費を引き起こします。したがって、ソフトウェアレベルのファイアウォールは徐々にハードウェアレベルのファイアウォールに置き換えられています。しかし、存在は合理的であり、ソフトウェアレベルのファイアウォールについてもある程度理解する必要があります。


1つは、iptablesの概要です

  • Linuxシステムファイアウォール:IP情報パケットフィルタリングシステム。実際には、netfilterとiptablesの2つのコンポーネントで構成されています。
  • 主にネットワーク層で作業し、IPデータパケットを目指します。パケット内のIPアドレスやポートなどの情報の処理に反映されます。

第二に、netfilter / iptables間の関係

  • netfilter:「カーネルスペース」(カーネルスペース、カーネルスペースとも呼ばれます)に属するファイアウォール機能システム。はいカーネルの一部、いくつかのパケットフィルタリングテーブルで構成されます。これらのテーブルには、カーネルがパケットフィルタリング処理を制御するために使用する一連のルールが含まれています。
  • iptables:「ユーザースペース」(ユーザースペース、ユーザースペースとも呼ばれます)に属するファイアウォール管理システム。これは、Linuxファイアウォールを管理するために使用されるコマンドプログラムであり、パケットフィルタリングテーブルのルールを簡単に挿入、変更、および削除できます。通常、== / sbin / iptables ==ディレクトリにあります。
  • netfilter / iptables postiptablesと呼ばれますiptablesは、組み込みのカーネルベースのファイアウォールです。生、マングル、ナット、フィルター4つのルールテーブル。テーブル内のすべてのルールが構成されると、サービスを再起動せずにすぐに有効になります。

3、4つの時計と5つのチェーン

ルールテーブルの役割:さまざまなルールチェーンに対応するルールチェーン
の役割:さまざまなファイアウォールルールに対応する
(テーブルにはチェーンがあり、チェーンにはルールがあります)
ここに写真の説明を挿入

3.14つのテーブル

  • rawテーブル:パケットのステータスを追跡するかどうかを決定します。2つのルールチェーン(OUTPUT、PREROUTING)が含まれています
  • マングルテーブル:トラフィックシェーピングに使用されるデータパケットの内容を変更し、データパケットにマークを設定します。5つのルールチェーン(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING)が含まれています
  • natテーブル:ネットワークアドレス変換を担当し、データパケットの送信元および宛先IPアドレスまたはポートを変更するために使用されます。3つのルールチェーン(OUTPUT、PREROUTING、POSTROUTING)が含まれています
  • フィルタテーブル:データパケットのフィルタリングと、データパケットを渡すかどうかの決定(フィルタリング)を担当します。3つのルールチェーン(INPUT、FORWARD、OUTPUT)が含まれています
    iptablesの4つのルールテーブルの中で、mangleテーブルとrawテーブルは比較的使用されていません)。

3.25つのチェーン

  • 入力:着信データパケットを処理し、ターゲットIPのデータパケットをこのマシンに一致させます。
  • 出力:アウトバウンドデータパケットを処理し、通常、このチェーンでは構成しないでください
  • 転送:データパケットを処理および転送し、マシンを流れるデータパケットを照合します。
  • PREROUTINGチェーン:ルーティングする前にデータパケットを処理し、宛先アドレスを変更するDNATに使用これは、内部ネットワークサーバーのIPとポートをルーターの外部IPとポートにマッピングすることと同じです。
  • POSTROUTINGチェーン:選択をルーティングした後にデータパケットを処理します送信元アドレスを変更するSNATを行うために使用されますこれは、ルーターNAT変換機能を介した内部ネットワークと同等であり、パブリックIPアドレスを介して内部ネットワークホストを実現してオンラインにします。

3.3パケットがファイアウォールに到着すると、ルールテーブル間の優先順位

raw> mangle> nat>フィルター
図:
ここに写真の説明を挿入

3.4ルールチェーン間の一致順序

ホストベースのファイアウォール:

  • インバウンドデータ(外部からのデータパケット、宛先アドレスはファイアウォールネイティブ):PREROUTING> INPUT>ネイティブアプリケーション-
    アウトバウンドデータ(ファイアウォールネイティブから外部アドレスに送信されるデータパケット):ネイティブアプリケーションプログラム>出力> POSTROUTING
    ネットワークファイアウォール:-
    データの転送(ファイアウォールを介して転送する必要のあるデータパケット):PREROUTING> FORWARD> POSTROUTING

3.5ルールチェーン内の一致順序

  • 上から下に順番にチェックし、一致するルールが見つかったら停止します(関連するログを記録することを意味するLOGポリシーを除く)
  • チェーン内に一致するルールが見つからない場合、チェーンのデフォルトポリシーに従って処理されます(変更なし、デフォルトポリシーが許可されます)

第四に、iptablesのインストール

Centos 7はデフォルトでfirewalldファイアウォールを使用します。iptablesファイアウォールを使用する場合、iptablesはインストールされません。する必要がある最初にfirewalldファイアウォールをオフにします、次にiptablesをインストールします

systemctl stop firewalld.service                #关闭防火墙
systemctl disable firewalld.service          
yum -y install iptables iptables-services       #安装iptables工具及服务
systemctl start iptables.service                #开启服务

5つのiptablesコマンド構成

コマンド形式:
iptables [-tテーブル名]管理オプション[チェーン名] [一致条件] [-j制御タイプ]

予防:

  • テーブル名が指定されていない場合、デフォルトでフィルターテーブルを参照します
  • チェーン名が指定されていない場合、デフォルトでテーブル内のすべてのチェーンを参照します
  • チェーンのデフォルトポリシーが設定されていない限り、一致条件を指定する必要があります
  • オプション、チェーン名、およびコントロールタイプには大文字を使用し、残りは小文字にします

一般的に使用されるコントロールタイプ:

  • ACCEPT:データパケットの通過を許可します
  • ドロップ:応答情報を提供せずにデータパケットを直接ドロップします
  • 拒否:通過するデータパケットを拒否します。応答メッセージがデータ送信者に送信されます
  • SNAT:パケットの送信元アドレスを変更します
  • DNAT:データパケットの宛先アドレスを変更します
  • MASQUERADE:固定されていないパブリックIPアドレスを装った
  • LOG:ログ情報を/ var / 1og / messagesファイルに記録してから、データパケットを次のルールに渡します。LOGは単なる補助アクションであり、実際にはデータパケットを処理しません。

一般的な管理オプション:

  • -A:指定されたチェーンの最後に新しいルールを追加(–append)します
  • -I:指定されたチェーンの先頭に新しいルールを挿入(–挿入)します。シーケンス番号が指定されていない場合、デフォルトで最初のルールになります。
  • -R:変更、置換(–replace)チェーン内のルールを指定し、ルール番号または特定のコンテンツを指定できます
  • -P:指定したチェーンのデフォルトポリシーを設定します(–policy)
  • -D:指定されたチェーン内のルールを削除(–delete)します。ルール番号または特定のコンテンツを指定できます
  • -F:指定されたチェーン内のすべてのルールをフラッシュ(-flush)します。チェーン名が指定されていない場合、テーブル内のすべてのチェーンがクリアされます。
  • -L:指定されたチェーン内のすべてのルールを一覧表示(–list)します。チェーン名が指定されていない場合は、テーブル内のすべてのチェーンが一覧表示されます。
  • -n:数値形式(–numeric)を使用して、ホスト名の代わりにIPアドレスを表示するなどの出力結果を表示します
  • -v:各ルールの一致したパケット数や一致したバイト数などの詳細情報を表示します
  • -行番号:ルールを表示するときに、ルールのシーケンス番号を表示します
添加新的规则:
iptables -t filter -A INPUT -p icmp -j REJECT
iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT 

查看规则列表:
iptables [-t 表名] -n -L [链名] [--line-numbers]     #注意:不可以合写为-Ln
iptables - [vn]L 

iptables -n -L --line-numbers

设置默认策略:
iptables [-t 表名] -p <链名> <控制类型>

iptables -p INPUT DROP
iptables -p FORWARD DROP                            #一般在生产环境中设置网络型防火墙、主机型防火墙时都要设置默认规则为DROP,并设置白名单
删除规则:
iptables -D INPUT 2
iptables -t filter -D INPUT -p icmp -j REJECT

注意:

ルールリストに同一のルールが複数ある場合、コンテンツの一致に応じて、シーケンス番号が最も小さいルールのみが削除されます。

  • 番号の一致で削除する場合は、ルール番号が既存のルールの数以下であることを確認してください。そうでない場合、エラーが報告されます。
  • コンテンツの一致によって番号を削除するときは、ルールが存在することを確認してください。存在しない場合、エラーが報告されます
清空规则:
iptables [-t 表名] -F [链名]

iptables -F INPUT
iptables -F

注意:

  • -Fはチェーン内のルールをクリアするだけで、手動で変更する必要がある-Pによって設定されたデフォルトのルールには影響しません。
  • -P DROPを設定した後、-Fを慎重に使用してください。
    (#リモート接続を許可する関連ルールをクリアした後、ホストのリモート接続を接続できないようにします。この場合、ルールが保存されていない場合は、ホストを再起動して解決できます)
  • テーブル名とチェーン名を書き込まない場合、フィルターテーブル内のすべてのチェーンのすべてのルールがデフォルトでクリアされます

6、ルールのマッチング

6.1一般的なマッチング

直接使用でき、ネットワークプロトコル、IPアドレス、ネットワークインターフェイス、その他の条件を含む他の条件や拡張機能に依存しません

协议匹配:-p 协议名
地址匹配:-s 源地址、-d 目的地址      #可以是IP、网段、域名、空(任何地址)
接口匹配:-i 入站网卡、-o 出站网卡

iptables -A FORWARD ! -p icmp -j ACCEPT
iptables -A INPUT -s 192.168.80.11 -j DROP
iptables -I INPUT -i ens33 -s 192.168.80.0/24 -j DROP

6.2暗黙のマッチング

ポート、TCPタグ、ICMPタイプなどの条件を含む、特定のプロトコルマッチングを前提条件として要求します。

端口匹配: --sport 源端口、--dport 目的端口
#可以是个别端口、端口范围
--sport 1000          匹配源端口是1000的数据包
--sport 1000: 3000    匹配源端口是1000-3000的数据包
--sport : 3000        匹配源端口是3000及以下的数据包
--sport 1000:         匹配源端口是1000及以上的数据包
注意: --sport 和--dport 必须配合-p <协议类型>使用

iptables -A INPUT -P tcp --dport 20:21 -j ACCEPT
iptables -I FORWARD -d 192.168.80.0/24 -p tcp --dport 24500:24600 -j DROP

TCP标记匹配: --tcp-flags TCP标记
iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN, RST,ACK SYN -j ACCEPT       #丢弃SYN请求包,放行其他包

ICMP类型匹配:--icmp-type ICMP类型              #可以是字符串、数字代码、、目标不可达
"Echo-Request" (代码为8)表示请求    
"Echo-Reply” (代码为0)表示回显
"Destination-Unreachable" (代码为3)表示目标不可达
关于其它可用的ICMP 协议类型,可以执行"iptables -p icmp -h”命令,查看帮助信息

iptables -A INPUT -p icmp --icmp-type 8 - j DROP             #禁止其它主机ping本机
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT            #允许本机ping其它主机

iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT            #当本机ping不通其它主机时提示目标不可达
                                                             #此时其它主机需要配置关于icmp协议的控制类型为REJECT
iptables -A INPU

6.3明示的なマッチング

マルチポート、MACアドレス、IP範囲、パケットステータスなどの条件を含め、「-m拡張モジュール」の形式でタイプを明確に示す必要があります。

多端口匹配:-m multiport --sports 源端口列表
          -m multiport --dports 目的端口列表
          
iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT

IP范围匹配: -m iprange --src-range IP范围
iptables -A FORWARD -p udp -m iprange --src-range 192.168.80.100-192.168.80.200 -j DROP
#禁止转发源地址位于192.168.80.100-192.168.80.200的udp数据包

MAC地址匹配:-m mac --mac-source MAC地址
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
#禁止来自某MAC地址的数据包通过本机转发

状态匹配: -m state --state连接状态
常见的连接状态:
NEW :与任何连接无关的,还没开始连接
ESTABLISHED:响应请求或者已建立连接的,连接态
RELATED:与已有连接有相关性的(如FTP主被动模式的数据连接),衍生态,一般与ESTABLISHED配合使用
INVALID:不能被识别属于哪个连接或没有任何状态

iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
#禁止转发与正常TCP连接无关的非--syn请求数据包(如伪造的网络攻击数据包)

设置主机型防火墙的通用配置:
iptables -I INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
iptables -I INPUT -p tcp -m state --state ESTABLISHED, RELATED -j ACCEPT
iptables -P INPUT DROP

セブン、SNAT

7.1SNAT関連の知識

SNATの原則:データパケットの送信元アドレスを変更します。
SNATアプリケーション環境:LANホストは、インターネットにアクセスするために単一のパブリックIPアドレスを共有します(プライベート1Pはインターネットで通常ルーティングできません)
SNAT変換の前提条件

  • LAN内の各ホストのIPアドレス、サブネットマスク、およびデフォルトのゲートウェイアドレスが正しく設定されている
  • LinuxゲートウェイはIPルーティングと転送を可能にします

7.2SNATを一時的にオンにする

echo 1> /proc/sys/net/ipv4/ip_forward
sysctl -w net.ipv4.ip_forward=1

7.3SNATを永続的に開く

vim /etc/sysctl.conf
net.ipv4.ip_forward =1      #将此行写入配置文件

sysctl -p                   #读取修改后的配置

7.4SNAT翻訳

SNAT変換1:固定パブリックIPアドレス

iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens33 -j SNAT --to 12.0.0.1
或
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens33 -j SNAT --to-source 12.0.0.1-12.0.0.10
                                      内网IP      出站 外网网卡                      外网IP或地址池

SNAT変換2:固定されていないパブリックネットワークガードのPアドレス(動的IPアドレスの共有)

iptables-t nat -A POSTROUTING -s 192.168.80.0/24 -o ens33 -j MASQUERADE

小規模な知識の拡張:IPアドレスのSNAT変換により、通常、イントラネット上の100〜200のホストがインターネットにアクセスできるようになります。

8. DNAT

8.1DNAT関連の知識

DNATの原則:データパケットの宛先アドレスを変更します
。DNAT変換の前提条件

  • LANサーバーはインターネットにアクセスできます
  • ゲートウェイの外部ネットワークアドレスには、正しいDNS解決レコードがあります
  • LinuxはIPルーティングと転送をオフにします
vim /etc/sysctl.conf
net.ipv4.ip_forward =1

sysctl –p

8.2DNAT変換

DNAT変換1:イントラネットWebサービスを公開する

把从ens33进来的要访问web服务的数据包目的地址转换为192.168.80.11
iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.80.11
或
iptables -t nat -A PREROUTING -i ens33-d 12.0.0.1 -p tcp --dport 80 -j DNAT--to-destination 192.168.80.11
	                         入站 外网网卡  外网IP                                              内网服务器IP

iptables -t nat -A PREROUTING -i ens33 -p tcp--dport 80 -j DNAT --to 192.168.80.11-192.168.80.20	                         

DNAT変換2:公開時にターゲットポートを変更する

#发布局域网内部的OpenssH服务器,外网主机需使用250端口进行连接
iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 250 -j DNAT --to 192.168.80.11:22

#在外网环境中使用SSH测试
ssh -p 250 [email protected]

#在外网环境中使用SSH测试
ssh -p 250 [email protected]
yum -y install net-tools        #若没有ifconfig命令可提前使用yum进行安装
ifconfig ens33

注意:使用DNAT时,同时还有配合SNAT使用,才能实现响应数据包的正确返回

小さな知識の拡張:
ホストベースのファイアウォールは主にINPUTチェーンとOUTPUTチェーンを使用します。通常、ルールを設定するときにポートを詳細に指定する必要があります。
ネットワークベースのファイアウォールは主にFORWARDチェーンを使用します。ルールを設定するときにポートを指定することはめったにありませんが、通常はIPアドレスまたはインターネットを指定します。セクション

9、ファイアウォールルールのバックアップと復元

すべてのテーブルをバックアップ(エクスポート)するためのルール

iptables-save > /opt/ipt.txt

ルールの復元(インポート)

iptables-restore < /opt/ipt.txt

iptablesルールファイルを/ etc / sysconfig / iptablesに保存します。ルールは、iptablesサービスの開始時に自動的に復元されます。

iptables-save > /etc/sysconfig/iptables
systemctl stop iptables   #停止iptables服务会清空掉所有表的规则
systemctl start iptables  #启动iptables服务会自动还原/etc/sysconfig/iptables中的规则

おすすめ

転載: blog.csdn.net/weixin_51613313/article/details/111867508