iptables
Linux で一般的に使用されるファイアウォール ソフトウェアは、
Linux コマンド オンライン ツールを推奨しています: linux コマンド オンライン クエリ ツール
補足事項
iptables コマンドは、 Linux で一般的に使用されるファイアウォール ソフトウェアであり、netfilter プロジェクトの一部です。直接、または多数のフロントエンドとグラフィカル インターフェイスを介して構成できます。
文法
iptables(选项)(参数)
オプション
-t, --table table 对指定的表 table 进行操作, table 必须是 raw, nat,filter,mangle 中的一个。如果不指定此选项,默认的是 filter 表。
# 通用匹配:源地址目标地址的匹配
-p:指定要匹配的数据包协议类型;
-s, --source [!] address[/mask] :把指定的一个/一组地址作为源地址,按此规则进行过滤。当后面没有 mask 时,address 是一个地址,比如:192.168.1.1;当 mask 指定时,可以表示一组范围内的地址,比如:192.168.1.0/255.255.255.0。
-d, --destination [!] address[/mask] :地址格式同上,但这里是指定地址为目的地址,按此进行过滤。
-i, --in-interface [!] <网络接口name> :指定数据包的来自来自网络接口,比如最常见的 eth0 。注意:它只对 INPUT,FORWARD,PREROUTING 这三个链起作用。如果没有指定此选项, 说明可以来自任何一个网络接口。同前面类似,"!" 表示取反。
-o, --out-interface [!] <网络接口name> :指定数据包出去的网络接口。只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用。
# 查看管理命令
-L, --list [chain] 列出链 chain 上面的所有规则,如果没有指定链,列出表上所有链的所有规则。
# 规则管理命令
-A, --append chain rule-specification 在指定链 chain 的末尾插入指定的规则,也就是说,这条规则会被放到最后,最后才会被执行。规则是由后面的匹配来指定。
-I, --insert chain [rulenum] rule-specification 在链 chain 中的指定位置插入一条或多条规则。如果指定的规则号是1,则在链的头部插入。这也是默认的情况,如果没有指定规则号。
-D, --delete chain rule-specification -D, --delete chain rulenum 在指定的链 chain 中删除一个或多个指定规则。
-R num:Replays替换/修改第几条规则
# 链管理命令(这都是立即生效的)
-P, --policy chain target :为指定的链 chain 设置策略 target。注意,只有内置的链才允许有策略,用户自定义的是不允许的。
-F, --flush [chain] 清空指定链 chain 上面的所有规则。如果没有指定链,清空该表上所有链的所有规则。
-N, --new-chain chain 用指定的名字创建一个新的链。
-X, --delete-chain [chain] :删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链。
-E, --rename-chain old-chain new-chain :用指定的新名字去重命名指定的链。这并不会对链内部造成任何影响。
-Z, --zero [chain] :把指定链,或者表中的所有链上的所有计数器清零。
-j, --jump target <指定目标> :即满足某条件时该执行什么样的动作。target 可以是内置的目标,比如 ACCEPT,也可以是用户自定义的链。
-h:显示帮助信息;
基本パラメータ
パラメータ | 効果 |
---|---|
-P | デフォルトのポリシーを設定します: iptables -P INPUT (DROP |
-F | ルールチェーンをクリア |
-L | ルールチェーンを表示 |
-A | ルール チェーンの最後に新しいルールを追加する |
-私 | num ルールチェーンの先頭に新しいルールを追加します |
-D | num ルールを削除する |
-s | 送信元アドレス IP/MASK を照合し、感嘆符「!」を追加すると、この IP が除外されることを示します。 |
-d | 一致するターゲット アドレス |
-私 | ネットワーク カード名は、このネットワーク カードから流れるデータと一致します |
-o | ネットワーク カード名は、このネットワーク カードから流れるデータと一致します |
-p | tcp、udp、icmp などの一致するプロトコル |
–dポート番号 | 宛先ポート番号の一致 |
–スポーツ番号 | 送信元ポート番号を一致させる |
コマンドオプションの入力順
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
働くメカニズム
ルール チェーン名には次のものが含まれます (5 つのフック関数とも呼ばれます)。
- INPUT chain : 入力パケットを処理します。
- OUTPUT chain : 出力パケットを処理します。
- FORWARD chain : 転送パケットを処理します。
- PREROUTING chain : 宛先アドレス変換 (DNAT) に使用されます。
- POSTOUTING チェーン: ソース アドレス変換 (SNAT) に使用されます。
ファイアウォール ポリシー
ファイアウォールポリシーは一般に2つのタイプに分けられます.1つは通
ポリシーと呼ばれ、もう1つは堵
ポリシーと呼ばれ、ポリシーを介して、デフォルトのドアが閉じられ、誰が入ることができるかを定義する必要があります. ブロック戦略は、ドアは開いていますが、身元認証が必要であり、そうでない場合は入ることができません. したがって、定義する必要があります。何が入ってくるか、何が出るか、です所以通,是要全通,而堵,则是要选择
。ポリシーを定義する場合、複数の機能を個別に定義する必要があります。その中には、データ パケットで許可または許可されないポリシーを定義する、フィルタ フィルタリングの機能、およびアドレス変換を定義する機能が nat オプションです。これらの機能を交互に動作させるために、さまざまな作業機能や処理方法を定義・区別する「テーブル」の定義を定式化しました。
複数の関数を比較するために、次の 3 つの関数を使用します。
- フィルターは許可するかどうかを定義し、INPUT、FORWARD、OUTPUT の 3 つのチェーンでのみ実行できます。
- Nat はアドレス変換を定義します。これは、PREROUTING、OUTPUT、POSTROUTING の 3 つのチェーンでのみ実行できます。
- マングル機能: メッセージの元のデータを変更します。これは、5 つのチェーンで行うことができます: PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
メッセージの元のデータを変更して、TTL を変更します。データ パケットのメタデータを逆アセンブルし、内部のコンテンツをマーク/変更することができます。ファイアウォールのマークは、実際には mangle によって実現されています。
小さな拡張:
- フィルターの場合、通常、INPUT、FORWARD、OUTPUT の 3 つのチェーンのみを使用できます。
- nat の場合、PREROUTING、OUTPUT、POSTROUTING の 3 つのチェーンでのみ実行できます。
- mangle は、PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING の 5 つのチェーンを実行できます。
iptables/netfilter (このソフトウェア) はユーザー空間で動作し、ルールを有効にすることができます。それ自体はサービスではなく、ルールはすぐに有効になります。そして、私たちの iptables は、開始および停止できるサービスになりました。開始された場合、ルールは直接有効になり、停止された場合、ルールは取り消されます。
iptables は、自己定義チェーンもサポートしています。ただし、定義するチェーンは特定のチェーンに関連付ける必要があります。レベル設定では、データがある場合に特定のチェーンに移動して処理し、そのチェーンの処理後に戻ることを指定します。次に、特定のチェーンのチェックを続けます。
注: ルールの順序は非常に重要であり、谁的规则越严格,应该放的越靠前
ルールをチェックするときは上から下にチェックされます。
テーブル名は次のとおりです。
- raw : URL フィルタリングなどの高度な機能。
- mangle : サービスの品質を実装するために使用されるパケット変更 (QOS)。
- nat : ゲートウェイ ルーターに使用されるアドレス変換。
- filter : ファイアウォール ルールに使用されるパケット フィルタリング。
アクションは次のとおりです。
- ACCEPT : パケットを受信します。
- DROP : パケットをドロップします。
- REDIRECT : リダイレクト、マッピング、透過プロキシ。
- SNAT : ソース アドレス変換。
- DNAT : 宛先アドレス変換。
- MASQUERADE : ADSL に使用される IP マスカレード (NAT)。
- LOG : ログ記録。
- SEMARK : ドメイン内の必須アクセス制御 (MAC) 用に SEMARK マークを追加します。
┏╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍┓
┌───────────────┐ ┃ Network ┃
│ table: filter │ ┗━━━━━━━┳━━━━━━━┛
│ chain: INPUT │◀────┐ │
└───────┬───────┘ │ ▼
│ │ ┌───────────────────┐
┌ ▼ ┐ │ │ table: nat │
│local process│ │ │ chain: PREROUTING │
└ ┘ │ └─────────┬─────────┘
│ │ │
▼ │ ▼ ┌─────────────────┐
┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ │ ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ │table: nat │
Routing decision └───── outing decision ─────▶│chain: PREROUTING│
┅┅┅┅┅┅┅┅┅┳┅┅┅┅┅┅┅┅┅ ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ └────────┬────────┘
│ │
▼ │
┌───────────────┐ │
│ table: nat │ ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ │
│ chain: OUTPUT │ ┌─────▶ outing decision ◀──────────────┘
└───────┬───────┘ │ ┅┅┅┅┅┅┅┅┳┅┅┅┅┅┅┅┅
│ │ │
▼ │ ▼
┌───────────────┐ │ ┌────────────────────┐
│ table: filter │ │ │ chain: POSTROUTING │
│ chain: OUTPUT ├────┘ └──────────┬─────────┘
└───────────────┘ │
▼
┏╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍┓
┃ Network ┃
┗━━━━━━━━━━━━━━━┛
例
現在のルールとカウントをすべてクリアする
iptables -F # 清空所有的防火墙规则
iptables -X # 删除用户自定义的空链
iptables -Z # 清空计数
ssh ポート接続を許可するように構成する
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
# 22为你的ssh端口, -s 192.168.1.0/24表示允许这个网段的机器来连接,其它网段的ip地址是登陆不了你的机器的。 -j ACCEPT表示接受这样的请求
ローカル ループバック アドレスを正常に使用できるようにする
iptables -A INPUT -i lo -j ACCEPT
#本地圆环地址就是那个127.0.0.1,是本机上使用的,它进与出都设置为允许
iptables -A OUTPUT -o lo -j ACCEPT
デフォルトのルールを設定する
iptables -P INPUT DROP # 配置默认的不让进
iptables -P FORWARD DROP # 默认的不允许转发
iptables -P OUTPUT ACCEPT # 默认的可以出去
ホワイトリストの構成
iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允许机房内网机器可以访问
iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT # 允许机房内网机器可以访问
iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允许183.121.3.7访问本机的3380端口
対応するサービス ポートを開きます
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 开启80端口,因为web对外都是这个端口
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT # 允许被ping
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已经建立的连接得让它进来
ルールを構成ファイルに保存する
cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改动之前先备份,请保持这一优秀的习惯
iptables-save > /etc/sysconfig/iptables
cat /etc/sysconfig/iptables
決められたルールを列挙する
iptables -L [-t テーブル名] [チェーン名]
- 4 つのテーブル名
raw
、nat
、filter
、mangle
- 5 つのルール チェーン名
INPUT
、OUTPUT
、FORWARD
、PREROUTING
、POSTROUTING
- フィルタ テーブルには
INPUT
、OUTPUT
、FORWARD
3 つのルール チェーンが含まれています
iptables -L -t nat # 列出 nat 上面的所有规则
# ^ -t 参数指定,必须是 raw, nat,filter,mangle 中的一个
iptables -L -t nat --line-numbers # 规则带编号
iptables -L INPUT
iptables -L -nv # 查看,这个列表看起来更详细
既存のルールをクリアする
iptables -F INPUT # 清空指定链 INPUT 上面的所有规则
iptables -X INPUT # 删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。
# 如果没有指定链名,则会删除该表中所有非内置的链。
iptables -Z INPUT # 把指定链,或者表中的所有链上的所有计数器清零。
追加されたルールを削除
# 添加一条规则
iptables -A INPUT -s 192.168.1.5 -j DROP
すべての iptables をシーケンス番号とともに表示するには、次を実行します。
iptables -L -n --line-numbers
たとえば、INPUT で通し番号が 8 のルールを削除するには、次のように実行します。
iptables -D INPUT 8
指定したポートを開く
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行
iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允许ftp服务的21端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT #允许FTP服务的20端口
iptables -A INPUT -j reject #禁止其他未允许的规则访问
iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问
シールドIP
iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP # 屏蔽恶意主机(比如,192.168.0.8
iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令是
パケットの送信元のネットワーク インターフェイスを指定します
OUTPUT、FORWARD、POSTROUTING の 3 つのチェーンでのみ機能します。
iptables -A FORWARD -o eth0
追加されたルールを表示
iptables -L -n -v
Chain INPUT (policy DROP 48106 packets, 2690K bytes)
pkts bytes target prot opt in out source destination
5075 589K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
191K 90M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
1499K 133M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
4364K 6351M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
6256 327K ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes)
pkts bytes target prot opt in out source destination
5075 589K ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
ネットワーク転送ルールを開始する
パブリック ネットワークにより、210.14.67.7
イントラネットはインターネット192.168.188.0/24
にアクセスできます
iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127
ポート マッピング
このマシンのポート 2222 は、イントラネット仮想マシンのポート 22 にマップされています
iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222 -j DNAT --to-dest 192.168.188.115:22
文字列一致
たとえば、TCP 接続のすべての文字列をフィルタリングしtest
、表示されたら接続を終了する場合は、次のようにします。
iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset
iptables -L
# Chain INPUT (policy ACCEPT)
# target prot opt source destination
# REJECT tcp -- anywhere anywhere STRING match "test" ALGO name kmp TO 65535 reject-with tcp-reset
#
# Chain FORWARD (policy ACCEPT)
# target prot opt source destination
#
# Chain OUTPUT (policy ACCEPT)
# target prot opt source destination
Windows ワーム攻撃の阻止
iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe"
SYN フラッド攻撃を防ぐ
iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT
SECMARK レコードを追加
iptables -t mangle -A INPUT -p tcp --src 192.168.1.2 --dport 443 -j SECMARK --selctx system_u:object_r:myauth_packet_t
# 向从 192.168.1.2:443 以TCP方式发出到本机的包添加MAC安全上下文 system_u:object_r:myauth_packet_t
その他の例
iptables で強力なセキュリティ シールドを構築する http://www.imooc.com/learn/389
iptables: Linux でのアプリケーション層ファイアウォール ツール
iptables 5 チェーン: フック ポイントに対応
netfilter: Linux オペレーティング システムのコア層内のデータ パケット処理モジュール
フック ポイント: netfilter 内のデータ パケットのマウント ポイント。PRE_ROUTING / INPUT / OUTPUT / FORWARD / POST_ROUTING
iptables & netfilter
[外部リンク 画像の転送に失敗しました。ソース サイトにはアンチ リーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-stZEWRWs-1682768669213)(http://7xq89b.com1.z0. glb.clouddn.com/netfilter&iptables.jpg)]
iptables 4 table 5 links
[外部リンク 画像の転送に失敗しました。ソース サイトにはアンチ リーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-7l0oglDb-1682768669214) (http://7xq89b.com1. z0.glb.clouddn.com/iptables-data-stream.jpg)]
iptables ルール
[外部リンクの画像転送に失敗しました。ソース サイトにはアンチ リーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-28PmmPJe-1682768669214)(http://7xq89b.com1.z0.glb .clouddn.com/iptables -rules.jpg)]
- 4テーブル
filter : アクセス制御 / ルール マッチング
nat : アドレス転送
mangle / raw
- ルール
データアクセス制御:ACCEPT / DROP / REJECT
パケット書き換え(nat→アドレス変換):snat / dnat
情報記録:log
利用シーン例
- シーン 1
tcp 10-22/80 ポートを開く、
icmp を開く、
その他の許可されていないポートからのアクセスを禁止する
既存の問題: このマシンはこのマシンにアクセスできません; このマシンは他のホストにアクセスできません
- シーン 2
ftp: デフォルトのパッシブ モード (サーバーはクライアントに通知するためにランダム ポートを生成し、クライアントはこのポートにアクティブに接続してデータをプルします) vsftpd : ftp がアクティブ モードをサポートできるようにします (クライアントは
サーバーに通知するためにランダム ポートを生成し、サーバーはこのポートにアクティブに接続してデータを送信します)
- シーン 3
インターネット アクセスを許可:
web
http -> 80/tcp; https -> 443/tcp
メール
smtp -> 25/tcp; smtps -> 465/tcp
pop3 -> 110/tcp; pop3s -> 995/tcp
imap -> 143 / TCP
内部使用:
ファイル
nfs -> 123/udp
samba -> 137/138/139/445/tcp
ftp -> 20/21/tcp
リモート
ssh -> 22/tcp
sql
mysql -> 3306/tcp
oracle -> 1521/tcp
- シーン4
nat 転送
- シーン5
アンチCC攻撃
iptables -L -F -A -D # list flush append delete
# 场景一
iptables -I INPUT -p tcp --dport 80 -j ACCEPT # 允许 tcp 80 端口
iptables -I INPUT -p tcp --dport 10:22 -j ACCEPT # 允许 tcp 10-22 端口
iptables -I INPUT -p icmp -j ACCEPT # 允许 icmp
iptables -A INPUT -j REJECT # 添加一条规则, 不允许所有
# 优化场景一
iptables -I INPUT -i lo -j ACCEPT # 允许本机访问
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许访问外网
iptables -I INPUT -p tcp --dport 80 -s 10.10.188.233 -j ACCEPT # 只允许固定ip访问80
# 场景二
vi /etc/vsftpd/vsftpd.conf # 使用 vsftpd 开启 ftp 主动模式
port_enable=yes
connect_from_port_20=YES
iptables -I INPUT -p tcp --dport 21 -j ACCEPT
vi /etc/vsftpd/vsftpd.conf # 建议使用 ftp 被动模式
pasv_min_port=50000
pasv_max_port=60000
iptables -I INPUT -p tcp --dport 21 -j ACCEPT
iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT
# 还可以使用 iptables 模块追踪来自动开发对应的端口
# 场景三
iptables -I INPUT -i lo -j ACCEPT # 允许本机访问
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许访问外网
iptables -I INPUT -s 10.10.155.0/24 -j ACCEPT # 允许内网访问
iptables -I INPUT -p tcp -m multiport --dports 80,1723 -j ACCEPT # 允许端口, 80 -> http, 1723 -> vpn
iptables -A INPUT -j REJECT # 添加一条规则, 不允许所有
iptables-save # 保存设置到配置文件
# 场景四
iptables -t nat -L # 查看 nat 配置
iptables -t nat -A POST_ROUTING -s 10.10.177.0/24 -j SNAT --to 10.10.188.232 # SNAT
vi /etc/sysconfig/network # 配置网关
iptables -t nat -A POST_ROUTING -d 10.10.188.232 -p tcp --dport 80 -j DNAT --to 10.10.177.232:80 # DNAT
#场景五
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT # 限制并发连接访问数
iptables -I INPUT -m limit --limit 3/hour --limit-burst 10 -j ACCEPT # limit模块; --limit-burst 默认为5