1.1 iptables防火墻簡介
Netfilter/Iptables(以下簡稱Iptables)是unix/linux自帶的一款優(yōu)秀且開放源代碼的安全自由的**基于包過濾的防火墻工具**,它的功能十分強(qiáng)大,使用非常靈活,可以對流入和流出服務(wù)器的數(shù)據(jù)包進(jìn)行很精細(xì)的控制。特別是它可以在一臺非常低的硬件配置下跑的非常好
Iptables是Linux2.4及2.6內(nèi)核中集成的服務(wù)。其功能與安全性比其**ipfwadm,ipchains**強(qiáng)大的多,iptables主要工作在OSI七層的二、三、四層,如果重新編譯內(nèi)核,iptables也可以支持**7層控制**(squid代理+iptables)
1.2 iptables 名詞和術(shù)語
容器:包含和被包含的關(guān)系
iptables是表的容器
iptables包含表 (4張表)表是鏈的容器,每個表都包含若干個鏈
鏈?zhǔn)且?guī)則的容器,真正過濾規(guī)則是屬于鏈里面的
級別介紹
iptables 國家
表 省
鏈 市
規(guī)則 縣
1.3 iptables工作流程
iptables是采用數(shù)據(jù)包過濾機(jī)制工作的,所以它會對請求的數(shù)據(jù)包的包頭數(shù)據(jù)進(jìn)行分析,并根據(jù)我們預(yù)先設(shè)定的規(guī)則來進(jìn)行匹配是否可以進(jìn)入到主機(jī)。
iptables工作流程小結(jié)
- 防火墻是一層層過濾的。實(shí)際是按照配置規(guī)則的順序從上到下,從前到后進(jìn)行過濾的。
- 如果匹配上規(guī)則,即明確表是阻止還是通過,此時數(shù)據(jù)包就不在向下匹配新規(guī)則了。
- 如果所有規(guī)則中沒有明確是阻止還是通過這個數(shù)據(jù)包,也就是么有匹配上新規(guī)則,向下進(jìn)行匹配,直到匹配默認(rèn)規(guī)則得到明確的組織還是通過
- 防火墻的默認(rèn)規(guī)則是對應(yīng)鏈的所有規(guī)則執(zhí)行完才會執(zhí)行的。
1.4 iptables表(tables)和鏈(chains)
iptables根據(jù)功能和表的定義劃分包含三個表,filter,nat,mangle,其每個表又包含不同的操作鏈(Chains)
Filter表 是真正的防火墻功能
INPUT 進(jìn)服務(wù)器 OUTPUT出服務(wù)器 FORWARD 流經(jīng)服務(wù)器
Nat 表 負(fù)責(zé)數(shù)據(jù)包改寫 網(wǎng)關(guān)共享上網(wǎng)、IP和端口映射
OUTPUT
PREROUTING
POSTROUTING
Mangle表 路由標(biāo)記 用的不多
####所有鏈全有
RAW 表 用處很少和Mangle一樣
我們可以通過man iptables 來獲取
1.5 表介紹
對于filter表的控制是我們實(shí)現(xiàn)本機(jī)防火墻的重要手段,特別是對INPUT鏈的控制
1.6 iptables表和鏈工作流程圖
提示: iptables主要由2個作用,第一是防火墻,第二是路由。
NAT功能:
企業(yè)案例:1)局域網(wǎng)上網(wǎng)共享(路由和網(wǎng)關(guān))NAT POSTROUTING
2)外部IP和端口映射為內(nèi)部IP和端口(DMZ功能),NAT PREROUTING
Filter功能:
即防火墻FILTER INPUT FORWARD
企業(yè)案例:主要應(yīng)用于服務(wù)器防火墻
2.1 配置iptables
1 2 3 4 5 6 7 | iptables默認(rèn)已經(jīng)安裝
[root@web02 ~] # iptables -V
iptables v1.4.7
[root@web02 ~] # rpm -qa iptables
iptables-1.4.7-16.el6.x86_64
[root@web02 ~] # /etc/init.d/iptables status
iptables: Firewall is not running.
|
查看iptables規(guī)則
1 2 | [root@web02 ~] # iptables -nL
Chain INPUT (policy ACCEPT)
|
表示針對input鏈 ACCEPT是默認(rèn)規(guī)則,默認(rèn)是運(yùn)行通過的
1 2 3 4 5 6 7 8 9 10 11 12 | target prot opt source destination
input鏈下面具體的規(guī)則
ACCEPT all -- 0.0.0.0 /0 0.0.0.0 /0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0 /0 0.0.0.0 /0
ACCEPT all -- 0.0.0.0 /0 0.0.0.0 /0
ACCEPT tcp -- 0.0.0.0 /0 0.0.0.0 /0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0 /0 0.0.0.0 /0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0 /0 0.0.0.0 /0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
|
如果沒有指定表,默認(rèn)就是filfer表
1 2 3 4 5 | iptables默認(rèn)加載的內(nèi)核模塊
[root@web02 ~] # lsmod |egrep "nat|filter|ipt"
ipt_REJECT 2351 2
iptable_filter 2793 1
ip_tables 17831 1 iptable_filter
|
加載如下模塊到linux內(nèi)核
1 2 3 4 5 6 7 | modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack 連接跟蹤
modprobe ip_conntrack_ftp 連接跟蹤
modprobe ip_nat_ftp
modprobe ipt_state
|
再次過濾,查看生效情況
1 2 3 4 5 6 7 8 9 10 | [root@web02 ~] # lsmod |egrep "nat|filter|ipt"
nf_nat_ftp 3443 0
nf_conntrack_ftp 11953 1 nf_nat_ftp
iptable_nat 5923 0
nf_nat 22676 2 nf_nat_ftp,iptable_nat
ipt_REJECT 2351 2
nf_conntrack_ipv4 9154 5 iptable_nat,nf_nat
nf_conntrack 79206 6 nf_nat_ftp,nf_conntrack_ftp,iptable_nat,nf_nat,nf_conntrack_ipv4,xt_state
iptable_filter 2793 1
ip_tables 17831 2 iptable_nat,iptable_filter
|
清空所有的規(guī)則,只留下默認(rèn)規(guī)則
1 2 3 | [root@web02 ~] # iptables -F
[root@web02 ~] # iptables -X
[root@web02 ~] # iptables -Z
|
iptables -F 清除所有規(guī)則
iptables -X 刪除用戶自定義規(guī)則
iptables -Z 鏈的計數(shù)器清零
2.2 禁止規(guī)則
查看端口
1 2 3 | [root@web02 ~] # netstat -lntup|grep ssh
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1329 /sshd
tcp 0 0 :::22 :::* LISTEN 1329 /sshd
|
命令如下:
1 | iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
|
-A 添加規(guī)則到指定鏈的結(jié)尾,最后一條
-I 添加規(guī)則到指定鏈的開頭,第一條
-t 指定表,也可以不指定默認(rèn)是filter
-p 指定協(xié)議(all.tcp,udp.icmp)默認(rèn)all
--dport 指定端口
-j 處理的行為
ACCPET接收、DROP丟棄、REJECT拒絕
最好使用ACCPET和DROP,因為拒絕會返回給用戶信息。
清除規(guī)則可以使用iptables -F
還可以使用iptables -D INPUT 1
-D指定刪除的鏈
--line-number 顯示序列號
iptables -nl --line-number
提示:需要寫上鏈和序列號
溫馨提示:恢復(fù)剛才斷掉的SSH連接
1)去機(jī)房重啟系統(tǒng)或登錄服務(wù)器刪除剛才的禁止規(guī)則
2)讓機(jī)房人員重啟服務(wù)器或者讓機(jī)房人員拿用戶密碼登錄進(jìn)去
3)通過服務(wù)器的遠(yuǎn)程管理卡管理(推薦)
4)先寫一個定時任務(wù),每5分鐘就停止防火墻
5)測試環(huán)境測試好,寫成腳本,批量執(zhí)行
企業(yè)案例
3.1: 加-A和-I的區(qū)別
1 2 | [root@web02 ~] # iptables -A INPUT -p tcp --dport 80 -j DROP
[root@web02 ~] # iptables -I INPUT -p tcp --dport 80 -j ACCEPT
|
按照iptables匹配規(guī)則,首先會先匹配第一行,依次向下。這樣設(shè)置拒絕就沒有用
如果想在中間插入可以指定插入行號
1 2 3 4 5 6 7 8 9 | [root@web02 ~] # iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0 /0 0.0.0.0 /0 tcp dpt:80
DROP tcp -- 0.0.0.0 /0 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
|
還可以通過序列號插入iptables 命令
1 2 3 4 5 6 7 8 9 10 11 | [root@web02 ~] # iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT
[root@web02 ~] # iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0 /0 0.0.0.0 /0 tcp dpt:80
2 ACCEPT tcp -- 0.0.0.0 /0 0.0.0.0 /0 tcp dpt:80
3 DROP tcp -- 0.0.0.0 /0 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
|
小結(jié):總結(jié)下刪除規(guī)則的方法
1. iptables -D INPUT -p tcp --dport 8080 -j DROP
2. iptables -F 刪所有規(guī)則
3. /etc/init.d/iptables restart (用iptables命令行配置的命令都是臨時生效)
4. iptables -D INPUT 規(guī)則序號
3.2:禁止10.0.0.0網(wǎng)段接入
基于客戶端網(wǎng)段控制
1 | [root@web02 ~] # iptables -A INPUT -s 10.0.0.0/24 -j DROP
|
-s指定源地址
還可以使用不是這個網(wǎng)段的進(jìn)行操作
1 | [root@web02 ~] # iptables -A INPUT ! -s 10.0.0.0/24 -j DROP
|
案例:控制22端口 eth0網(wǎng)卡進(jìn)來的數(shù)據(jù)
1 2 | iptables -A INPUT -p tcp --dport 22 -i eth0 ! -s 10.0.0.0 /24 -j DROP
iptables -A INPUT -p tcp --dport 22 -i eth0 ! -s 192.168.1.1 -j DROP
|
封掉3306端口
1 | iptables -A INPUT -p tcp --dport 3306 -j DROP
|
匹配指定的協(xié)議
1 2 | iptables -A INPUT -p tcp
iptables -A INPUT -p udp
|
匹配指定協(xié)議外的所有協(xié)議
1 | iptables -A INPUT ! -p tcp
|
``匹配單一端口**
1 2 | iptables -A INPUT -p tcp --sport 22 源端口
iptables -A INPUT -p udp --dport 22 目的端口
|
匹配端口范圍:
1 2 3 4 5 6 | iptables -A INPUT -p tcp --sport 22:80
iptables -A INPUT -p tcp --dport 21,22,23 -j DROP---->錯誤語法
iptables -I INPUT -p tcp -m multiport --dport 22,23,24,25 -j DROP
iptables -I INPUT -p tcp -m multiport ! --dport 22,23,24,25 -j DROP
iptables -I INPUT -p tcp --dport 3306:8809 -j ACCEPT
iptables -I INPUT -p tcp --dport 18:80 -j DROP <----最佳方法
|
匹配ICMP類型
1 | iptables -A INPUT -p icmp- type 8
|
icmp中有很多類型,其中8代表ping
例:
1 2 | iptables -A INPUT -p icmp --icmp- type 8 -j DROP
iptables -A INPUT -p icmp -m icmp --icmp- type any -j ACCEPT
|
因為icmp類型很多可以使用any,icmp的所有類型全禁
1 | iptables -A INPUT -s 192.168.1.0 /24 -p icmp -m icmp --icmp- type any -j ACCEPT
|
企業(yè)場景禁ping
1 | iptables -A INPUT -p icmp --icmp- type 8 -s 10.0.0.0 /24 -j ACCEPT
|
匹配網(wǎng)絡(luò)狀態(tài)
-m state --state
NEW:已經(jīng)或啟動新的連接
ESTABLISHED:已建立的連接
RELATED:正在啟動的新連接
INVALID:非法或無法識別的
FTP服務(wù)是特殊的,需要配狀態(tài)連接
允許關(guān)聯(lián)的狀態(tài)包通過(Web服務(wù)不要使用FTP服務(wù))
1 2 | iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
|
限制指定時間包的允許通過數(shù)量及并發(fā)數(shù)
1 | -m limit --limit n/{second /minute/hour }
|
指定時間內(nèi)的請求速率“n”為速率,后面為時間分別為:秒、分、時
在同一時間內(nèi)允許通過的請求“n”為數(shù)字,不指定默認(rèn)為5
1 | iptables -I INPUT -s 10.0.1.0 /24 -p icmp --icmp- type 8 -m limit --limit 5 /min --limit-burst 2 -j ACCEPT
|
手動執(zhí)行iptables命令配置企業(yè)生產(chǎn)環(huán)境防火墻
生產(chǎn)環(huán)境配置主機(jī)防火墻的兩種模式
1. 允許所有程序,對操作傷害的進(jìn)行拒絕操縱 應(yīng)用場景:企業(yè)配置上網(wǎng)網(wǎng)關(guān)路由
2. 拒絕所有操作,允許指定的操作 應(yīng)用場景:服務(wù)器主機(jī)防火墻
配置企業(yè)主機(jī)防火墻
1 2 3 | [root@web02 ~] # iptables -F
[root@web02 ~] # iptables -X
[root@web02 ~] # iptables -Z
|
1.設(shè)置允許SSH登錄端口
1 2 | [root@web02 ~] # iptables -A INPUT -p tcp --dport 22 -j ACCETP
[root@web02 ~] # iptables -A INPUT -p tcp -s 10.0.0.1/24 -j ACCEPT
|
2.設(shè)置允許本機(jī)lo通信規(guī)則
1 2 | [root@web02 ~] # iptables -A INPUT -i lo -j ACCEPT
[root@web02 ~] # iptables -A OUTPUT -o lo -j ACCEPT
|
3.設(shè)置默認(rèn)規(guī)則
1 2 3 | [root@web02 ~] # iptables -P INPUT DROP
[root@web02 ~] # iptables -P OUTPUT ACCEPT
[root@web02 ~] # iptables -P FORWARD DROP
|
查看規(guī)則(現(xiàn)在的服務(wù)器是最安全的)
1 2 3 4 5 6 7 8 9 10 11 | [root@web02 ~] # iptables -nL --line-number
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0 /0 0.0.0.0 /0 tcp dpt:22
2 ACCEPT tcp -- 10.0.0.0 /24 0.0.0.0 /0
3 ACCEPT all -- 0.0.0.0 /0 0.0.0.0 /0
Chain FORWARD (policy DROP)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0 /0 0.0.0.0 /0
|
4.開啟信任的IP網(wǎng)段
允許IDC LAN/WAN 和辦公網(wǎng)IP的訪問,及對外合作機(jī)構(gòu)訪問
1 2 3 4 5 | iptables -A INPUT -s 124.23.62.96 /27 -p all -j ACCEPT #辦公室固定IP段
iptables -A INPUT -s 192.168.2.0 /24 -p all -j ACCEPT #IDC機(jī)房的內(nèi)網(wǎng)網(wǎng)段
iptables -A INPUT -s 10.0.0.0 /24 -p all -j ACCEPT #其他機(jī)房的內(nèi)網(wǎng)網(wǎng)段
iptables -A INPUT -s 203.82.24.0 /24 -p all -j ACCEPT #IDC機(jī)房的外網(wǎng)網(wǎng)段
iptables -A INPUT -s 203.82.23.0 /24 -p all -j ACCEPT #其他IDC機(jī)房的外網(wǎng)網(wǎng)段
|
現(xiàn)在還只是我們可以訪問,對外還無法訪問
5.允許icmp類型協(xié)議通過
1 | iptables -A INPUT -p icmp -m icmp- type any -j ACCEPT
|
提示:如果不想開,就不執(zhí)行此命令
1 | iptables -A INPUT -p icmp -s 10.0.0.0 /24 -m icmp --icmp- type any -j ACCEPT
|
6.允許關(guān)聯(lián)的狀態(tài)包通過(Web服務(wù)不要使用FTP服務(wù))
1 2 | iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
|
提示:以上配置就是合格服務(wù)器應(yīng)該配置的
保存
默認(rèn)使用iptables并沒有永久保存,重啟失效。
第一種方法:
1 | /etc/init .d /iptables save
|
保存到/etc/sysconfig/iptables 下面
顯示如下格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [root@web02 ~] # cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Mon Aug 15 01:33:44 2016
*nat
:PREROUTING ACCEPT [1413:153792]
:POSTROUTING ACCEPT [132:8834]
:OUTPUT ACCEPT [132:8834]
COMMIT
# Completed on Mon Aug 15 01:33:44 2016
# Generated by iptables-save v1.4.7 on Mon Aug 15 01:33:44 2016
*filter
:INPUT DROP [1798:662465]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [288:21100]
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 10.0.0.0 /24 -p tcp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Mon Aug 15 01:33:44 2016
|
第二種方法:
1 | [root@web02 ~] # iptables-save >/etc/sysconfig/iptables
|
推薦使用第一種方式
測試:我通過其他服務(wù)器掃描我們配置的防火墻
使用nmap工具進(jìn)行分析,此工具需要安裝
1 | [root@web02 ~] # yum -y install nmap
|
使用如下:更多可以使用nmap --help
1 2 3 4 5 6 7 8 9 10 | [root@web02 ~] # nmap 10.0.0.8 -p 1-65535
Starting Nmap 5.51 ( http: //nmap .org ) at 2016-08-15 04:28 CST
Nmap scan report for 10.0.0.8
Host is up (0.0000070s latency).
Not shown: 65532 closed ports
PORT STATE SERVICE
22 /tcp open ssh
80 /tcp open http
3306 /tcp open mysql
Nmap done : 1 IP address (1 host up) scanned in 14.21 seconds
|
生產(chǎn)維護(hù)
(1)確定的規(guī)則;
編輯/etc/sysconfig/iptables
加入想要的規(guī)則:例如
1 2 | -A INPUT -p tcp -m tcp --dport 873 -j ACCEPT
/etc/init .d /iptables reload
|
或者改配置的同時命令在執(zhí)行,也是永久生效。
(2)命令試錯,沒問題了,然后放配置文件,這時不需要重啟了
惡意IP封殺
封IP,在第一行封。10.0.0.1 這個機(jī)器攻擊我們服務(wù)器或者在BBS里發(fā)垃圾帖子
手工封IP:
1 2 3 | iptables -I INPUT -s 10.0.0.1 -j DROP #粗,范圍大,外部攻擊者
Iptables -I INPUT -s 10.0.0.1 -j DROP
iptables -I INPUT -p tcp -s 10.0.0.1 --dport 80 -j DROP #細(xì),范圍小。內(nèi)部
|
自動封IP:分析Web或應(yīng)用日志或者網(wǎng)絡(luò)連接狀態(tài)封掉垃圾IP
腳本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #!/bin/bash
#this is a server firewall created by oldboy 17:03 2006-7-26
# e_mail:31333741@qq.com
# qqinfo:49000448
# function: a server firewall
# version:1.1
################################################
# oldboy trainning info.
# QQ 1986787350 70271111
# site: http://www.
# blog: http://oldboy.blog.51cto.com
# oldboy trainning QQ group: 208160987 45039636
################################################
#define variable PATH
IPT= /sbin/iptables
#Remove any existing rules
$IPT -F
$IPT -X
$IPT -Z
#setting default firewall policy
$IPT --policy OUTPUT ACCEPT
$IPT --policy FORWARD DROP
$IPT -P INPUT DROP
#setting for loopback interface
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
#setting access rules
#one,ip access rules,allow all the ips of
$IPT -A INPUT -s 10.0.10.0 /24 -p all -j ACCEPT
$IPT -A INPUT -s 10.0.0.0 /24 -p all -j ACCEPT
##下面的是重復(fù)的,作為知識點(diǎn)保留,單個服務(wù)的配置
#second,port access rules
#nagios
$IPT -A INPUT -s 10.0.10.0 /24 -p tcp --dport 5666 -j ACCEPT
$IPT -A INPUT -s 10.0.0.0 /24 -p tcp --dport 5666 -j ACCEPT
#db
$IPT -A INPUT -s 10.0.0.0 /24 -p tcp --dport 3306 -j ACCEPT
$IPT -A INPUT -s 10.0.0.0 /24 -p tcp --dport 3307 -j ACCEPT
$IPT -A INPUT -s 10.0.10.0 /24 -p tcp --dport 3306 -j ACCEPT
$IPT -A INPUT -s 10.0.10.0 /24 -p tcp --dport 3307 -j ACCEPT
#ssh difference from other servers here.>>
$IPT -A INPUT -s 10.0.0.0 /24 -p tcp --dport 52113 -j ACCEPT
$IPT -A INPUT -s 10.0.10.0 /24 -p tcp --dport 52113 -j ACCEPT
$IPT -A INPUT -p tcp --dport 22 -j ACCEPT
#http
$IPT -A INPUT -p tcp --dport 80 -j ACCEPT
#snmp
$IPT -A INPUT -s 10.0.0.0 /24 -p UDP --dport 161 -j ACCEPT
$IPT -A INPUT -s 10.0.10.0 /24 -p UDP --dport 161 -j ACCEPT
#rsync
$IPT -A INPUT -s 10.0.0.0 /24 -p tcp -m tcp --dport 873 -j ACCEPT
$IPT -A INPUT -s 10.0.10.0 /24 -p tcp -m tcp --dport 873 -j ACCEPT
#icmp
#$IPT -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
#others RELATED
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
|
企業(yè)案例:寫一個腳本解決DOS攻擊生產(chǎn)案例
提示:根據(jù)web日志或者或者網(wǎng)絡(luò)連接數(shù),監(jiān)控當(dāng)某個IP并發(fā)連接數(shù)或者短時內(nèi)PV達(dá)到100,即調(diào)用防火墻命令封掉對應(yīng)的IP,監(jiān)控頻率每隔3分鐘。防火墻命令為:iptables -I INPUT -s 10.0.1.10 -j DROP
本腳本使用測試文件進(jìn)行編寫
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | [root@db02 scripts] # cat test_6.sh
#!/bin/sh
#
[ -f /etc/init .d /functions ] && . /etc/init .d /functions
IP_file= "/server/scripts/ddos.txt"
IP_filter_command= "iptables -I INPUT -j DROP -s"
IP_recover_command= "iptables -D INPUT -j DROP -s"
function IP_check(){
grep "EST" ${IP_file}| awk -F "[ |:]+" '{print $6}' | sort | uniq -c| sort -rn -k1 > /server/scripts/ip .txt
}
function IP_filter(){
exec < /server/scripts/ip .txt
while read line
do
IP_count=` echo $line| awk '{print $1}' `
IP=` echo $line| awk '{print $2}' `
IP_fil=`iptables -L -n| grep "\b${IP}\b" | wc -l`
if [ ${IP_count} -gt 25 -a ${IP_fil} - eq 0 ]; then
${IP_filter_command} ${IP}
echo "${IP}" >> /server/scripts/ip_filtered .txt
action "Filter ${IP}" /bin/true
fi
done
}
function IP_recover(){
exec < /server/scripts/ip .txt
while read line
do
IP_count=` echo $line| awk '{print $1}' `
IP=` echo $line| awk '{print $2}' `
IP_fil=`iptables -L -n| grep "\b${IP}\b" | wc -l`
if [ ${IP_count} - le 25 -a ${IP_fil} - eq 1 ]; then
${IP_recover_command} ${IP}
echo "${IP}" >> /server/scripts/ip_filtered .txt
action "Recover ${IP}" /bin/true
fi
done
}
function main(){
case "$1" in
filter)
IP_check
echo "$(date +%F-%H:%M:%S) filtered by $(whoami)" >> /server/scripts/ip_filtered .txt
IP_filter
;;
recover)
IP_check
echo "$(date +%F-%H:%M:%S) recovered by $(whoami)" >> /server/scripts/ip_filtered .txt
IP_recover
;;
*)
echo "USAGE:$0 {filter|recover}"
exit 1
esac
}
main $*
|
生產(chǎn)環(huán)境iptables腳本講解
技巧:具備外網(wǎng)IP的服務(wù)器不對外的服務(wù)最好要做源地址限制。對外提供的服務(wù),不能做源地址限制,例如:80 端口
問題:企業(yè)硬件防火墻和IPTABLES防火墻是否要同時用。
解決:可以同時使用企業(yè)硬件防火墻一般放在網(wǎng)關(guān)位置,相當(dāng)于大廈的保安,但是樓里的每個屋子還是需要有人鎖門的iptables
問題: IDC機(jī)房部署了硬件防火墻,我們的服務(wù)器可以不開防火墻嗎?
解答:絕對不可以,大廈有了保安,你的辦公室門就不鎖了嗎?
NAT表設(shè)置
共享上網(wǎng)設(shè)置
linux網(wǎng)關(guān)B:
局域網(wǎng)共享的兩條命令方法:
方法1:適合于有固定外網(wǎng)地址的:
1 | iptables -t nat -A POSTROUTING -s 192.168.1.0 /24 -o eth0 -j SNAT --to- source 10.0.0.7
|
(1)-s192.168.1.0/24 辦公室或IDC內(nèi)網(wǎng)網(wǎng)段。
(2)-oeth0 為網(wǎng)關(guān)的外網(wǎng)卡接口。
(3)-jSNAT --to-source 10.0.0.7 是網(wǎng)關(guān)外網(wǎng)卡IP地址。
方法2:適合變化外網(wǎng)地址(ADSL):
1 | iptables -t nat -A POSTROUTING -s 192.168.1.0 /24 -j MASQUERADE #偽裝。
|
配置如下
第一步:外網(wǎng)服務(wù)器配置
1 2 3 | [root@lb01 ~] # iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.5
[root@lb01 ~] # iptables -t nat -L -n
|
開啟內(nèi)核轉(zhuǎn)發(fā)
1 2 3 | net.ipv4.ip_forward = 1
vim /etc/sysctl .conf
sysctl -p #生效
|
需要上網(wǎng)服務(wù)器設(shè)置
添加路由
1 2 3 | route add default gw 172.16.1.5 #此處寫提供外網(wǎng)的IP地址
vim /etc/resolv .conf
|
添加 nameserver 223.5.5.5
route -n 檢查
案例2:實(shí)現(xiàn)把訪問10.0.0.5:80的請求轉(zhuǎn)到172.16.1.8:80
1 2 | [root@web02 ~] # iptables -t nat -A PREROUTING -d 10.0.0.5 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.8:80
[root@web02 ~] # iptables -P FORWARD DROP
|
iptables常用企業(yè)案例:
1、Linux主機(jī)防火墻(表:FILTER 控制鏈:INPUT)
2、局域網(wǎng)機(jī)器共享上網(wǎng)(表:NAT 控制鏈:POSTROUTING)
1 | iptables -t nat -A POSTROUTING -s 192.168.1.0 /24 -o eth0 -j SNAT --to- source 10.0.0.7
|
3、外部地址和端口,映射為內(nèi)部地址和端口(表:NAT 控制的鏈:PREROUTING)
1 | iptables -t nat -A PREROUTING -d 10.0.0.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.8:9000
|
企業(yè)案例:實(shí)現(xiàn)外部IP 124.42.34.112 一對一映射到內(nèi)部server 10.0.0.8
網(wǎng)關(guān)Ip:eth0:124.42.60.109 eth1:10.0.0.254
首先在路由網(wǎng)關(guān)上綁定VIP 124.42.34.112,可以是別名或輔助IP的方式。
1 2 3 | -A POSTROUTING -s 10.0.0.0 /255 .255.240.0 -d 124.42.34.112 -j SNAT --to- source 10.0.0.254
-A PREROUTING -d 124.42.34.112 -j DNAT --to-destination 10.0.0.8
-A POSTROUTING -s 10.0.0.8 -o eth0 -j SNAT --to- source 124.42.34.112
|
iptables 生產(chǎn)應(yīng)用場景
1)局域網(wǎng)共享上網(wǎng)(適合做企業(yè)內(nèi)部局域網(wǎng)上網(wǎng)網(wǎng)關(guān),以及IDC機(jī)房內(nèi)網(wǎng)的上網(wǎng)網(wǎng)關(guān)[nat POSTROUTING])
2)服務(wù)器防火墻功能(適合IDC機(jī)房具有外網(wǎng)IP的服務(wù)器)(主要是filter INPUT的控制)
3)把外部IP及端口映射到局域網(wǎng)內(nèi)部(可以一對一IP映射,也可以針對某一個端口映射)也可能是IDC把網(wǎng)站的外網(wǎng)VIP及網(wǎng)站端口映射到負(fù)載均衡器上(硬件防火墻)。(nat PREROUTING)
4)辦公路由器+網(wǎng)關(guān)功能(zebra路由+iptables過濾及NAT+squid正向透明代理)80+ntop/iftop/iptraf流量查看+tc/cbq流量控制限速
5)郵件的網(wǎng)關(guān)
iptables防火墻的應(yīng)用
1)主機(jī)防火墻
2)網(wǎng)關(guān)的應(yīng)用(IP映射,端口映射)
3)過濾信息,監(jiān)控限制流量及員工上網(wǎng)行為(squid(正向代理緩存加過濾)+ntop(圖形流量監(jiān)控)+通常(流量限制)+iptraf/iftop(流量查看))
如果IPTABLES的服務(wù)器升級內(nèi)核可以實(shí)現(xiàn)類似squid的過濾功能
4)網(wǎng)關(guān)裝殺毒軟件監(jiān)聽9999端口,(網(wǎng)關(guān)殺毒)
1 | iptables -A PREROUTING -i eth0 -d 211.167.253.109 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.10.6:9025
|
5)結(jié)合zebra配置企業(yè)級路由器
映射多個外網(wǎng)IP上網(wǎng)
1 2 3 4 5 | iptables -t nat -A POSTROUTING -s 10.0.0.1 /255 .255.255.0 -o eth0 -j SNAT --to- source 124.42.60.11-124.42.60.16
iptables -t nat -A POSTROUTING -s 172.16.1.0 /255 .255.255.0 -o eth0 -j SNAT --to- source 124.42.60.103-124.42.60.106
#iptables -t nat -A postrouting -S 192.168.1.0/22 -o eth0 -j SNAT --to-source 10.0.0.241-10.0.0.249
|
問題:
1、2000人被封
2、可用65535端口資源有限
企業(yè)案例: ip_conntrack: table full, dropping packet.的錯誤提示
以下是我的生產(chǎn)環(huán)境的某個服務(wù)器的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
#5、dmesg里面顯示ip_conntrack: table full, dropping packet.的錯誤提示.如何解決。
#以下參數(shù)是對iptables防火墻的優(yōu)化,防火墻不開會提示,可以忽略不理。
c58:
net.ipv4.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_max=25000000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=180
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait=120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait=60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait=120
################################################################
C64:
net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
|
調(diào)整內(nèi)核參數(shù)/etc/sysctl.conf后,需執(zhí)行/sbin/sysctl -p使得修改生效。
強(qiáng)調(diào):如果并發(fā)比較大,或者日PV多的情況下,開啟防火墻要注意,很可能導(dǎo)致網(wǎng)站訪問緩慢
大并發(fā)(并發(fā)1萬,PV日3000萬)要么購買硬件防火墻,要么不開iptables防火墻
iptables 參數(shù)簡介
-n 數(shù)字
-L 列表
-F 清除所有規(guī)則,不會處理默認(rèn)規(guī)則
-X 刪除用戶自定義的鏈
-Z鏈的計數(shù)器清零
-A 添加規(guī)則到指定鏈的結(jié)尾,最后一條
-I 添加規(guī)則到指定鏈的開頭,第一條
-t指定表,也可以不指定默認(rèn)是filter
-p 指定協(xié)議(all.tcp,udp.icmp)默認(rèn)all
-P 設(shè)置默認(rèn)規(guī)則
-s指定源地址
-d 目的地址
--dport 指定端口
-j處理的行為 ACCPET接收、DROP丟棄、REJECT拒絕
-iinput 匹配進(jìn)入的網(wǎng)卡接口
-ooutput 匹配出去的網(wǎng)卡接口
-m state --state 匹配網(wǎng)絡(luò)狀態(tài)
|