iptables


iptables是開源的基於數據包過濾的防火牆工具。

iptables企業應用場景

1、主機防火牆(filter表的INPUT鏈)。
2、局域網共享上網(nat表的POSTROUTING鏈)。半個路由器,NAT功能。
3、端口及IP映射(nat表的PREROUTING鏈),硬防的NAT功能。
4、IP一對一映射。

3.商用防火牆品牌
華爲
深信服
思科
H3C
Juniper
天融信
飛塔
網康
綠盟科技
金盾

iptables工作流程

iptables是採用數據包過濾機制工作的,所以它會對請求的數據包的包頭數據進行分析,並根據我們預先設定的規則進行匹配來決定是否可以進入主機。
1.防火牆是一層層過濾的。實際是按照配置規則的順序從上到下,從前到後進行過濾的。
2.如果匹配上了規則,即明確表明是阻止還是通過,此時數據包就不在向下匹配新規則了。
3.如果所有規則中沒有明確表明是阻止還是通過這個數據包,也就是沒有匹配上規則,向下進行匹配,直到匹配默認規則得到明確的阻止還是通過。
4.防火牆的默認規則是對應鏈的所有的規則執行完以後纔會執行的(最後執行的規則)。

iptables四表五鏈

1.表與鏈對應關係
實際iptables包含4張表和五個鏈,但主要記住兩張表即可filter和nat表即可。

在這裏插入圖片描述

2.FILTER表
在這裏插入圖片描述
3.NAT表
在這裏插入圖片描述

iptables工作原理示意圖

在這裏插入圖片描述
在這裏插入圖片描述

iptables環境準備

1.安裝iptables管理命令
[root@m01 ~]# yum install iptables-services -y
2.加載防火牆的內核模塊
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
查看已加載的模塊

[root@m01 ~]# lsmod |egrep ‘filter|nat|ipt’
ipt_REJECT 12541 0
nf_nat_ftp 12770 0
nf_conntrack_ftp 18638 1 nf_nat_ftp
iptable_filter 12810 0
xt_nat 12681 3
iptable_nat 12875 1
nf_nat_ipv4 14115 1 iptable_nat
nf_nat 26146 3 nf_nat_ftp,nf_nat_ipv4,xt_nat
nf_conntrack 105745 7 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,xt_conntrack,nf_conntrack_ftp,nf_conntrack_ipv4
ip_tables 27240 2 iptable_filter,iptable_nat
3.啓動防火牆
首先停止firewalld

systemctl stop firewalld
systemctl disable firewalld
開啓iptables

systemctl start iptables.service
systemctl enable iptables.service

iptables基本操作命令

