歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> Linux下使用iptables

Linux下使用iptables

日期:2017/3/1 12:06:49   编辑:關於Linux

關於iptables

什麼是iptables?

常見於linux系統下的應用層防火牆工具。

使用iptables的人員

系統管理人員:基於iptables的NAT的包轉發,linux主機安全策略
網絡工程人員:局域網網絡控制或對員工上網行為的控制,機房中用來替換昂貴的網絡設備
安全人員:利用iptables內核或策略做安全設置

場景

模擬用iptables控制並發的http訪問
機器分配:

機器類型 IP地址 主機名 server [IP2]10.10.163.233 Jeson233 client [IP1]10.10.163.232 Jeson232

場景描述:
IP1(通過ab命令進行壓力測試)->IP2(http服務)

[root@Jeason232 ~]# ab -n 1000000 -c 40 http://10.10.163.233/test.txt

// 服務器設置iptables後,這裡顯示有拒絕訪問的情況
// 查看服務器是否運行
[root@Jeason233 ~]#/etc/init.d/httpd status
// 查看服務器負載
#w 
// 查看服務器並發情況
#netstat -an |grep 80|grep 10.10.163.232|grep EST -c
// 設置iptables
#iptables -I INPUT -p tcp --dport 80 -s 10.10.163.232 -m connlimit --connlimit-above 10 -j REJECT

學習iptables的意義

使用iptables搭建一套符合企業實際使用的防火牆規則 使用iptables進行防攻擊 使用iptables進行數據包轉發 明白iptables的強大及實際使用意義

Netfilter

什麼是Netfilter

NetFilter是Linux操作系統核心層內部的一個數據包處理模塊

什麼是Hook point

數據包在內核Netfilter中的五個掛載點其中包括:PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING。

Netfilter與iptables

這裡寫圖片描述<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxoMSBpZD0="iptables規則組成">iptables規則組成

組成部分:四張表+五條鏈(Hook point) + 規則

四張表:filter表、nat表、mangle表、raw表
filter表:訪問控制、規則匹配
nat表:地址轉發
mangle表:修改數據包,改變包頭中內容(TTL、TOS、MARK),需要交換機支持
raw表:數據包狀態跟蹤和分析

五條鏈:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING

這裡寫圖片描述

iptables規則組成

數據包訪問控制:ACCEPT、DROP(無返回信息)、REJECT(有返回信息)
數據包改寫:SNAT、DNAT
信息記錄:LOG
這裡寫圖片描述

iptables配置

場景一

規則1、對所有的地址開放本機的tcp(80、22、10-21)端口的訪問
規則2、允許對所有的地址開放本機的基於ICMP協議的數據包訪問
規則3、其他未被允許的端口禁止訪問

// 查看iptables版本
#iptables -v
// 查看iptables中已經設置的規則
#iptables -L
// 讓主機名等不顯示出來
#iptables -nL
// 清除iptables之前設置的規則
#iptables -F

// iptables設置規則1
#iptables -I INPUT -p tcp --dport 80 -j ACCEPT
#iptables -I INPUT -p tcp --dport 22 -j ACCEPT
#iptables -I INPUT -p tcp --dport 10:21 -j ACCEPT

// iptables設置規則2
#iptables -I INPUT -p icmp -j ACCEPT

// iptables設置規則3
#iptables -A INPUT -j REJECT

// 刪除訪問80端口的規則,並設置80端口不可訪問
#iptables -D INPUT -p tcp --dport 80 -j ACCEPT
#iptables -I INPUT -p tcp --dport 80 -j REJECT

iptables配置存在的問題
1 本機無法訪問本機
2 本機無妨訪問其他主機

// 修改上面規則設置
#iptables -I INPUT -i lo -j ACCEPT
#ipatables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

在場景一基礎上,只允許10.103.188.233訪問本機的http服務

#iptables -D INPUT -p tcp --dport 80 -j ACCEPT
#iptables -nL
#iptables -I INPUT -p tcp -s 10.10.188.233 --dport 80 -j ACCEPT

場景二

1、ftp主動模式下iptables的規則設置
2、ftp被動模式下iptables的規則設置

ftp主動模式下iptables的規則設置

這裡寫圖片描述
1、ftp兩節的默認模式為被動模式
2、vsftpd服務支持主動模式需要注意配置選項

