防火牆iptables

fanhaixin發表於2024-12-05

防火牆iptables

目錄
  • 防火牆iptables
    • iptables執行過程
      • 1. 工作流程小結
      • 2. 表與鏈
      • 3. 每個表說明
    • 環境準備及命令
      • 1. 啟動和關閉命令
      • 2. 規則詳解
      • 2. 清除鏈和規則
    • 命令示例

iptables執行過程

iptable的規則是從上到下讀取的

所以如果需要指定埠只允許指定ip訪問 需要對該埠先進行拒絕

再將對應的埠給指定ip開放

先新增拒絕規則 ,再新增允許規則,如果先新增允許 後面有拒絕的 又會拒絕掉

[root@zookeeper2 ~]#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 INPUT (policy ACCEPT)這個ACCEPT是預設規則 在從上到下的順序讀取完所有的自定義規則後才會讀取此規則

某個埠只允許特定ip訪問

  • 方式1:修改預設規則為拒絕,新增允許(先新增允許,在設定預設規則為拒絕)
  • 方式2:先新增全部拒絕的規則,在新增允許的規則,以下示例
iptables -I INPUT -p tcp --dport 80 -j DROP
iptables -I INPUT -s 10.0.0.10 -p tcp --dport 80 -j ACCEPT
# 允許10.0.0.10 地址訪問 我伺服器的80埠

1. 工作流程小結

image-20241110102432343

image-20241110102626302

2. 表與鏈

(1) 表(table)是對功能的分類

  • 防火牆功能:filter表 允許和拒絕資料包
  • 共享上網,埠轉發:nat表 類似路由器的功能

(2) 鏈對資料流進行處理,需要使用不通的鏈 資料流入(INPUT鏈) 資料流出(OUTPUT鏈)

(3) 四表:filter表 nat表 raw表 mangle表(修改資料包)

(4) 5鏈:INPUT(進) OUPUT(出) FORWARD(轉發或經過) PREFOUTING POSTROUTING

3. 每個表說明

(1) filter表

image-20241110103822228

(2) nat表

image-20241110103904057

環境準備及命令

1. 啟動和關閉命令

# 注意: centsos7及以上版本預設安裝firewalld  需要關閉並禁止自啟動
   systemctl stop     firewalld
   systemctl disable   firewalld


# 1.檢視狀態  執行後無反應  是關閉的
[root@zookeeper2 ~]#iptables-save
[root@zookeeper2 ~]#

# 2. 檢視系統版本
[root@zookeeper2 ~]#uname -r
3.10.0-1160.el7.x86_64


# 3. 安裝
yum install -y iptables-services

# 4. 檢視安裝
[root@zookeeper2 ~]#rpm -ql   iptables-services
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables  # 防火牆配置檔案  所有的規則都是儲存到該檔案,iptables-save也是將當前的臨時規則儲存到該檔案中
/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

(2) 將防火牆相關模組載入到核心中

預設的防火牆模組沒有filter nat 表等模組

#防火牆相關模組 載入到核心中,
#寫入到開機自啟動.直接放到命令列執行即可
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state


#永久
chmod +x /etc/rc.d/rc.local  # 必須要加執行許可權對該檔案
cat /etc/rc.localEOF
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) 檢查是否載入防火牆iptables 模組

lsmod |egrep 'filter|nat|ipt'

[root@zookeeper2 ~]#lsmod |egrep 'filter|nat|ipt'
[root@zookeeper2 ~]#
# 未執行(2)步驟前


[root@zookeeper2 ~]#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
# 執行(2)步驟後

(4) 啟動iptables

systemctl start iptables

systemctl enable iptables

systemctl start iptables
systemctl enable iptables
[root@zookeeper2 ~]#systemctl status iptables
● iptables.service - IPv4 firewall with iptables
  Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled)
  Active: active (exited) since Sun 2024-11-10 11:11:14 CST; 4s ago
 Process: 1750 ExecStart=/usr/libexec/iptables/iptables.init start (code=exited, status=0/SUCCESS)
Main PID: 1750 (code=exited, status=0/SUCCESS)

Nov 10 11:11:14 zookeeper2 systemd[1]: Starting IPv4 firewall with iptables...
Nov 10 11:11:14 zookeeper2 iptables.init[1750]: iptables: Applying firewall rules: [  OK  ]
Nov 10 11:11:14 zookeeper2 systemd[1]: Started IPv4 firewall with iptables.

(5)檢視狀態

iptables-save

[root@zookeeper2 ~]#iptables-save
# Generated by iptables-save v1.4.21 on Sun Nov 10 11:13:47 2024
*nat
:PREROUTING ACCEPT [1:229]
:INPUT ACCEPT [1:229]
:OUTPUT ACCEPT [22:1784]
:POSTROUTING ACCEPT [22:1784]
COMMIT
# Completed on Sun Nov 10 11:13:47 2024
# Generated by iptables-save v1.4.21 on Sun Nov 10 11:13:47 2024
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [153:10748]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Sun Nov 10 11:13:47 2024

2. 規則詳解

(6) iptables 檢視規則

iptables -nL # 預設檢視的是filter表

[root@zookeeper2 ~]#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         
[root@zookeeper2 ~]#


# 檢視指定表中的規則
[root@zookeeper2 ~]#iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

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 

