防火牆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. 工作流程小結
2. 表與鏈
(1) 表(table)是對功能的分類
- 防火牆功能:
filter表
允許和拒絕資料包 - 共享上網,埠轉發:
nat表
類似路由器的功能
(2) 鏈對資料流進行處理,需要使用不通的鏈 資料流入(INPUT鏈)
資料流出(OUTPUT鏈)
(3) 四表:filter表 nat表 raw表 mangle表(修改資料包)
(4) 5鏈:INPUT(進) OUPUT(出) FORWARD(轉發或經過) PREFOUTING POSTROUTING
3. 每個表說明
(1) filter表
(2) nat表
環境準備及命令
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地址不解析成域名
描述什麼型別的資料
允許還是拒絕
(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鏈詳解
- target列 動作 目標
- accept 允許
- reject 拒絕
- drop 丟棄
- port列 埠
- all 允許所有埠
- icmp 允許ping 能ping通
- tcp
- source 列 源ip 訪問我的ip
- destination 列 本機ip地址
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.避免伺服器被發現