【高度な運用保守知識】iptables ファイアウォールの詳細説明(iptables 実行プロセス + テーブルとチェーンの概要 + iptables コマンドパラメータ + 設定フィルターテーブルルール + 共有インターネットアクセス、ポートフォワーディング、IP マッピングを実現する NAT テーブル)

この記事では、iptables ファイアウォールについて紹介しますが、ファイアウォールにはハードウェア、ソフトウェア、クラウド ファイアウォールの 3 種類に大別されます。ハードウェア的には、3 層ルーティングを備えた H3C、Huawei、Cisco (Cisco)、Sangfor などの企業ネットワークの入り口に導入され、ソフトウェア的には、一般にオープンソース ソフトウェアであり、最も一般的なのは iptables (Linux カーネルに書き込まれます) と firewalld (CentOS7 で利用可能)、クラウド ファイアウォールは Alibaba Cloud ビジネスのファイアウォール セキュリティ グループなどです。

目次

用語集

iptablesの実行プロセス

NetFilter フレームワーク

Linuxサーバーデュアルネットワークカードルーター

時計とチェーン

1. フィルターテーブル

2.NATテーブル

3. マングルテーブル

環境の準備とコマンド

iptablesコマンドパラメータ

フィルターテーブルルールを構成する

1. ポート 22 へのアクセスを無効にする

編集

2. IP をブロックする、IP をブロックする

3. ネットワーク セグメント アクセスを無効にします (10.0.0.0/24 ネットワーク セグメントがポート 8888 にアクセスすることを禁止します)

4. 指定したネットワーク セグメントのみの接続を許可します (10.0.0.0 ネットワーク セグメントを許可します)。

編集

5. 複数のポートを指定する

6. ICMP タイプの一致

7. ネットワークステータス(TCP/IP接続ステータス)の照合

8. 同時実行性と速度を制限する

9. ファイアウォール ルールの保存と復元

10. フィルタテーブルの概要

企業内での利用

1.SSH接続可能

2. ローカル通信を許可するルールを設定します。

3. デフォルトのルールを設定し、ポート 80 と 443 を解放します。

NATテーブル

1. 共有インターネットアクセスを実現

2. ポートフォワーディング(ポートマッピング)

3. IPマッピング

4. NAT テーブルの概要

iptablesの簡単な演習


用語集

ファイアウォールを導入する前に、まずいくつかの用語を理解しましょう

コンテナ: 物を保管できる

チェーン収納用コンテナ

チェーン:ルールを格納するコンテナー

ポリシー: ルールを許可または拒否します

これらはロシアの入れ子人形のようなもので、お互いの中に入れ子になっています。

iptablesの実行プロセス

NetFilter フレームワーク

最下層はネットワーク インターフェイス層であり、ネットワーク インターフェイス層の上はネットワーク層であり、ネットワーク層には NetFilter (ネットワーク フィルタリング フレームワーク) が展開されます。

ネットワーク層にはTCP、UDPのトランスポート層が配置され、フィルタテーブル、NATテーブル、マングルテーブルが配置され、チェック対象の条件や動作を格納するテーブルがカーネル層、その上にユーザー層が存在するつまり、アプリケーション層で iptables コマンドを設定できます。

Linuxサーバーデュアルネットワークカードルーター

物理層とデータリンク層から、最初に PREROUTING チェーンを経由してルーティング決定に入ります。入力できる場合は、INPUT チェーンを介して TCP と UDP に入り、次にアプリケーション層に入り、TCP と UDP に戻ります。アプリケーション層から UDP を受け取り、OUTPUT チェーンを介してルーティングに入り、決定は POSTROUTING チェーンを介して物理層とデータリンク層に送信されます。

ルーティング決定を入力できない場合、ルーティング決定は FORWARD チェーンを通じて出口に送信され、その後 POSTROUTING チェーンを通じて物理層およびデータリンク層に送信されます。

時計とチェーン

iptables には 4 つのテーブルと 5 つのチェーンがあり、4 つのテーブルはフィルター テーブル、ナット テーブル、生テーブル、マングル テーブルで、5 つのチェーンは入力、プープ、フォワード、プレルーティング、ポストルーティングです。

フィルタ テーブルには、入力チェーン、出力チェーン、および順方向チェーンがあります。