1.查看防火牆規則
[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
2.清除防火牆規則
iptables -F <- 清除所有規則,不會處理默認的規則
iptables -X <- 刪除用戶自定義的鏈
iptables -Z <- 鏈的計數器清零(數據包計數器與數據包字節計數器)

3.添加防火牆規則
iptables -t <-指定表d(efault: `filter’)
iptables -A <-把規則添加到指定的鏈上,默認添加到最後一行。
iptables -I <-插入規則,默認插入到第一行(封IP)。
iptables -D <-刪除鏈上的規則

4.網絡連接狀態
NEW:已經或將啓動新的連接
ESTABLISHED:已建立的連接
RELATED:正在啓動的新連接
INVALID:非法或無法識別的

4.刪除某個規則
iptables -nL --line-numbers 查看規則號碼
iptables -D INPUT 1 刪除指定鏈上的指定序號

iptables A INPUT -p tcp -m state --dport 22 -j DROP
iptables -nL
iptables -nL --line-numbers
iptables -D INPUT 1

iptables實戰

1.禁止某個端口訪問
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
規則解釋:

-p #<==指定過濾的協議-p(tcp,udp,icmp,all)
–dport #<==指定目標端口(用戶請求的端口)。
-j #<==對規則的具體處理方法(ACCEPT,DROP,REJECT,SNAT/DNAT)
–sport #<==指定源端口。
2.禁止某個IP訪問
iptables -I INPUT -p tcp -s 10.0.0.253 -i eth0 -j DROP
iptables -A INPUT -p tcp ! -s 10.0.0.1 -i eth0 -j DROP
iptables -A INPUT -p tcp ! -s 10.0.0.0/24 -i eth0 -j DROP
規則解釋:

-s #<==指定源地址或網段(192.168.1.0/24)。 ! 取反。
-d #<==指定目的地址(nat表prerouting)。
-i #<==進入的網絡接口(eth0,eth1)。
-o #<==出去的網絡接口(eth0,eth1)。
3.禁止除跳板機以外的IP訪問
iptables -I INPUT -p tcp ! -s 10.0.0.1 -j DROP
4.匹配端口範圍
iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24 -j DROP
iptables -I INPUT -p tcp --dport 3306:8809 -j ACCEPT
iptables -I INPUT -p tcp --dport 18:80 -j DROP #<==最佳
5.匹配ICMP類型
iptables -A INPUT -p icmp --icmp-type 8
例:iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT
6.練習題
1、封掉10.0.0.7

iptables -I INPUT -s 10.0.0.7 -j DROP
2、讓10.0.0.7和SSH客戶端(10.0.0.1)服務器可以Ping,其它的不能Ping

iptables -I INPUT -p icmp --icmp-type 8 -s 10.0.0.7 -j ACCEPT
iptables -I INPUT 2 -p icmp ! -s 10.0.0.1 --icmp-type 8 -j DROP
3、封掉3306端口

iptables -I INPUT -p tcp --dport 3306 -j DROP

iptables企業案例

1.部署一個安全的防火牆
兩種思想:針對默認規則而言。
逛公園:黑名單
1、默認規則默認是允許的狀態。
看電影:白名單
2、默認規則默認是不允許的狀態。更安全。
看電影的思想更安全。
實戰部署:

[root@m01 ~]# iptables -F
[root@m01 ~]# iptables -X
[root@m01 ~]# iptables -Z
[root@m01 ~]# iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
[root@m01 ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@m01 ~]# iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
[root@m01 ~]# iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
[root@m01 ~]# iptables -A INPUT -i lo -j ACCEPT
[root@m01 ~]# iptables -P INPUT DROP
[root@m01 ~]# iptables -P FORWARD DROP
[root@m01 ~]# iptables -P OUTPUT ACCEPT
[root@m01 ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp – 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443
ACCEPT tcp – 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT all – 10.0.0.0/24 0.0.0.0/0
ACCEPT all – 172.16.1.0/24 0.0.0.0/0
ACCEPT all – 0.0.0.0/0 0.0.0.0/0

Chain FORWARD (policy DROP)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
命令集合:

iptables -F
iptables -X
iptables -Z
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 10.0.1.0/24 -j ACCEPT
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -nL
2.局域網共享上網
實驗環境:
m01: 共享上網網關出口
web01: 只有內網地址,網關指向m01
實驗步驟:
m01操作

iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
echo ‘net.ipv4.ip_forward = 1’ >> /etc/sysctl.conf
sysctl -p
iptables -F
iptables -X
iptables -Z
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 10.0.1.0/24 -j ACCEPT
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth1 -d 172.16.1.0/24 -j ACCEPT
web01操作:

[root@web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=eth0
DEVICE=eth0
ONBOOT=no
IPADDR=10.0.0.7
PREFIX=24
GATEWAY=10.0.0.2
DNS1=10.0.0.2

[root@web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=172.16.1.7
GATEWAY=172.16.1.61
PREFIX=24
DNS1=10.0.0.2

[root@web01 ~]# systemctl restart network

[root@web01 ~]# ip r
default via 172.16.1.61 dev eth1 proto static metric 100
172.16.1.0/24 dev eth1 proto kernel scope link src 172.16.1.7 metric 100

[root@web01 ~]# cat /etc/resolv.conf
nameserver 10.0.1.2
web01測試訪問外網:

[root@web01 ~]# ping www.baidu.com
PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data.
64 bytes from 14.215.177.39: icmp_seq=1 ttl=127 time=7.70 ms
64 bytes from 14.215.177.39: icmp_seq=2 ttl=127 time=8.92 ms
3.端口映射
m01操作:

iptables -t nat -A PREROUTING -d 10.0.1.61 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22
命令拆解:

表:nat
鏈:PREROUTING
目標IP:10.0.1.61
目標端口:9000
協議:tcp
動作:DNAT
目標IP:172.16.1.7
目標端口:22
訪問測試:

zhangyadeMacBook-Pro:~ zhangya$ ssh [email protected] -p 9000
[email protected]’s password:
Last login: Tue Aug 20 09:38:42 2019 from 172.16.1.51
[root@web01 ~]#
4.IP映射
[root@m01 ~]# ip a add 10.0.1.62/24 dev eth0 label eth0:0
[root@m01 ~]# iptables -t nat -A PREROUTING -d 10.0.1.62 -j DNAT --to-destination 172.16.1.7
[root@m01 ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp – 0.0.0.0/0 10.0.1.61 tcp dpt:9000 to:172.16.1.7:22
DNAT all – 0.0.0.0/0 10.0.1.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.1.61
測試訪問:

zhangyadeMacBook-Pro:~ zhangya$ ssh [email protected]
[email protected]’s password:
Last login: Wed Aug 21 13:30:04 2019 from 10.0.1.1
[root@web01 ~]# hostname
web01
[root@web01 ~]#

iptables規則保存

iptables-save > 20190821 #將防火牆規則保存到文件中
iptables-save #將防火牆規則保存到配置文件中,防止重啓後失效
iptables-restore < 20190821 #從配置文件裏載入防火牆配置

iptables防坑指南

1.修改之前先導出備份一份
2.修改的時候小心別把自己關在外面
3.可以現在定時任務裏添加一條定時清空的規則,等測試沒問題再取消定時任務

備註

1.從上往下依次匹配
2.一但匹配上,就不在往下匹配了
3.默認規則,默認的情況,默認規則是放行所有

-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

-A INPUT :把這條規則添加到INPUT鏈的最後一行
-p tcp :指定協議爲tcp
-m state --state NEW :匹配TCP的連接狀態
-m tcp --dport 22 :匹配TCP協議的目標端口
-j ACCEPT :執行動作 放行

iptables A INPUT -p tcp -m state --dport 22 -j DROP
禁止一個數據包:
tcp協議
訪問的端口是22

iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -nL
iptables -nL --line-numbers
iptables -D INPUT 1

禁止源地址是10.0.0.7的主機訪問22端口
iptables -A INPUT -p tcp -s 10.0.0.7 --dport 22 -j DROP

禁止源地址是10.0.0.7的主機訪問任何端口
iptables -A INPUT -p tcp -s 10.0.0.7 -j DROP

禁止源地址是10.0.0.8的主機訪問80端口
iptables -A INPUT -p tcp -s 10.0.0.8 --dport 80 -j DROP

禁止除了10.0.0.7以外的地址訪問80端口
iptables -A INPUT -p tcp ! -s 10.0.0.7 --dport 80 -j DROP

2條規則衝突,會以誰先誰爲準
iptables -I INPUT -p tcp -s 10.0.0.7 --dport 22 -j ACCEPT
iptables -I INPUT -p tcp -s 10.0.0.7 --dport 22 -j DROP

禁止10.0.0.7訪問22和80端口
iptables -I INPUT -p tcp -s 10.0.0.7 -m multiport --dport 22,80 -j DROP

禁止10.0.0.7訪問22到100之間的所有端口
iptables -A INPUT -p tcp -s 10.0.0.7 --dport 22:100 -j DROP

禁止所有主機ping
iptables -A INPUT -p icmp --icmp-type 8 -j DROP

放行10.0.0.7可以ping
iptables -I INPUT 2 -p icmp --icmp-type 8 -s 10.0.0.7 -j ACCEPT

只允許10.0.0.7可以ping
ACCEPT icmp – 10.0.0.7 0.0.0.0/0 icmptype 8
DROP icmp – 0.0.0.0/0 0.0.0.0/0 icmptype 8

等同於上一條,優化版,只要不是10.0.0.7就不允許ping
iptables -I INPUT -p icmp --icmp-type 8 ! -s 10.0.0.7 -j DROP

優先級:
匹配頻次最高的條件放前面

100次
80 90
22 10

安全策略:
一種是廣場上巡邏的人,默認認爲大家都是安全的,只有通緝令上的人需要關注
一種是火車進站安檢,默認所有人都是不安全的,只有有票的人才放行

iptables -F
iptables -X
iptables -Z
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -nL

共享上網
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61

-t nat :NAT表
-A POSTROUTING :POSTROUTING鏈
-s 172.16.1.0/24 :源地址172.16.1.0/24
-j SNAT :SNAT 改寫源地址
–to-source 10.0.0.61 :將源地址改寫成10.0.0.61

172.16.1.7發給百度的數據包格式
源端口: 80
目的端口: 80
源IP: 172.16.1.7
目的IP: 百度的IP
網關: 172.16.1.61

如果172.16.1.7想上網,需要改成如下的包格式

10.0.0.61訪問百度
源端口: 80
目的端口: 80
源IP: 10.0.0.61
目的IP: 百度的IP
網關: 10.0.0.2

天坑
如果你的默認規則設置了拒絕所有,又執行了清除規則的語句-F
那就意味着,所有的請求全部都拒絕了
原因是-F不會改變默認規則

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

Chain FORWARD (policy DROP)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

解決:
物理機:
1.去機房自己清空
2.讓機房的人重啓服務器,前提條件是規則沒有寫入配置裏
雲服務器:
直接通過控制檯恢復

如何避免:
1.測試規則之前,先寫個定時任務,每隔5分鐘重啓一次iptables

FORWARD鏈默認爲DROP的時候共享上網失效
解決方法:
第一種,添加2條規則
iptables -A FORWARD -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -d 172.16.1.0/24 -j ACCEPT
第二種:修改FORWARD鏈默認規則爲ACCEPT
iptables -P FORWARD ACCEPT

端口映射:
訪問10.0.0.61的9000端口,跳轉到172.16.1.7的22端口

訪問10.0.0.61的9000端口的數據包格式
源端口: 9000
目的端口: 9000
源IP: 10.0.0.1
目的IP: 10.0.0.61

源端口: 22
目的端口: 22
源IP: 10.0.0.1
目的IP: 172.16.1.7:22

iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22
注意:
改寫數據包的目標IP和端口
用到的是PREROUTING鏈

IP映射:
ip a add 10.0.1.62/24 dev eth0 label eth0:0
iptables -t nat -A PREROUTING -d 10.0.1.62 -j DNAT --to-destination 172.16.1.7

保存命令:
iptables-save
iptables-save > iptables_m01
iptables-restore < iptables_m01
iptables-save > /etc/sysconfig/iptables

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章