port_enable=yes
connect_from_port_20=YES

3、iptables需要開啟21端口的訪問權限

#iptables -F
#iptables -I INPUT -p tcp -dport 21 -j ACCEPT
#iptables -I INPUT -p tcp -dport 22 -j ACCEPT
#iptables -I INPUT -p icmp -j ACCEPT
#iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#iptables -A INPUT -j REJECT
#iptables -nL

ftp被動模式下iptables的規則設置

這裡寫圖片描述
方法一:
為vsftpd指定數據端口,並且通過iptables開放相應需要傳輸的端口端

#iptables -I INPUT -p tcp --dport 21 -j ACCEPT
#vim /etc/vsftpd/vsftpd.conf
pasv_min_port=50000
pasv_max_port=60000
#iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT

方法二:
使用連接追蹤模塊

#iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#iptables -I INPUT -p tcp --dport 21 -j ACCEPT
// 1 臨時加載 nf_conntrack_ftp模塊
#modprobe nf_conntrack_ftp 
// 2 永久加載nf_conntrack_ftp模塊
#vim /etc/sysconfig/iptables-config 
IPTABLES_MODULES="nf_conntrack_ftp"

場景三

1、員工在公司內部(10.10.155.0/24,10.10.188.0/24)能訪問服務器上的任何服務
2、當員工出差例如在上海,通過VPN連接到公司
外網(員工)—撥號到—->VPN服務器—–>內容FTP、SAMBA、NFS、SSH
3、公司有一個門戶網站需要允許公網訪問

常見端口梳理:
常見允許外網訪問的服務

服務 協議 端口 網站 www http 80/tcp https 443/tcp 郵件mail smtp 25/tcp smtps 465/tcp pop3 110/tcp pop3s 995/tcp imap 143/tcp

一些常見不允許外網訪問的服務

服務 協議 端口 文件服務器 NFS 123/udp SAMBA 137,138,139/tcp 445/tcp FTP 20/tcp,21/tcp 遠程管理 ssh 22/tcp 數據庫 MYSQL 3306/tcp ORACLE 1521/tcp

配置規則基本思路
ACCEPT規則:

允許本地訪問 允許已監聽狀態數據包通過 允許規則中允許的數據包通過(注意開放ssh遠程管理端口)

DENY規則:

拒絕未被允許的數據包 iptables規則保存成配置文件,防止宕機或誤刪除。
#iptables -F
#iptables -I INPUT -i lo -j ACCEPT
#iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#iptables -L
#iptables -A INPUT -s 10.10.155.0/24 -j ACCEPT
#iptables -A INPUT -s 10.10.188.0/24 -j ACCEPT

#iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#iptables -A INPUT -p tcp --dport 1723 -j ACCEPT // VPN
#iptables -I INPUT -p icmp -j ACCEPT

#iptables -A INPUT -j REJECT
// 保存iptables設置方法一
// 保存設置到配置文件中(一般為/etc/sysconfig/iptables)
#/etc/init.d/iptables save
#cat /etc/sysconfig/iptables

// 設置iptables服務開機啟動
chkconfig iptables on
// 保存iptables設置方法二
// 把iptables執行的命令保存成shell腳本,如:/opt/iptables_set.sh
// 把/bin/sh /opt/iptables_set.sh 保存到/etc/rc.local這個開啟啟動的配置文件

iptables防火牆nat表規則配置

分類 功能 作用鏈 SNAT 源地址轉換 出口 POSTROUTING DNAT 目標地址轉換 進口 PREROUTING

SNAT場景模擬

這裡寫圖片描述

// 准備工作
// Server: 10.10.188.173上安裝http服務,並在web目錄上放置hello.txt文件
// NAT Server: 兩個網卡:10.10.188.232和10.10.177.232
// Client: 10.10.177.233
// NAT Server:10.10.177.232
// 設置內核參數允許轉發
#vim /etc/sysctl.conf
net.ipv4.ip_forward=1 // 開啟轉發
// 執行內核參數
#sysctl -p
// 查看轉發設置是否生效
#sysctl -a|grep ip_forward
// 設置SNAT轉發
#iptables -t nat -A POSTROUTING -s 10.10.177.0/24 -j SNAT --to 10.10.188.232
#iptables -t nat -L
// Client: 10.10.177.233
// 確保client的網關為10.10.177.232
// 1 /etc/sysconfig/network中設置GATWAY=10.10.177.232
// 2 route add 0.0.0.0 gw 10.10.177.232