NAT テーブルには、プレルーティング チェーン、出力チェーン、ポストルーティング チェーンがあります。

マングル テーブルには、プレルーティング チェーン、フォワード チェーン、入力チェーン、出力チェーン、ポストルーティング チェーンがあります。

1. フィルターテーブル

入出力トラフィックを担当し、ポート IP をブロックまたは許可します

フィルタテーブル

主にホスト自体に関連しており、実際にはホスト ファイアウォール機能 (受信および送信するホスト データ パケットのフィルタリング) を担当します。フィルターは、デフォルトで iptables によって使用されるテーブルを識別します。このテーブルは 3 つのチェーンを定義します。エンタープライズ作業シナリオ: ホスト ファイアウォール

入力 宛先アドレスがローカル アドレスであるすべてのデータ パケットのフィルタリングを担当します。平たく言えば、ホストに入るデータ パケットをフィルタリングします。
フォワード ホストを通過するデータ パケットの転送を担当します。転送の役割を果たし、NAT と密接に関連しています。特別な LVS NAT モード net.ipv4.ip_forward=0 があります。
出力 送信元アドレスがローカル アドレスであるすべてのデータ パケットを処理します。これは、平たく言えば、ホストから送信されたデータ パケットを意味します。

2.NATテーブル

デュアル ネットワーク カードは、ルーターと同様に、受信後の転送を担当し、共有インターネット アクセス (内部ネットワーク サーバーから外部ネットワークへ)、ポート マッピング、IP マッピングなどの NAT 機能を実装できます。

NAT

ネットワーク アドレス変換、つまり送信元と宛先の IP アドレスとポートの変換を担当します。

アプリケーション: ホスト自体とは関係ありませんが、通常は LAN 上の共有インターネット アクセスや特殊なポート変換サービスに使用されます。

作業シーン:

1. エンタープライズ ルーティング (zebra) またはゲートウェイ (iptables)、共有インターネット アクセス (ポストルーティング) に使用されます。

2. 内部および外部 IP アドレスの 1 対 1 マッピング (dmz)、ハードウェア ファイアウォールの IP から内部サーバーへのマッピング、ftp サービス (プレルーティング) を実行します。

3. Web、単一ポートのマッピング、ポート 80 の直接マッピング (プレルーティング) このテーブルでは 3 つのチェーンが定義されています NAT 機能は、ネットワーク スイッチの ACL と同様、ネットワークの ACL 制御に相当します。

出力 ホストから送信されるデータ パケットに関連し、ホストから送信されるデータ パケットの宛先アドレスを変更します。
プレルーティング

データパケットがファイアウォールに到達すると、ルーティング判定の前に実行されるルールに基づいて、データパケットの宛先アドレスや宛先ポートなどが変更されます。

手紙を受け取るとき、受取人のアドレスはルールに従って書き換えられます。

例: パブリック IP を LAN サーバーにマップします。Web サービスの場合は、LAN サーバーの 9000 ポートで 80 を 10.0.0.61:80 (ターゲット ポート) に変換できます ----nat---- 10.0.0.7 :22

ポストアウト

データパケットがファイアウォールから出る際にルーティング判定後に実行されるルールで、データパケットの送信元アドレスや送信元ポートなどを変更する機能です。

家族が返信するときにアドレスがわかるように、送信者のアドレスを書き留めてください。

例: デフォルトでは、ノートブックと仮想マシンには LAN アドレスが設定されていますが、ネットワークの外に出ると、送信元アドレスはルーターによってパブリック ネットワーク アドレスに変更されます。

実稼働アプリケーション: LAN 共有インターネット アクセス

3. マングルテーブル

ヘッダー情報を格納する

環境の準備とコマンド

Ansible (10.0.0.61、172.16.1.61) と Web01 (10.0.0.7、172.16.1.7) の 2 つのホストを準備します。

iptablesをインストールする

[root@Ansible ~]# yum install -y iptables-services

iptables サービスの構成ファイルを表示する

