iptable之fiter表、nat表
阿新 • • 發佈:2022-04-11
1:防火牆種類及使用說明
- 硬體
- 三層路由:華為H3C(華三)
- 深信服
- juniper
- 軟體
- iptables
- filrewalld
- 雲防火牆
- 阿里雲:安全組(預設的是白名單 防火牆預設規則是拒絕)
2:必須熟悉的名詞
- 容器:瓶子 罐子 存放東西
- 表(table):存放鏈的容器
- 鏈(chain):存放規則的容器
- 規則(policy):准許或拒絕規則 ACCEPT DROP
Netfilter(iptalbes) | 表(tables) | 鏈(chains) | 規則(Policy) |
---|---|---|---|
一棟樓 | 樓裡的房子 | 房子裡的櫃子 | 櫃子裡衣服,擺放規則 |
3:iptables執行過程
工作流程小結:
- 防火牆是層層過濾的,實際是按照配置規則的順序從上到下,從前到後進行過濾的。
- 匹配 表示 阻止還是通過,資料包就不再向下匹配新的規則 。
- 如果規則中沒有明確表明是阻止還是通過的,也就是沒有匹配規則,向下進行匹配,直到匹配預設規則得到明
確的阻止還是通過。 - 防火牆的預設規則是所有規則執行完才執行的。
4:表與鏈
- 4表伍鏈
- 表:
- filter (預設,防火牆功能 准許 拒絕)
- nat表 nat功能
- 內網伺服器上外網(共享上網)
- 埠對映
- mangle(工作中基本不用)所以不學
- raw(工組中基本不用)所以不學
- 表的處理優先順序:raw》mangle》nat》filter
4.1.1:filter表(預設表)
chain | 強調:主要和主機自身相關,真正負責主機防火牆功能的(過濾流入流出主機的資料包) filter表示iptables預設使用的表,這個表定義了三個鏈(chains)企業工作場景:主機防火牆 |
---|---|
INPUT | 負責過濾所有目標地址是本機地址的資料包 通俗來說:就是過濾進入主機的資料包 |
FORWARD | 負責轉發流經主機的資料包。起轉發的作用,和NAT關係很大,後面會詳細介紹 LVS NAT模式,net.ipv4.ip_forward=0 |
OUTPUT | 處理所有源地址是本機地址的資料包 通俗的講:就是處理從主機發出去的資料包 |
4.1.2:nat表
Network Address Translation
chain | 負責網路地址轉換的,即來源與目的IP地址和port的轉換。 應用:和主機本身無關,一般用於區域網共享上網或者特殊的埠轉換服務相關。 工作場景: 1. 用於企業路由(zebra)或閘道器(iptables),共享上網(POSTROUTING) 2. 做內部外部IP地址一對一對映(dmz),硬體防火牆對映IP到內部伺服器,ftp服務 (PREROUTING) 3. WEB,單個埠的對映,直接對映80埠(PREROUTING) 這個表定義了3個鏈,nat 功能相當於網路的acl控制。和網路交換機acl類似 |
---|---|
OUTPUT | 和主機放出去的資料包有關,改變主機發出資料包的目的地址。 |
PREROUTING pre 在.....之前 |
在資料包到達防火牆時,進行路由判斷之前執行的規則,作用是改變資料包的目的地址、 目的埠等 就是收信時,根據規則重寫收件人的地址。 例如:把公網IP:xxx.xxx.xxx.xxx對映到區域網的xx.xx.xx.xx伺服器上。 如果是web服務,可以把80轉換為區域網的伺服器9000埠上 10.0.0.61 8080(目標埠) ----nat---à 10.0.0.7 22 |
POSTROUTING POST 在....之後 |
在資料包離開防火牆時進行路由判斷之後執行的規則,作用改變資料包的源地址,源埠 等。 寫好發件人的地址,要讓家人回信時能夠有地址可回。 例如。預設筆記本和虛擬機器都是區域網地址,在出網的時候被路由器將源地址改為了公網 地址。 生產應用:區域網共享上網。 |
4.1.5:4表五鏈流程
5:環境準備及命命令
iptables 啟動或關閉的命令
yum install -y iptables-services
[root@ISP ~]# rpm -qa | grep iptables
iptables-services-1.4.21-35.el7.x86_64
iptables-1.4.21-35.el7.x86_64
#防火牆相關模組 載入到核心中
#載入防火牆的核心模組
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
[root@ISP ~]# systemctl stop firewalld
[root@ISP ~]# systemctl disable firewalld
[root@ISP ~]# systemctl is-active firewalld
unknown
root@ISP ~]# systemctl start iptables.service
root@ISP ~]# systemctl enable iptables.service
[root@ISP ~]# iptables -F
[root@ISP ~]# 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
Chain l (0 references)
target prot opt source destination
5.1.1:iptables命令引數
引數 | 含義 |
---|---|
-L | 顯示錶中的規則 |
-n | 不要把埠或ip反向解析為名字 |
-t,--table | 指定表 |
-A | append追加最後 准許ACCEPT |
-I(大寫字母I) | insert拒絕的規則放在最上面 |
-D | delete刪除 |
-p | protocal協議 tcp/udp/icmp/all |
--dport | destination目標埠 |
--sport | source src 源埠 |
-s | --source 源ip |
-d | --destination目標ip |
-m | 指定模組 |
-i | --input資料進入的時候 通過哪個網絡卡 |
-o | --output資料流出的 通過的網絡卡 |
-j | --jump滿足條件後的動作:DROP/ACCEPT/REJECT |
-P | 指定鏈設定預設規則 |
-F,--flush | 清楚所有規則,不會處理預設的規則 |
-X | 刪除使用者自定義的鏈 |
-Z | 鏈的計數器清零(資料包計數器與資料包位元組計數器) |
6:配置filter表規則
[root@ISP ~]# iptables -F
[root@ISP ~]# iptables -X
[root@ISP ~]# iptables -Z
[root@ISP ~]# 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
6.1.1:禁止訪問22埠
[root@ISP ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
使用-D可以根據num來刪除規則
6.1.2:禁止ip和短褲訪問
[root@ISP ~]# iptables -I INPUT -s 10.0.0.7 -p tcp --dport 22 -j DROP
[root@ISP ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 10.0.0.7 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
6.1.3:禁止網段連入(禁止10.0.0.0網段訪問8080埠)
[root@ISP ~]# yum -y install nc
[root@ISP ~]# nc -l 8080
[root@ISP ~]# nc -l 8080
你好呀
[root@ISP ~]# netstat -lntup | grep 8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 24499/nc
tcp6 0 0 :::8080 :::* LISTEN 24499/nc
[root@server ~]# telnet 10.0.0.12 8080
Trying 10.0.0.12...
Connected to 10.0.0.12.
Escape character is '^]'.
你好呀
^] #《==按Ctrl + 】退出
telnet> q
Connection closed.
[root@ISP ~]# nc -l 8080 > /etc/hosts.txt
[root@server ~]# cat /etc/hosts | nc 10.0.0.12 8080
[root@ISP ~]# cat /tmp/hosts.txt
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
- 禁止117.136.81.0網段訪問8080埠
[root@ISP ~]# iptables -I INPUT -s 117.136.81.0/24 -p tcp --dport 8080 -j DROP
[root@ISP ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 117.136.81.0/24 0.0.0.0/0 tcp dpt:8080
DROP tcp -- 10.0.0.7 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@ISP ~]# nc -l 8080
我去
[root@server ~]# telnet -S 117.136.81.1 117.136.81.254 8080
telnet: Warning: -S ignored, no parsetos() support.
Trying 117.136.81.254...
[root@server ~]# telnet -S 10.0.0.11 10.0.0.12 8080
telnet: Warning: -S ignored, no parsetos() support.
Trying 10.0.0.12...
Connected to 10.0.0.12.
Escape character is '^]'.
我去
6.1.4:只允許指定網段連入(允許10.0.0.0網段)
[root@ISP ~]# iptables -I INPUT ! -s 10.0.0.0/24 -j DROP
#感嘆號表示取反,意思就變成了除了10.0.0.0/24其他都拒絕
[root@ISP ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- !10.0.0.0/24 0.0.0.0/0
DROP tcp -- 117.136.81.0/24 0.0.0.0/0 tcp dpt:8080
DROP tcp -- 10.0.0.7 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@ISP ~]# nc -l 2222
我是最帥的
[root@server ~]# telnet -b 10.0.0.11 10.0.0.12 2222
Trying 10.0.0.12...
Connected to 10.0.0.12.
Escape character is '^]'.
我是最帥的
#另外還要注意一個問題,如果加了感嘆號和沒加感嘆號兩條源IP相同的規則,他會優先匹配沒有加感嘆號的規則。
6.1.5:指定多個端埠
[root@ISP ~]# iptables -I INPUT -p tcp -m multiport ! --dport 80,443 -j DROP
#表示進埠為80,443兩個埠除外的其他所有埠全部拒絕
[root@ISP ~]# iptables -I INPUT -p tcp --dport 1024:65535 -j DROP
#表示進埠1024到65535範圍的全部埠都拒絕
6.1.6:匹配ICMP型別
- ping
- tracert(windows)traceroute(linux)路由跟蹤
- ICMP(Internet Control Message Protocol) Internet控制報文協議
通過核心引數控制 禁止被ping
[root@ISP ~]# cat /etc/sysctl.conf
net.ipv4.icmp_echo_ignore_all = 1
[root@ISP ~]# sysctl -p
net.ipv4.icmp_echo_ignore_all = 1
通過防火牆規則 控制是否可以ping
[root@ISP ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
###iptables -I INPUT -p icmp --icmp-type any -j DROP
#如果想要匹配所有icmp型別可以指定any
[root@ISP ~]# 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
Chain l (0 references)
target prot opt source destination
6.1.7:匹配網路狀態(TCP/IP連線狀態)
- -m state --state
- NET:已經或將啟動新的連線
- ESTABLISHED:已建立的連線
- RELATED:正在啟動的新連線
- INVALID:非法或無法識別的
[root@ISP ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@ISP ~]# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@ISP ~]# netstat -antup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 7277/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 7264/sshd
tcp 0 36 10.0.0.12:22 10.0.0.253:63776 ESTABLISHED 26467/sshd: root@pt
tcp 0 0 10.0.0.12:22 10.0.0.253:62425 ESTABLISHED 24519/sshd: root@pt
tcp6 0 0 :::22 :::* LISTEN 7264/sshd
6.1.8:限制併發及速率
[root@ISP ~]# iptables -I INPUT -p icmp --icmp-type 8 -j ACCEPT
[root@ISP ~]# iptables -I INPUT -p icmp --icmp-type 8 -m limit --limit 6/m --limit-burst 5 -j ACCEPT
#結合起來意思每分鐘可以請求6次,也就是60s/6=10s,每10s可請求一次,可儲存5次
#例子:
假設現在PC1想要ping PC2,PC1可以連續ping通5次,到了第6次的時候就無法ping通了,需要等待10s後才能ping通一次,然後又無法ping通了,過了將近50秒,又可以連續ping通5次,到了第6次的時候又無法ping通,依此類推
-m limit --limit n/{second/minute/hour};
解釋:指定時間內的請求速率”n”為速率,後面為時間分別為:秒 分 時
--limit-burst [n]
解釋:在同一時間內允許通過的請求”n”為數字,不指定預設為5
6.1.9:防火牆規則的儲存與恢復
#@<++++++++++++++++++++++
[root@ISP ~]# iptables-save
# Generated by iptables-save v1.4.21 on Mon Apr 11 14:12:27 2022
*nat
:PREROUTING ACCEPT [998:62210]
:INPUT ACCEPT [913:57075]
:OUTPUT ACCEPT [6:476]
:POSTROUTING ACCEPT [6:476]
-A POSTROUTING -s 117.136.81.0/24 -j SNAT --to-source 10.0.0.12
COMMIT
# Completed on Mon Apr 11 14:12:27 2022
# Generated by iptables-save v1.4.21 on Mon Apr 11 14:12:27 2022
*filter
:INPUT ACCEPT [111:29529]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:l - [0:0]
-A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 6/min -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Mon Apr 11 14:12:27 2022
#@<++++++++++++++++++++++
[root@ISP ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Mon Apr 11 10:31:45 2022
*nat
:PREROUTING ACCEPT [465:28520]
:INPUT ACCEPT [153:9607]
:OUTPUT ACCEPT [11:1188]
:POSTROUTING ACCEPT [11:1188]
COMMIT
# Completed on Mon Apr 11 10:31:45 2022
# Generated by iptables-save v1.4.21 on Mon Apr 11 10:31:45 2022
*filter
:INPUT DROP [462:89115]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [415:43376]
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p icmp -m limit --limit 12/min -j ACCEPT
COMMIT
# Completed on Mon Apr 11 10:31:45 2022
#@<++++++++++++++++++++++
[root@ISP ~]# iptables-save > /etc/sysconfig/iptables
[root@ISP ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Mon Apr 11 14:13:20 2022
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Mon Apr 11 14:13:20 2022
# Generated by iptables-save v1.4.21 on Mon Apr 11 14:13:20 2022
*filter
:INPUT DROP [5:1455]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4:376]
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p icmp -m limit --limit 12/min -j ACCEPT
COMMIT
# Completed on Mon Apr 11 14:13:20 2022
#@<++++++++++++++++++++++
[root@ISP ~]# iptables -F
[root@ISP ~]# 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@ISP ~]# iptables-restore < /etc/sysconfig/iptables
[root@ISP ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8 limit: avg 6/min burst 5
ACCEPT 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
iptables | 管理命令 |
iptables-save | 當前正在使用的防火牆規則輸出 |
iptables-restore | 從檔案中讀取防火牆規則並生效 |
7:配置nat表規則
nat表 案例 | |
---|---|
1、共享上網(沒有公網ip的伺服器 上網) | |
2、埠對映(轉發) | |
3、ip對映 |
[root@ISP ~]# iptables -P INPUT ACCEPT
[root@ISP ~]# iptables -P FORWARD ACCEPT
[root@ISP ~]# iptables -nL
Chain INPUT (policy ACCEPT) #<==
target prot opt source destination
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8 limit: avg 6/min burst 5
ACCEPT 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@ISP ~]# iptables -F
[root@ISP ~]# 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
7.1.1:實現共享上網
- 物理伺服器/虛擬機器
- 雲伺服器:
- 防火牆配置
[root@ISP ~]# hostname -I
10.0.0.12 117.136.81.254 10.1.1.1
[root@ISP ~]# iptables -t nat -A POSTROUTING -s 117.136.81.0/24 -j SNAT --to-source 10.0.0.12
[root@ISP ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@ISP ~]# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.icmp_echo_ignore_all = 0
[root@server ~]# hostname -I
10.0.0.11 117.136.81.1
[root@server ~]# ping www.baidu.com
PING www.a.shifen.com (36.152.44.96) 56(84) bytes of data.
64 bytes from localhost (36.152.44.96): icmp_seq=1 ttl=127 time=23.9 ms
64 bytes from localhost (36.152.44.96): icmp_seq=2 ttl=127 time=18.3 ms
64 bytes from localhost (36.152.44.96): icmp_seq=3 ttl=127 time=19.0 ms
^C
--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2008ms
rtt min/avg/max/mdev = 18.365/20.477/23.999/2.511 ms
[root@ISP ~]# iptables -nL -t nat
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
SNAT all -- 117.136.81.0/24 0.0.0.0/0 to:10.0.0.12
注意事項: 公網ip不固定: iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth1 -j MASQUERADE
MSAQUERADE配合-o指定公網介面,有些公網介面IP變化,比如PPOE撥號這樣的,那麼就會自動轉換公網介面任意公網IP
7.1.2:實現埠轉發
[root@ISP ~]# yum -y install nginx
[root@ISP ~]# vim /etc/nginx/nginx.conf
server {
listen 10.1.1.1:80; #<==只允許監聽10.1.1.1
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
[root@ISP ~]# systemctl restart nginx
[root@ISP ~]# cd /usr/share/nginx/html/
[root@ISP html]# rm -rf *
[root@ISP html]# echo "我是最帥的" > index.html
[root@ISP html]# systemctl start nginx
[root@ISP html]# netstat -lntup | grep -o 80 | wc -l
1
[root@ISP html]# iptables -t nat -A PREROUTING -d 117.136.81.254 -p tcp --dport 9000 -j DNAT --to-destination 10.1.1.1:80
#這個就表示當所有源地址訪問目標為117.136.81.254的9000埠時,則轉發到10.1.1.1:80上
[root@server ~]# curl 117.136.81.254:9000
我是最帥的
7.1.3:實現IP對映
[root@ISP ~]# iptables -t nat -F
[root@ISP ~]# 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
[root@ISP ~]# iptables -t nat -A PREROUTING -d 117.136.81.254 -j DNAT --to-destination 10.1.1.2
##10.1.1.2是另外一臺主機RTA,這裡對映IP 117.136.81.254其實就是這個IP的任何協議、任何埠都會被對映到10.1.1.2上
[root@server ~]# ssh 117.136.81.254
[email protected]'s password:
Last login: Mon Apr 11 15:01:02 2022 from 117.136.81.1
[root@RTA ~]# exit
logout
Connection to 117.136.81.254 closed.
[root@server ~]# curl 117.136.81.254:80 2> /dev/null| wc -l
16