// 進行測試
#curl http://10.10.188.173/hello.txt

DNAT場景模擬

這裡寫圖片描述

// Nat Server: 10.10.177.232和10.10.188.232
// 確定未開啟80端口
// 清除nat表中轉發規則

#iptables -t nat -A PREROUTING -d 10.10.188.232 -p tcp --dport 80 -j DNAT --to 10.10.177.233:80
// Server:10.10.177.233 
// 確保開啟web服務
// Client:10.10.188.173
#curl http://10.10.188.232/hello.txt

iptables防火牆防CC攻擊

connlimit模塊

作用:用於限制每一個客戶端ip的並發連接數。
參數:-connlimit-above n 限制並發個數

#iptables -I INPUT -p tcp -syn -dport 80 -m connlimit -connlimit-above 100 -j REJECT

Limit模塊

作用:限速,控制流量

// 每小時3個包
#iptables -A INPUT -m limit --limit 3/hour 

// --limit-burst 10 超過10個流量按照每分鐘1個
#iptables -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT
#iptables -A INPUT -p icmp -j DROP

// 使用其他機器的測試結果:超過10個一分鐘允許1個icmp包訪問

iptables實例腳本

1、系統化的介紹iptables規則配置
2、相應介紹iptables中的其他模塊
3、防攻擊策略的補充

// 實例腳本:example_iptables.sh

/bin/sh
# 加載模塊
modprobe ipt_MASQUERADE
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp

# 清除原iptables規則
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -X

# iptables配置
iptables -P INPUT DROP #如果滿足以下規則放行,不滿足則丟棄
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -p tcp -m multiport --dports 110,80,25 -j ACCEPT
iptables -A INPUT -p tcp -s 10.10.0.0/24 --dport 139 -j ACCEPT

iptables -A INPUT -i eth1 -p udp -m multiports --dports 53 -j ACCEPT

iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -p gre -j ACCEPT

iptables -A INPUT -s 192.186.0.0/24 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP

iptables -A INPUT -p icmp -j DROP

iptables -t nat -A POSTROUTING -o ppp0 -s 10.10.0.0/24 -j MASUERADE

iptables -N syn-flood
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN
iptables -A syn-flood -j REJECT


iptables -P FORWARD DROP
iptables -A FORWARD -p tcp -s 10.10.0.0/24 -m multiport --dports 80,110,21,25,1723 -j ACCEPT
iptables -A FORWARD -p udp -s 10.10.0.0/24 --dport 53 -j ACCEPT
iptables -A FORWARD -p gre -s 10.10.0.0/24 -j ACCEPT
iptables -A FORWARD -p icmp -s 10.10.0.0/24 -j ACCEPT

# 上班時間禁止上qq
iptables -A FORWARD -m state --state ESTABLISHED,RELATE -j ACCEPT
iptables -I FORWARD -p udp --dport 53 -m string --string "tencent" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
iptables -I FORWARD -p udp --dport 53 -m string --string "TENCENT" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
iptables -I FORWARD -p udp --dport 53 -m string --string "tencent" -m time --timestart 13:30 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
iptables -I FORWARD -p udp --dport 53 -m string --string "TENCENT" -m time --timestart 13:30 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
iptables -I FORWARD -p udp --dport 53 -m string --string "qq.com" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
iptables -I FORWARD -p udp --dport 53 -m string --string "qq.com" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
iptables -I FORWARD -p udp --dport 53 -m string --string "qq.com" -m time --timestart 13:30 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
# 防止上關於某島國動作電影的網站等
iptables -I FORWARD -s 10.10.0.0/24 -m string --string "ay2000.net" -j DROP
iptables -I FORWARD -s 10.10.0.0/24 -m string --string "eroticism" -j DROP

sysctl -w net.ipv4.ip_forward=1 &>/dev/null
sysctl -w net.ipv4.tcp_syncookies=1 &>/dev/null

# 允許本機完全權限
iptables -I INPUT -s 10.10.0.50 -j ACCEPT
iptables -I INPUT -s 10.10.0.50 -j ACCEPT
Copyright © Linux教程網 All Rights Reserved