[root@Ansible ~]# rpm -ql iptables-services
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables        #防火墙的配置文件
/usr/lib/systemd/system/ip6tables.service
/usr/lib/systemd/system/iptables.service        #防火墙服务配置文件(命令)
/usr/libexec/initscripts/legacy-actions/ip6tables
/usr/libexec/initscripts/legacy-actions/ip6tables/panic
/usr/libexec/initscripts/legacy-actions/ip6tables/save
/usr/libexec/initscripts/legacy-actions/iptables
/usr/libexec/initscripts/legacy-actions/iptables/panic
/usr/libexec/initscripts/legacy-actions/iptables/save
/usr/libexec/iptables
/usr/libexec/iptables/ip6tables.init
/usr/libexec/iptables/iptables.init

 ファイアウォール関連モジュールをカーネルにロードする

[root@Ansible ~]# modprobe ip_tables
[root@Ansible ~]# modprobe iptable_filter
[root@Ansible ~]# modprobe iptable_nat
[root@Ansible ~]# modprobe ip_conntrack
[root@Ansible ~]# modprobe ip_conntrack_ftp
[root@Ansible ~]# modprobe ip_nat_ftp
[root@Ansible ~]# modprobe ipt_state 

 永続的に参加し、起動時に自動的に開始するように書き込みます

cat >>/etc/rc.local<<EOF
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state  
EOF

 3 つのテーブルに関連するカーネル モジュールを一覧表示します。lsmod は、現在システムにロードされているすべてのカーネル モジュールを一覧表示します。

[root@Ansible ~]# lsmod |egrep 'filter|nat|ipt'
nf_nat_ftp             12809  0 
nf_conntrack_ftp       18478  1 nf_nat_ftp
iptable_nat            12875  0 
nf_nat_ipv4            14115  1 iptable_nat
nf_nat                 26583  2 nf_nat_ftp,nf_nat_ipv4
nf_conntrack          139264  6 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,nf_conntrack_ftp,nf_conntrack_ipv4
iptable_filter         12810  0 
ip_tables              27126  2 iptable_filter,iptable_nat
libcrc32c              12644  3 xfs,nf_nat,nf_conntrack

firewalldを閉じ、iptablesを有効にし、起動時の自動起動を設定します。

[root@Ansible ~]# systemctl stop firewalld
[root@Ansible ~]# systemctl disable firewalld
[root@Ansible ~]# systemctl start iptables.service
[root@Ansible ~]# systemctl enable iptables.service
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.

すべての iptables ルールをリストする

[root@Ansible ~]# iptables -nL
Chain INPUT (policy ACCEPT)        #链默认规则
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED 
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0          #规则 
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)        #链默认规则
target     prot opt source               destination         
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)        #链默认规则
target     prot opt source               destination     

iptablesコマンドパラメータ

パラメータ 意味
-L テーブル内のすべてのルールを表示
-n ポートまたは IP を名前に逆解決しないでください。
-t テーブルを指定します。指定しない場合、デフォルトはフィルタ テーブルです。
-A 追加 追加、権限ルールを追加
-D 削除削除、-D INPUT 1
-私 挿入拒否ルールはすべてのルールの先頭に配置されます
-p プロトコル プロトコル tcp/udp/icmp/all
--dポート 宛先ポート dest 宛先指定ポートとプロトコル -p tcp
- スポーツ 送信元ポート、送信元
-d --destination 宛先 IP
-m モジュールのマルチポートを指定する
-私 入力が入力された場合、どのネットワークカードから入力されますか?
-o 出力する場合はどのネットワークカードから出力されるのでしょうか?
-j

条件を満たした後の作業: DROP/ACCEPT/REJECT

DROP REJECT拒否

DROP はデータを破棄し、ユーザーに情報を返しません。

REJECT 拒否、拒否情報を返す

-F flash はすべてのルールをクリアし、デフォルトのルールは処理しません
-バツ ユーザー定義チェーンの削除
-Z チェーンのカウンター (パケットカウンターとパケットバイトカウンター) をクリアします。

フィルターテーブルルールを構成する

正式に構成する前に、ルールをバックアップしてクリアしてください。

[root@Ansible ~]# iptables -F
[root@Ansible ~]# iptables -X
[root@Ansible ~]# iptables -Z

