1)Linux下的防火墻概念
a、一般談到Linux下的防火墻,我們都會首先想到iptables,其實更確切的叫法應該是Netfilter/iptables,iptables和Netfilter其實是存在差別的。
b、盡管它們經常被用來相互替換使用,Netfilter是用來實現Linux內核中防火墻的Linux內核空間程序代碼段,它要么被直接編譯進內核,要么被包含在模塊中。
c、而iptables是用來管理Netfilter防火墻的用戶程序,而我這里提到的iptables是包含Netfiler和iptables。
d、Netfilter/iptables是基于包過濾的防火墻,主要是針對2-4層,另外,iptables也支持7層控制。
2)iptables的組成部分:
iptables有四個表和五個鏈以及一些規則組成:
四個表:filter、nat、mangle、raw
filter表(過濾規則表),nat表(地址轉換規則表),mangle(修改數據標記位規則表),raw(跟蹤數據表規則表)
其中最常用的是filter表以及nat表
五個鏈:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING
iptables的命令語法:
iptables [-t 表名]<-A|-I|-D|-R>鏈名[規則編號][-i|-o 網卡名稱][-p 協議類型][-s 源IP地址|源子網][–sport 源端口號][-d 目標IP地址|目標子網][–dport 目標端口號]<-j 動作>
3)參數及動作信息
-A 追加防火墻規則
-D 刪除防火墻規則
-I 插入防火墻規則
-F 清空防火墻規則
-L 列出防火墻規則
-R 替換防火墻規則
-Z 清空防火墻數據表統計信息
-P 設置鏈默認規則
匹配參數:
-p 匹配協議
-s 匹配源地址
-d 匹配目標地址
-i 匹配入站網卡接口
-o 匹配出站網卡接口
–sport 匹配源端口
–dport 匹配目標端口
–src-range 匹配源地址范圍
–dst-range 匹配目標地址范圍
–limit 匹配數據表速率
–mac-source 匹配源MAC地址
–state 匹配狀態(INVALID、ESTABLISHED、NEW、RELATED)
–string 匹配應用層字串
觸發動作:
ACCEPT 允許數據包通過
DROP 丟棄數據包
REJECT 拒絕數據包通過,并發回封包通知對方
LOG 將數據包信息記錄syslog日志
DNAT 目標地址轉換
SNAT 源地址轉換(適用于靜態IP)
MASQUERADE 地址欺騙(只能用于ADSL撥號上網的IP偽裝,也就是主機的IP是由ISP分配動態的)
REDIRECT 重定向,將數據包重定向到本機或另外主機的某一個端口,通常能實現透明代理或者對外開放內網的某些服務
4)常用的命令
a、查看filter表的所有規則:
[root@localhost ~]# iptables -n -L 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
b、清空filter表的所有規則:
[root@localhost ~]# iptables -F
c、查看nat表的所有規則:
[root@localhost ~]# iptables -t nat -n -L
# 記錄10.10.10.1訪問主機80端口的日志信息(/var/log/messages)
[root@localhost ~]# iptables -I INPUT -s 10.10.10.1 -p tcp --dport 80 -j LOG [root@localhost ~]# tail -10 /var/log/messages Jul 13 14:44:53 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10253 DF PROTO=TCP SPT=62700 DPT=80 WINDOW=253 RES=0x00 ACK FIN URGP=0 Jul 13 14:44:55 localhost chronyd[829]: Selected source 202.118.1.130 Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10256 DF PROTO=TCP SPT=62701 DPT=80 WINDOW=256 RES=0x00 ACK FIN URGP=0 Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10257 DF PROTO=TCP SPT=62702 DPT=80 WINDOW=256 RES=0x00 ACK FIN URGP=0 Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10258 DF PROTO=TCP SPT=62703 DPT=80 WINDOW=256 RES=0x00 ACK FIN URGP=0 Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10259 DF PROTO=TCP SPT=62704 DPT=80 WINDOW=256 RES=0x00 ACK FIN URGP=0 Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10260 DF PROTO=TCP SPT=62701 DPT=80 WINDOW=256 RES=0x00 ACK URGP=0 Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10261 DF PROTO=TCP SPT=62702 DPT=80 WINDOW=256 RES=0x00 ACK URGP=0 Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10262 DF PROTO=TCP SPT=62703 DPT=80 WINDOW=256 RES=0x00 ACK URGP=0 Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10263 DF PROTO=TCP SPT=62704 DPT=80 WINDOW=256 RES=0x00 ACK URGP=0
# 將來自10.10.10.0/24網段的主機并訪問80端口的請求給予拒絕
[root@localhost ~]# iptables -I INPUT -s 10.10.10.0/24 -p tcp --dport 80 -j DROP [root@localhost ~]# iptables -n -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 10.10.10.0/24 0.0.0.0/0 tcp dpt:80 LOG tcp -- 10.10.10.1 0.0.0.0/0 tcp dpt:80 LOG flags 0 level 4 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
# 禁止10.10.10.0/24網段內的主機ping。ICMP類型為8
[root@localhost ~]# iptables -A INPUT -s 10.10.10.0/24 -p icmp --icmp-type 8 -j DROP 說明:禁止10.10.10.0/24網段內的主機ping
# 查看filter表中防火墻規則并顯示規則編號:
[root@localhost ~]# iptables -nL --line-number Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP tcp -- 10.10.10.0/24 0.0.0.0/0 tcp dpt:80 2 LOG tcp -- 10.10.10.1 0.0.0.0/0 tcp dpt:80 LOG flags 0 level 4 3 DROP icmp -- 10.10.10.0/24 0.0.0.0/0 icmptype 8 Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination
# -D參數,刪除INPUT鏈的第三條規則:
[root@localhost ~]# iptables -D INPUT 3 [root@localhost ~]# iptables -nL --line-number Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP tcp -- 10.10.10.0/24 0.0.0.0/0 tcp dpt:80 2 LOG tcp -- 10.10.10.1 0.0.0.0/0 tcp dpt:80 LOG flags 0 level 4 Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination
# -R參數,替換第二條規則
[root@localhost ~]# iptables -R INPUT 2 ! -s 10.10.10.1 -p tcp --dport 80 -j ACCEPT [root@localhost ~]# iptables -nL --line-number Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP tcp -- 10.10.10.0/24 0.0.0.0/0 tcp dpt:80 2 ACCEPT tcp -- !10.10.10.1 0.0.0.0/0 tcp dpt:80 Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination
# 查看iptables的版本號:
[root@localhost ~]# iptables -V iptables v1.4.21 [root@localhost ~]# iptables -A INPUT -i lo -j ACCEPT [root@localhost ~]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
# CentOS7下iptables的安裝:
CentOS 7 默認使用firewalld來管理iptables規則,由于防火墻規則變動的情況很少,動不動態變得無所謂了。但是總是感覺不太習慣。 使用下面的辦法來恢復原來的習慣,同時解決iptables開機啟動的問題。 # yum install iptables-services -y # systemctl enable iptables 這樣的話,iptables服務會開機啟動,自動從/etc/sysconfig/iptables 文件導入規則。 為了讓/etc/init.d/iptables save 這條命令生效,需要這么做 # cp /usr/libexec/iptables/iptables.init /etc/init.d/iptables # /etc/init.d/iptables save 而chkconfig iptables 命令會自動重定向到sytemctl enable iptables
# 定義iptables默認策略
默認策略的定義格式為:
iptables [-t 表名] <-P> <鏈名> <動作>
查看iptables的狀態
[root@ip-172-31-22-8 ~]# /etc/init.d/iptables status Table: filter Chain INPUT (policy ACCEPT) num target prot opt source destination Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination [root@localhost ~]# iptables -I INPUT -s 10.10.10.0/24 -p tcp --dport 80 -j ACCEPT [root@localhost ~]# iptables -I INPUT -s 10.10.10.0/24 -p tcp --dport 22 -j ACCEPT [root@localhost ~]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 10.10.10.0/24 0.0.0.0/0 tcp dpt:22 ACCEPT tcp -- 10.10.10.0/24 0.0.0.0/0 tcp dpt:80 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
5)iptables的狀態state
下面解釋iptables的幾種狀態:
NEW:如果你的主機向遠程主機發出一個請求連接,這個數據包的狀態就是NEW
ESTABLISHED:已建立的連接(完成TCP的三次握手后),遠程主機和你的主機通信數據狀態為ESTABLISHED
RELATED:正在啟動新連接,比如FTP服務傳輸,21端口負責傳送命令,20端口負責傳輸數據,在已有的21端口建立好連接后發生命令,這時候20端口或其他端口傳送FTP-DATA,狀態就是RELEATED
INVALID:非法或無法識別的數據包,不能被識別屬于哪個連接或者沒有任何狀態,通常這種狀態包會被丟棄
iptables腳本的基本模板:
#!/bin/bash #created by molewan 2016/07/16 #email:molewan@163.com iptables -F iptables -F -t nat iptables -X iptables -Z iptables -P INPUT DROP iptables -A INPUT -m state --state NEW -j DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
6)生產環境中我們如何維護我們的iptables
系統運維人員在維護iptables的時候,經常會發現誤操作了iptables導致無法進入了系統,這個時候只有去機房重啟iptables,其實這個也是有辦法解決的,可以通過配置
計劃任務的方式來處理:
[root@ip-172-31-22-8 ~]# crontab -l */5 * * * * /etc/init.d/iptables stop
7)iptables防火墻應用案例:
案例1:允許任意客戶端訪問主機的日常服務(HTTP、HTTPS、DNS、NTP、SMTP、POPS3、SSH)
[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT [root@localhost ~]# iptables -A INPUT -p udp --dport 25 -j ACCEPT [root@localhost ~]# iptables -A INPUT -P tcp --dport 53 -j ACCEPT [root@localhost ~]# iptables -A INPUT -p udp --dport 53 -j ACCEPT [root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT [root@localhost ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT [root@localhost ~]# iptables -A INPUT -p tcp --dport 143 -j ACCEPT [root@localhost ~]# iptables -P INPUT DROP [root@localhost ~]# iptables -P OUTPUT ACCEPT [root@localhost ~]# iptables -P FORWARD DROP [root@localhost ~]# iptables -n -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:25 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:110 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:143 Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@localhost ~]# cat /etc/services #可以在此文件中查看服務的名稱
案例2:公司擁有一個公有IP,使用防火墻實現局域網中所有主機通過SNAT共享上網。
原理:使用CentOS7作為公司軟路由,將內網192.168.0.0/24的數據包源地址修改為路由器上的公有IP 124.126.199.84
,使用SNAT規則,以及NAT表的POSTROUTING鏈
先開啟系統上的路由轉發:
# vim /etc/sysctl.conf net.ipv4.ip_forward = 1 # sysctl -p # iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 124.126.199.84
案例3:公司對外有一個公網IP,公司內部有HTTP、MAIL兩臺核心服務器,通過防火墻實現客戶可以從互聯網的任意位置訪問公司內部的兩臺服務器資源
拓撲; Internet <--124.126.199.84(防火墻)-->192.168.0.0/24 http:192.168.0.100 postfix:192.168.0.101 處理過程: 開啟路由轉發: # vim /etc/sysctl.conf net.ipv4.ip_forward = 1 # sysctl -p 針對80端口的 # iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100 針對25端口和110端口 # iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.101 # iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 110 -j DNAT --to-destination 192.168.0.101
案例4:目前網絡的攻擊手法層出不窮,很多攻擊會采用發生大量無效的數據包給服務器,造成服務器無法響應正常的請求包,iptables
提供了一個limit擴展功能,可以限制單位時間內數據包的個數。下面的規則是當每秒鐘數據包個數為500接受入站連接,負責拒絕連接。
[root@localhost ~]# iptables -I INPUT -m limit --limit 500/sec -j ACCEPT [root@localhost ~]# iptables -P INPUT DROP [root@localhost ~]# iptables -n -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 limit: avg 500/sec burst 5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:25 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:110 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:143 Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source
案例5:根據數據連接狀態設置防火墻規則,放行所有出站數據包,拒絕入站的新連接請求和無效連接,放行入站的回應請求
[root@localhost ~]# iptables -F [root@localhost ~]# iptables -X [root@localhost ~]# iptables -Z [root@localhost ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT [root@localhost ~]# iptables -I INPUT -m state --state NEW -j DROP [root@localhost ~]# iptables -P OUTPUT ACCEPT [root@localhost ~]# iptables -n -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP all -- 0.0.0.0/0 0.0.0.0/0 state NEW ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
案例6:公司采用基于Linux的軟路由設備,要求在路由設備上設置防火墻規格,記錄10.0.0.1至10.0.0.128地址段內所有的主機發送給路由要求轉發的數據包,并允許轉發這些數據包
[root@localhost ~]# iptables -A FORWARD -m iprange --src-range 10.0.0.1-10.10.0.11 -p tcp --dport 80 -j LOG [root@localhost ~]# iptables -A FORWARD -m iprange --src-range 10.0.0.1-10.10.0.11 -p tcp --dport 80 -j ACCEPT[root@localhost ~]# iptables -n -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP all -- 0.0.0.0/0 0.0.0.0/0 state NEW ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED Chain FORWARD (policy DROP) target prot opt source destination LOG tcp -- 0.0.0.0/0 0.0.0.0/0 source IP range 10.0.0.1-10.10.0.11 tcp dpt:80 LOG flags 0 level 4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 source IP range 10.0.0.1-10.10.0.11 tcp dpt:80 Chain OUTPUT (policy ACCEPT) target prot opt source destination
一次性允許多端口通過:
[root@localhost ~]# iptables -I INPUT -s 10.10.10.0/24 -p tcp -m multiport --dport 21,22,23,80 -j ACCEPT [root@localhost ~]# iptables -n -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 10.10.10.0/24 0.0.0.0/0 multiport dports 21,22,23,80 DROP all -- 0.0.0.0/0 0.0.0.0/0 state NEW ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED Chain FORWARD (policy DROP) target prot opt source destination LOG tcp -- 0.0.0.0/0 0.0.0.0/0 source IP range 10.0.0.1-10.10.0.11 tcp dpt:80 LOG flags 0 level 4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 source IP range 10.0.0.1-10.10.0.11 tcp dpt:80 Chain OUTPUT (policy ACCEPT) target prot opt source destination
原創文章,作者:Net21-冰凍vs西瓜,如若轉載,請注明出處:http://www.www58058.com/24293