(7) iptables 命令引數

指定表和鏈的命令

  • -n 引數 不進行反向解析 比如ip地址不解析成域名

image-20241110111930466

描述什麼型別的資料

image-20241110114617169

允許還是拒絕

image-20241110114708149

image-20241110114723917

(8) iptables 規則詳解

鏈有預設的規則

  • input 預設鏈的規則是允許所有的都透過
[root@zookeeper2 ~]#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 

input鏈詳解

image-20241110113754699

  1. target列 動作 目標
  • accept 允許
  • reject 拒絕
  • drop 丟棄
  1. port列 埠
  • all 允許所有埠
  • icmp 允許ping 能ping通
  • tcp
  1. source 列 源ip 訪問我的ip
  2. destination 列 本機ip地址

image-20241110114358619

2. 清除鏈和規則

iptables -F 清除指定表中所有的規則,備份.
iptables -X 刪除使用者自定義的鏈
iptables -Z 鏈的計數器清零(資料包計數器與資料包位元組計數器) iptables


[root@zookeeper2 ~]#iptables -F
[root@zookeeper2 ~]#iptables -X
[root@zookeeper2 ~]#iptables -Z
[root@zookeeper2 ~]#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埠

-t 可以不指定 不指定預設是filter

#拒絕使用者訪問22埠
iptables -t filter  -A INPUT  -p tcp dport 22 -j  DROP

-t filter:
指定要操作的表為 filter 表。filter 是 iptables 預設的內建表,用於配置允許或拒絕透過的網路資料包。
filter 表包含三個標準鏈:INPUT、FORWARD、和 OUTPUT。這裡我們關注的是 INPUT 鏈,用於過濾入站流量。

-A INPUT:
-A 是 --append 的簡寫,用於向 INPUT 鏈追加一條規則。
INPUT 鏈用於處理所有入站流量,即進入伺服器的流量。
也可以使用-I  插入一條規則

-p tcp:
-p 是 --protocol 的簡寫,用於指定協議。
tcp 表示該規則只適用於使用 TCP 協議的資料包。TCP 是傳輸控制協議,是一種連線導向的通訊協議,常用於HTTP、SSH等。

–dport 22:
--dport 是目標埠(destination port)的簡寫,這裡設定為 22。
埠 22 是 SSH 服務的預設埠,意味著這條規則隻影響目標埠為 22 的流量。

-j DROP:
-j 是 --jump 的簡寫,用於指定動作。
DROP 表示丟棄匹配規則的資料包,不給任何響應給傳送方。與 REJECT 類似,但 DROP 不會向資料包傳送方提供任何反饋,使其面臨無任何回應的情況。

(2) 刪除規則

iptables -t filter  -D INPUT  1   #根據序號刪除


# 刪除方法2
iptables -t filter  -D INPUT  -p tcp dport 22 -j  DROP

(3) 檢視規則的序號 便於刪除

iptables -nL --line

(4) 遮蔽某個ip

iptables -I INPUT -s 10.0.0.7 -j DROP

# 會丟棄到所有包  包括ping
-s 源地址  訪問我的地址

(5) 禁止10.0.0.7 訪問80埠嗎

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

(6) 禁止網段連入(禁止10.0.0.0/24網段訪問 8888埠)

iptables -I INPUT  -s 10.0.0.0/24  -p tcp  dport 8888  -j DROP

(7) 只允許指定網段連入(允許172.16.1.0網段)

# 方法1
利用 ! 進行 排除
iptables -I INPUT ! -s 172.16.1.0/24  -j DROP
# 源ip不是172.16.1.0/24網段,則DROP.
iptables -I INPUT -s 10.0.0.203  -j ACCEPT
# 只允許特定ip訪問  其他全部拒絕,只有10.0.0.201才能訪問我
iptables -I INPUT ! -s 10.0.0.201  -j DROP

# 除了公司的公網ip能夠訪問我的22埠  其他的全部拒絕
iptables -I INPUT ! -s 公司公網IP -p tcp -dport 22 -j DROP  


# 方法2  修改預設的規則為拒絕
# 把想要允許的新增允許即可
# 先新增允許的ip或網段  規則
# 在將預設規則修改為拒絕
# 會先讀取預設規則,然後才讀取預設規則
iptables -P INPUT DROP # 把input的鏈的預設規則改為drop


iptables -P INPUT ACCEPT


(8) 指定多個埠

-m multiport   -p tcp   --dport 80,443 

書寫防火牆規則准許任何地址訪問80和443埠.
iptables -A INPUT  -p tcp  -m multiport  --dport 80,443  -j ACCEPT

書寫防火牆規則只准許172.16.1.0/24訪問3306和6379 (! -s)
iptables -I INPUT ! -s 172.16.1.0/24 -p tcp   -m multiport  --dport 3306,6379  -j DROP

公司的雲伺服器22埠只能在公司訪問.(在防火牆設定只准許公司公
網ip訪問22埠)
# 方式1
iptables -I INPUT ! -s  221.218.215.241    -p tcp --dport 22   -j DROP
# 方式2
iptables -I INPUT   -s  221.218.215.241    -p tcp  --dport 22   -j ACCEPT
修改鏈的預設規則為DROP.

(9) 匹配ICMP型別 ⭐禁止ping.避免伺服器被發現

相關文章