[root@Ansible ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

1. ポート 22 へのアクセスを無効にする

[root@Ansible ~]# iptables -t filter -I INPUT -p tcp   --dport 22  -j DROP
[root@Ansible ~]# 
Connection closed by foreign host.

Disconnected from remote host(Linux86-10.0.0.61-Ansible) at 22:43:23.

Type `help' to learn how to use Xshell prompt.
[c:\~]$ 

743e56c0f995479b92d9ed65c703b4cb.png

 削除ルール

Connecting to 10.0.0.61:22...
Connection established.
To escape to local shell, press Ctrl+Alt+].

Last login: Sat May  6 22:44:26 2023
[root@Ansible ~]# 

2. IP をブロックする、IP をブロックする

[root@Ansible ~]# iptables -I INPUT  -s 10.0.0.7   -j DROP 
[root@Ansible ~]# iptables -I INPUT  -s 172.16.1.7   -j DROP 
[root@Ansible ~]#  iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  172.16.1.7           0.0.0.0/0           
DROP       all  --  10.0.0.7             0.0.0.0/0           

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

シールド後、10.0.0.7 を使用した ssh 接続が停止します。 

[root@Web01 ~]# ssh 10.0.0.61

3. ネットワーク セグメント アクセスを無効にします (10.0.0.0/24 ネットワーク セグメントがポート 8888 にアクセスすることを禁止します)

#指定10.0.0.0网段的屏蔽了22端口
[root@Ansible ~]# iptables -F
[root@Ansible ~]# iptables -I INPUT  -s 10.0.0.0/24  -p tcp  --dport 22 -j DROP 

[root@Web01 ~]# ssh 10.0.0.61 hostname
^C
[root@Web01 ~]# ssh 172.16.1.61 hostname
[email protected]'s password: 
Ansible

#指定10.0.0.0网段的屏蔽8888端口
[root@Ansible ~]# iptables -F
[root@Ansible ~]# iptables -I INPUT  -s 10.0.0.0/24  -p tcp  --dport 8888 -j DROP 

这个可以用nc和telnet测试

4. 指定したネットワーク セグメントのみの接続を許可します (10.0.0.0 ネットワーク セグメントを許可します)。

Alibaba Cloud のホワイトリスト機能と同様に、指定されたポートとネットワークセグメントが開き、それ以外は拒否されます。

1. 活用しましょう!除外し、10.0.0.0/24 へのアクセスのみを許可します

[root@Ansible ~]# iptables -I INPUT ! -s 10.0.0.0/24  -j DROP


[root@Web01 ~]# ping 10.0.0.61
PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
64 bytes from 10.0.0.61: icmp_seq=1 ttl=64 time=0.466 ms
64 bytes from 10.0.0.61: icmp_seq=2 ttl=64 time=0.658 ms
^C
--- 10.0.0.61 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.466/0.562/0.658/0.096 ms
[root@Web01 ~]# ping 172.16.1.61
PING 172.16.1.61 (172.16.1.61) 56(84) bytes of data.
^C
--- 172.16.1.61 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 2999ms

2. デフォルトのチェーンルールを変更して、許可を拒否および追加します。 

デフォルトのルールが拒否に変更された場合、パブリック IP への ping は機能しますが、パブリック ドメイン名への ping は機能しません。この障害は、DNS 解決の問題に似ています (私が踏んだ落とし穴です)。

[root@Ansible ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  
[root@Ansible ~]# iptables -P INPUT DROP 
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination                

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 
[root@Ansible ~]# iptables -A  INPUT   -s 10.0.0.0/24   -j  ACCEPT 
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0           

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 
 

b98ebdc9d90c429ea21a2c2dcb5eb4a1.png

5. 複数のポートを指定する

[root@Ansible ~]# ​​iptables -I INPUT -p tcp --dport 8888 -j DROP 
[root@Ansible ~]# iptables -I INPUT -p tcp --dport 9999 -j DROP 
[root@Ansible ~]# ​iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:9999
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8888

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

[root@Ansible ~]# iptables -I INPUT  -p tcp -m multiport ! --dport 80,443  -j DROP

#如果是禁用连续端口可以不加-m multiport 1:1024
[root@Ansible ~]# iptables -I INPUT  -p tcp  --dport 1024:65535  -j DROP 
[root@Ansible ~]#  iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpts:1024:65535

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

6. ICMP タイプの一致

ICMP (インターネット制御メッセージ プロトコル) インターネット制御メッセージ プロトコル、ping は Web サイト全体の中核です

ファイアウォール ルールを通じて、ping を許可するかどうかを制御します。

[root@Ansible ~]# iptables -I INPUT  -p icmp --icmp-type 8  -j DROP 
[root@Ansible ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 8

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

[root@Web01 ~]# ping 10.0.0.61
PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
^C
--- 10.0.0.61 ping statistics ---
6 packets transmitted, 0 received, 100% packet loss, time 5002ms

カーネルパラメータを通じてpingの禁止を制御 

[root@Ansible ~]# cat /etc/sysctl.conf     
net.ipv4.icmp_echo_ignore_all = 0    #0为允许,1为禁止
[root@Ansible ~]# sysctl -p 
net.ipv4.icmp_echo_ignore_all = 0

7. ネットワークステータス(TCP/IP接続ステータス)の照合

-m 状態 --状態

NEW: 新しい接続が開始された、または開始される予定です

ESTABLISHED:已建立的连接

RELATED:正在启动的新连接

INVALID:非法或无法识别的

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
​
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

8、限制并发及速率

-m limit 限制模块

-m limit --limit 10/minute     #每分钟只能有10个数据包 每6秒生成

 -m limit --limit n/{ second/minute/hour}:指定时间内的请求速率”n”为速率,后面为时间分别为:秒 分 时

-m limit --limit 10/minute   --limit-burst 5  每6秒释放工牌 给别人使用 
​
#10个数据包   
前5个  1个1个工牌   从第6个开始 每6秒 才能释放1个工牌 

--limit-burst [n]:在同一时间内允许通过的请求“n”为数字,不指定默认为5

#ping  icmp 协议  进行测试
[root@Ansible ~]# iptables -F 
[root@Ansible ~]# iptables -I INPUT  -p icmp  -m limit --limit 10/minute    --limit-burst 5   -j ACCEPT 
[root@Ansible ~]# iptables -A INPUT  -p tcp  --dport 22 -j  ACCEPT 
[root@Ansible ~]# iptables -P INPUT DROP 
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0            limit: avg 10/min burst 5
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   

 测试

[root@Web01 ~]# ping 10.0.0.61
PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
64 bytes from 10.0.0.61: icmp_seq=1 ttl=64 time=0.298 ms
64 bytes from 10.0.0.61: icmp_seq=2 ttl=64 time=1.33 ms
64 bytes from 10.0.0.61: icmp_seq=3 ttl=64 time=0.435 ms
64 bytes from 10.0.0.61: icmp_seq=4 ttl=64 time=0.460 ms
64 bytes from 10.0.0.61: icmp_seq=5 ttl=64 time=0.758 ms
64 bytes from 10.0.0.61: icmp_seq=7 ttl=64 time=2.28 ms    #7和1之间间隔6秒
64 bytes from 10.0.0.61: icmp_seq=13 ttl=64 time=0.793 ms  #13和7之间间隔6秒
64 bytes from 10.0.0.61: icmp_seq=19 ttl=64 time=0.734 ms
64 bytes from 10.0.0.61: icmp_seq=25 ttl=64 time=0.803 ms
^C
--- 10.0.0.61 ping statistics ---
26 packets transmitted, 9 received, 65% packet loss, time 25013ms
rtt min/avg/max/mdev = 0.298/0.877/2.286/0.572 ms

9、防火墙规则的保存与恢复

iptables-save 保存,默认输出到屏幕

iptables-restore 恢复,加上文件

写入/etc/sysconfig/iptables

[root@Ansible ~]# iptables-save   >/etc/sysconfig/iptables
[root@Ansible ~]#  cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Sun May  7 16:11:34 2023
*nat
:PREROUTING ACCEPT [306:36403]
:INPUT ACCEPT [182:29467]
:OUTPUT ACCEPT [145:11135]
:POSTROUTING ACCEPT [145:11135]
COMMIT
# Completed on Sun May  7 16:11:34 2023
# Generated by iptables-save v1.4.21 on Sun May  7 16:11:34 2023
*filter
:INPUT DROP [17:1428]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [49:5580]
-A INPUT -p icmp -m limit --limit 10/min -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
COMMIT
# Completed on Sun May  7 16:11:34 2023
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0            limit: avg 10/min burst 5
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@Ansible ~]# iptables -D INPUT 1 
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@Ansible ~]# iptables-restore < /etc/sysconfig/iptables
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0            limit: avg 10/min burst 5
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

此外,systemctl restart iptables 会读取/etc/sysconfig/iptables内容

10、filter表简单总结

1、封ip,端口,网段

2、禁止ping

3、限制速度和并发

4、iptables filter表功能可以在云服务器使用

企业中用法

iptables配置方式:1、逛公园模式,默认规则是ACCEPT;2、看电影模式,默认规则是DROP

默认是拒绝

1、ssh可以连接

[root@Ansible ~]# iptables -F
[root@Ansible ~]# iptables -X
[root@Ansible ~]# iptables -Z
[root@Ansible ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@Ansible ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@Ansible ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 



[root@Web01 ~]# ssh 10.0.0.61 hostname
[email protected]'s password: 
Ansible

2、设置允许本机lo通讯规则

允许本机回环lo(本地操作)接口数据流量流出和流入

[root@Ansible ~]# iptables -A INPUT -i lo -j ACCEPT
[root@Ansible ~]# iptables -A OUTPUT -o lo -j ACCEPT

3、配置默认规则及放行80,443端口

[root@Ansible ~]# iptables -P INPUT DROP 
[root@Ansible ~]# iptables -P FORWARD DROP 
[root@Ansible ~]# iptables -P OUTPUT ACCEPT 
[root@Ansible ~]# 
[root@Ansible ~]# iptables -A INPUT  -m multiport -p tcp  --dport 443,80   -j ACCEPT
[root@Ansible ~]# iptables -nL 
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 443,80

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
[root@Ansible ~]# iptables -A INPUT  -s 10.0.0.0/24  -j ACCEPT 
[root@Ansible ~]# iptables -A INPUT  -s 172.16.1.0/24  -j ACCEPT
#此处还可以添加 vpn网段 比如说 10.7.1.0/24

[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 443,80
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0           
ACCEPT     all  --  172.16.1.0/24        0.0.0.0/0           

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
[root@Ansible ~]# iptables-save 
# Generated by iptables-save v1.4.21 on Sun May  7 16:24:29 2023
*nat
:PREROUTING ACCEPT [9:711]
:INPUT ACCEPT [2:112]
:OUTPUT ACCEPT [3:312]
:POSTROUTING ACCEPT [3:312]
COMMIT
# Completed on Sun May  7 16:24:29 2023
# Generated by iptables-save v1.4.21 on Sun May  7 16:24:29 2023
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [7:1480]
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m multiport --dports 443,80 -j ACCEPT
-A INPUT -s 10.0.0.0/24 -j ACCEPT
-A INPUT -s 172.16.1.0/24 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Sun May  7 16:24:29 2023

NAT表

恢复链

[root@Ansible ~]# iptables -P INPUT ACCEPT
[root@Ansible ~]# iptables -P FORWARD ACCEPT 
[root@Ansible ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 443,80
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0           
ACCEPT     all  --  172.16.1.0/24        0.0.0.0/0           

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
[root@Ansible ~]# iptables -F
[root@Ansible ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

1、实现共享上网

1、防火墙配置

[root@Ansible ~]#  iptables -t nat -A POSTROUTING  -s 172.16.1.0/24   -j SNAT  --to-source 10.0.0.61 
[root@Ansible ~]# echo 'net.ipv4.ip_forward = 1'  >> /etc/sysctl.conf 
[root@Ansible ~]# sysctl -p
net.ipv4.icmp_echo_ignore_all = 0
net.ipv4.ip_forward = 1

注意:公网IP不固定
iptables -t nat -A POSTROUTING  -s 172.16.1.0/24   -j  MASQUERADE

2、web配置

[root@Web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=no            #修改网卡,禁止开机自启动
IPADDR=10.0.0.7
PREFIX=24
GATEWAY=10.0.0.2
DNS1=223.5.5.5
[root@Web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.7
PREFIX=24
GATEWAY=172.16.1.61
DNS1=1.2.4.8
[root@Web01 ~]# systemctl restart network
[root@Ansible ~]# ssh 172.16.1.7
Last login: Sun May  7 21:16:43 2023 from 10.0.0.1
[root@Web01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 00:0c:29:91:01:20 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:91:01:2a brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.7/24 brd 172.16.1.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe91:12a/64 scope link 
       valid_lft forever preferred_lft forever

 3、在web01测试结果

[root@Web01 ~]# ip r
default via 172.16.1.61 dev eth1 
169.254.0.0/16 dev eth1 scope link metric 1003 
172.16.1.0/24 dev eth1 proto kernel scope link src 172.16.1.7 
[root@Web01 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.1.61     0.0.0.0         UG    0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
172.16.1.0      0.0.0.0         255.255.255.0   U     0      0        0 eth1
[root@Web01 ~]# ping baidu.com
PING baidu.com (39.156.66.10) 56(84) bytes of data.
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=1 ttl=127 time=10.3 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=2 ttl=127 time=12.3 ms
^C
--- baidu.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 10.306/11.346/12.386/1.040 ms
[root@Web01 ~]# ping 1.2.4.8
PING 1.2.4.8 (1.2.4.8) 56(84) bytes of data.
64 bytes from 1.2.4.8: icmp_seq=1 ttl=127 time=12.5 ms
64 bytes from 1.2.4.8: icmp_seq=2 ttl=127 time=11.3 ms
^C
--- 1.2.4.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 11.337/11.945/12.554/0.618 ms

2、端口转发(端口映射)

1a8225b6b7254ef3b0101af92666442a.png

[root@Ansible ~]# iptables -t nat -A PREROUTING    -d 10.0.0.61 -p tcp --dport 9000  -j DNAT --to-destination 172.16.1.7:22
[root@Ansible ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  0.0.0.0/0            10.0.0.61            tcp dpt:9000 to:172.16.1.7:22

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  172.16.1.0/24        0.0.0.0/0            to:10.0.0.61

 本地shell测试

c:\~]$ ssh [email protected] 9000


Connecting to 10.0.0.61:9000...
Connection established.
To escape to local shell, press Ctrl+Alt+].

Last login: Sun May  7 21:34:55 2023 from 10.0.0.61

3、IP映射

[root@Ansible ~]#  iptables -t nat -A PREROUTING  -d 10.0.0.62  -j DNAT  --to-destination 172.16.1.7 
[root@Ansible ~]# iptables -nL -t nat 
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  0.0.0.0/0            10.0.0.61            tcp dpt:9000 to:172.16.1.7:22
DNAT       all  --  0.0.0.0/0            10.0.0.62            to:172.16.1.7

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  172.16.1.0/24        0.0.0.0/0            to:10.0.0.61

4、NAT表简单总结

1、可以实现共享上网

2、可以实现端口转发

3、NAT功能在云服务器无法使用,但有替代品叫NAT网关

iptables简单练习

1、查看iptables当前所有规则的命令

iptables-save 

iptables -nL

iptables -nL -t nat

2、禁止来自10.0.0.188IP地址访问80端口的请求

iptables -I   INPUT   -s 10.0.0.188 -p tcp   --dport 80      -j  DROP 

3、在命令行执行的iptables规则永久生效

iptables-save > /etc/sysconfig/iptables

 4、实现把访问10.0.0.3:80请求转到172.16.1.17:80

iptables -t nat  -A PREROUTING  -d 10.0.0.3  -p tcp --dport 80    -j   DNAT  --to-destination  172.16.1.17:80

5、实现172.16.1.0/24段所有主机通过124.32.54.26外网IP共享上网

iptables   -t nat  -A POSTROUTING    -s 172.16.1.0/24    -j  SNAT  --to-source   123.32.54.26
​
iptables   -t nat  -A POSTROUTING    -s 172.16.1.0/24    -j  SNAT  MASQUERADE

6、iptables实现防止syn ddos和ping攻击

-A FORWARD -p tcp --syn -m limit --limit 1/s --limit-burst 5 -j ACCEPT
-A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
-A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
说明:第一行:每秒中最多允许5个新连接。第二行:防止各种端口扫描。第三行:Ping洪水攻击(Ping of Death),可以根据需要调整或关闭

我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!

 

おすすめ

転載: blog.csdn.net/qq_37510195/article/details/130289414