版權聲明:原創作品,謝絕轉載!否則將追究法律責任。 ————— 作者:kirin
1.iptables 執行過程
1.防火牆是層層過濾的,實際是按照配置規則的順序從上到下,從前到后 進行過濾的。
2. 如果匹配成功規則,即明確表示是拒絕(DROP)還是接收(ACCEPT),數 據包就不再向下匹配新的規則。 3. 如果規則中沒有明確表明是阻止還是通過的,也就是沒有匹配規則,向下進行匹配,直到匹配默認規則得到明確的阻止還是通過。 4. 防火牆的默認規則是所有規則都匹配完才會匹配的
2.表與鏈
1 簡介
iptables 是 4表伍鏈
4表: filter 表 nat表 raw表 mangle表 伍鏈: INPUT OUTPUT FORWARD PREROUTING POSTROUTING pre.... 之前 post .....之后
2 每個表說明
2.1filter表
實現防火牆功能: 屏蔽或准許 端口 ip 強調:主要和主機自身相關,真正負責主機防火牆功能的 (過濾流入流出主機的數據包) filter表示iptables默認 使用的表,這個表定義了三個鏈(chains) 企業工作場 景:主機防火牆 INPUT鏈:負責過濾所有目標地址是本機地址的數據包 通俗來說: 就是過濾進入主機的數據包 (能否讓數據包進入服務器)
2.2nat表
實現nat功能 實現共享上網(內網服務器上外網) 端口映射和ip映射 nat:負責網絡地址轉換的,即來源與目的IP地址和port 的轉換。 應用:和主機本身無關,一般用於局域網共享上網 或者特殊的端口轉換服務相關。 工作場景: 1. 用於企業路由(zebra)或網關(iptables),共 享上網(POSTROUTING) 2. 做內部外部IP地址一對一映射(dmz),硬件防 火牆映射IP到內部服務器,ftp服務 (PREROUTING) 3. WEB,單個端口的映射,直接映射80端口 (PREROUTING) 這個表定義了3個鏈,nat功能 相當於網絡的acl控制。和網絡交換機acl類似 PREROUTING鏈:在數據包到達防火牆時,進行路由判斷之前執行的規則,作用是改變數據包的目的地址、目的端口等就是收信時,根據規則重寫收件人的地址。例如:把公網IP:xxx.xxx.xxx.xxx映射到局域網的 xx.xx.xx.xx服務器上。 如果是web服務,可以報80轉換為局域網的服務器 9000端口上 POSTROUTING鏈:在數據包離開防火牆時進行路由判斷之后執行的規 則,作用改變數據包的源地址,源端口等。 寫好發件人的地址,要讓家人回信時能夠有地址可 回。 例如。默認筆記本和虛擬機都是局域網地址,在出 網的時候被路由器將源地址改為了公網地址。 生產應用:局域網共享上網。
3.環境准備及相關命令
1.環境准備
m01 | 10.0.0.61;172.16.1.61 |
web01 | 10.0.0.7 172.16.1.7 |
web02 | 10.0.0.8 172.16.1.8 |
[root@m01 ~]# yum install -y iptables-services [root@m01 ~]# rpm -ql iptables-services /etc/sysconfig/ip6tables /etc/sysconfig/iptables #防火 牆的配置文件 /usr/lib/systemd/system/ip6tables.service /usr/lib/systemd/system/iptables.service#防火 牆服務配置文件(命令)
[root@m01 ~]# rpm -ql iptables /usr/sbin/iptables #iptables 命令 添加/刪除/查 看 規則(4表伍鏈) /usr/sbin/iptables-save #iptables規則 輸出(保存) /usr/sbin/iptables-restore # 恢復
#防火牆相關模塊 加載到內核中(臨時)
[root@m01 ~]# modprobe ip_tables [root@m01 ~]# modprobe iptable_filter [root@m01 ~]# modprobe iptable_nat [root@m01 ~]# modprobe ip_conntrack [root@m01 ~]# modprobe ip_conntrack_ftp [root@m01 ~]# modprobe ip_nat_ftp [root@m01 ~]# modprobe ipt_state
#永久
[root@m01 ~]# 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
檢查是否加入
[root@m01 ~]# 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
關閉自帶防火牆並啟動iptables
[root@m01 ~]# systemctl stop firewalld [root@m01 ~]# systemctl disable firewalld [root@m01 ~]# systemctl start iptables.service [root@m01 ~]# systemctl enable iptables.service Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
#查看filter表中的規則 ,默認查看的是filter表
[root@m01 ~]# iptables -nL
#查看指定表中的規則
[root@m01 ~]# iptables -t nat -nL
2.iptables命令參數
參數 | 含義 |
-L | 顯示表中的所有規則 |
-n | 不要把端口 或ip反向解析為名字 |
-t | 指定表 不指定默認是filter表 |
-A | 追加 加入准許類規則 使用-A |
-I | insert 把規則加在鏈的第1條 拒絕類規則放在所有 規則最上面 拒絕類 -I |
-D | delete 刪除 -D INPUT 1 |
-p | 協議 protocal tcp/udp/icmp/all |
–dport | 目標端口 dest destination 指定端口 加上協議 -p tcp |
–sport | 源端口 source 源 |
-s | –source 源ip |
-d | –destination 目標ip |
-m | 指定模塊 multiport |
-i | input 輸入的時候 從哪個網卡進來 |
-o | ouput 輸出的時候 從哪個網卡出去 |
-j | 滿足條件后的動作:DROP/ACCEPT/REJECT DROP REJECT拒絕 DROP 把數據丟掉 不會返回信息給用戶 REJECT 拒絕 返回拒絕信息 |
-F | 清除所有規則,不會處理默認的規則 |
-X | 刪除用戶自定義的鏈 |
-Z | 鏈的計數器清零(數據包計數器與數據包字節計數器) |
3 配置filter表規則
3.1正式配置之前先清空規則
[root@m01 ~]# iptables -F [root@m01 ~]# iptables -X [root@m01 ~]# iptables -Z [root@m01 ~]# 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
3.2禁止訪問22端口
[root@m01 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP ###拒絕用戶訪問22端口(危險,一會要跑機房) #此時發現Xshell已經無法進行操作了 #進入機房 #查看規則並加上序號 [root@m01 ~]# iptables -t filter -nL --line-number #刪除規則 iptables -t filter -D INPUT 1 #根據序號刪除
3.3 封ip 屏蔽某個ip
#拒絕10.0.0.7訪問
[root@m01 ~]# iptables -t filter -I INPUT -s 10.0.0.7 -j DROP [root@m01 ~]# iptables -t filter -nL --line-number Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP all -- 10.0.0.7 0.0.0.0/0 Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination
#拒絕某個網段的訪問
[root@m01 ~]# iptables -I INPUT -s 172.16.1.0/24 -j DROP [root@m01 ~]# iptables -t filter -nL --line-number Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP all -- 172.16.1.0/24 0.0.0.0/0 2 DROP all -- 10.0.0.7 0.0.0.0/0 Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination
#禁止網段連入(禁止10.0.0.0/24網段訪問 8888端口)
[root@m01 ~]# iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 8080 -j DROP [root@m01 ~]# iptables -t filter -nL --line-number Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP tcp -- 10.0.0.0/24 0.0.0.0/0 tcp dpt:8080 2 DROP all -- 172.16.1.0/24 0.0.0.0/0 3 DROP all -- 10.0.0.7 0.0.0.0/0 Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination
3.4只允許指定網段連入(允許172.16.1.0網段)
#方法1: 利用 ! 進行排除
[root@m01 ~]# iptables -I INPUT ! -s 172.16.1.0/24 -j DROP
#方法2: 修改鏈默認規則 修改為拒絕 添加准許
[root@m01 ~]# iptables -P INPUT DROP [root@m01 ~]# 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 #測試完成后 修改回去 [root@m01 ~]# iptables -P INPUT ACCEPT [root@m01 ~]# iptables -nL Chain INPUT (policy ACCEPT) 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
3.5 指定多個端口
#指定多個端口
-m multiport -p tcp --dport 80,443 [root@m01 ~]# iptables -t filter -A INPUT -m multiport -p tcp --dport 80,443 -j ACCEPT [root@m01 ~]# iptables -nL
3.6匹配ICMP類型
###通過防火牆設置
[root@m01 ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP [root@m01 ~]# 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@m01 ~]# echo "net.ipv4.icmp_echo_ignore_all = 1" >> /etc/sysctl.conf [root@m01 ~]# sysctl -p net.ipv4.icmp_echo_ignore_all = 1 [root@m01 ~]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all 1
3.7 限制並發及速率
-m limit 限制模塊
-m limit –limit 10/minute #每分鍾只能有10個數據包 每6秒 生成
iptables -I INPUT -p icmp -m limit –limit 10/minute –limit-burst 5 -j ACCEPT
3.8 防火牆規則的保存與恢復
iptables-save 默認輸出到屏幕
iptables-restore 加上文件
寫入到/etc/sysconfig/iptables
####保存
[root@m01 ~]# iptables-save >/etc/sysconfig/iptables [root@m01 ~]# cat /etc/sysconfig/iptables # Generated by iptables-save v1.4.21 on Fri May 28 16:52:58 2021 *nat :PREROUTING ACCEPT [55:8594] :INPUT ACCEPT [27:6329] :OUTPUT ACCEPT [113:7357] :POSTROUTING ACCEPT [113:7357] COMMIT # Completed on Fri May 28 16:52:58 2021 # Generated by iptables-save v1.4.21 on Fri May 28 16:52:58 2021 *filter :INPUT ACCEPT [30:2576] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [364:46616] -A INPUT -s 10.0.0.0/24 -j ACCEPT -A INPUT -s 10.0.0.0/24 -p icmp -m icmp --icmp-type 8 -j DROP COMMIT # Completed on Fri May 28 16:52:58 2021
###刪除后的恢復
[root@m01 ~]# iptables -D INPUT 1 [root@m01 ~]# iptables -D INPUT 1 [root@m01 ~]# iptables -D INPUT 1 iptables: Index of deletion too big. [root@m01 ~]# 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@m01 ~]# iptables-restore < /etc/sysconfig/iptables [root@m01 ~]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 10.0.0.0/24 0.0.0.0/0 DROP icmp -- 10.0.0.0/24 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
4. nat表規則
4.1 實現共享上網
##防火牆配置
[root@m01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.7 -j SNAT --to-source 10.0.0.61 [root@m01 ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf [root@m01 ~]# sysctl -p net.ipv4.icmp_echo_ignore_all = 1 net.ipv4.ip_forward = 1
##web端配置
[root@web01 ~]# echo GATEWAY=172.16.1.61 >> /etc/sysconfig/network-scripts/ifcfg-eth1 [root@web01 ~]# ifdown eth1 && ifup eth1
4.2 實現端口轉發
##防火牆配置
[root@mb01 ~]# iptables -t nat -I PREROUTING -d 10.0.0.61 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22 [root@mb01 ~]# sysctl -p net.ipv4.icmp_echo_ignore_all = 1 net.ipv4.ip_forward = 1 ###然后用xshell連接測試一下吧