a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 175|回复: 3

[红帽认证] Linux系统防火墙防止DOS和DDOS攻击

[复制链接]
发表于 2012-8-4 12:19:50 | 显示全部楼层 |阅读模式
用Linux 系统防火墙功能抵御网络攻击     虚拟主机服务商在运营过程中可能会受到黑客攻击,常见的攻击方式有SYN ,DDOS等。通过更换IP,查找被攻击的站点可能避开攻击,但是中断服务的时间比较长。比较彻底的解决方法是添置硬件防火墙。不过,硬件防火墙价格比较昂贵。可以考虑利用Linux 系统本身提供的防火墙功能来防御。?# ]& P; ?* |- N' P9 }
    1. 抵御SYN
& t% V% b! b5 h% m    SYN攻击是利用TCP/IP协议3次握手的原理,发送大量的建立连接的网络包,但不实际建立连接,最终导致被攻击服务器的网络队列被占满,无法被正常用户访问。
- L* Q+ ^! g0 z' `( Y' g  \9 N    Linux内核提供了若干SYN相关的配置,用命令:
4 n0 q# F7 O% A( y    sysctl -a | grep syn* c4 [; F8 b: W' b' P. A/ t9 y) l
    看到:' b  x0 d. Q* R9 m( d
    net.ipv4.tcp_max_syn_backlog = 1024
8 a7 j3 S2 J$ W. z7 `5 ]8 ~8 P9 ], H    net.ipv4.tcp_syncookies = 0
5 X6 T( Q* C) j- f$ j    net.ipv4.tcp_synack_retries = 50 M0 [, c1 G( w9 p* X/ t
    net.ipv4.tcp_syn_retries = 56 `" S* _9 s2 `: I0 x; w. c5 f
    tcp_max_syn_backlog是SYN队列的长度,tcp_syncookies是一个开关,是否打开SYN Cookie功能,该功能可以防止部分SYN攻击。tcp_synack_retries和tcp_syn_retries定义SYN的重试次数。+ e, b' ~- q# X; F0 n3 O1 g7 u
    加大SYN队列长度可以容纳更多等待连接的网络连接数,打开SYN Cookie功能可以阻止部分SYN攻击,降低重试次数也有一定效果。
4 s$ l0 w4 A  s$ a3 p    调整上述设置的方法是:
& L8 l$ H5 s" a6 h( ^' {- S( ~4 \    增加SYN队列长度到2048:
4 i: n3 ]" y8 V5 }    sysctl -w net.ipv4.tcp_max_syn_backlog=2048
" Y9 l  h9 Z  d( Q% F3 L4 i5 V    打开SYN COOKIE功能:' V* m) e3 t& J3 Q
    sysctl -w net.ipv4.tcp_syncookies=1
( w9 ^- n  U; r+ x4 B6 p: @    降低重试次数:
; }" R/ s; v: O; Y    sysctl -w net.ipv4.tcp_synack_retries=3! Q  s) U8 ~5 B/ e- i( g6 j; x
    sysctl -w net.ipv4.tcp_syn_retries=3
3 I( P* E6 G2 l. j, B% E5 E5 H    为了系统重启动时保持上述配置,可将上述命令加入到/etc/rc.d/rc.local文件中。
; [3 M: Z6 w( ]: V+ F2 @" @7 z    2. 抵御DDOS
4 I4 J" i% e* U7 J    DDOS,分布式拒绝访问攻击,是指黑客组织来自不同来源的许多主机,向常见的端口,如80,25等发送大量连接,但这些客户端只建立连接,不是正常访问。由于一般Apache配置的接受连接数有限(通常为256),这些“假” 访问会把Apache占满,正常访问无法进行。7 Q; v+ f8 i0 C
    Linux提供了叫ipchains的防火墙工具,可以屏蔽来自特定IP或IP地址段的对特定端口的连接。使用ipchains抵御DDOS,就是首先通过netstat命令发现攻击来源地址,然后用ipchains命令阻断攻击。发现一个阻断一个。
3 K6 Y( v1 R1 Q& F    *** 打开ipchains功能1 |! I& m9 F/ U* B7 q
    首先查看ipchains服务是否设为自动启动:" U# S" l9 x! Y# C# P- ^7 i
    chkconfig --list ipchains
) a/ m. t: f( w8 F/ G    输出一般为:' ^# v& `+ p4 ?6 ]5 q& s" s
    ipchains 0:off 1:off 2:on 3:on 4:on 5:on 6:off- J6 q  N5 k& F4 e& [
    如果345列为on,说明ipchains服务已经设为自动启动. G4 F& A- t( C- o; @! i3 x
    如果没有,可以用命令:
$ }: S) Y9 _" e0 h' @/ p. k4 k    chkconfig --add ipchains
. R* |% I$ u1 r, F& t1 U    将ipchains服务设为自动启动2 H& n: r3 C. o. Q
    其次,察看ipchains配置文件/etc/sysconfig/ipchains是否存在。如果这一文件不存在,ipchains' ]7 Y  x( C( i( _9 n  p6 p
    即使设为自动启动,也不会生效。缺省的ipchains配置文件内容如下:6 Q; n$ N8 q' G* J" t
    # Firewall configuration written by lokkit
* n8 _$ ~8 D0 {& ^9 g! X0 F    # Manual customization of this file is not recommended.3 o8 ~) Z0 C/ ~& N6 f1 t
    # Note: ifup-post will punch the current nameservers through the
' N# f; i  `; o% _  _- O    # firewall; such entries will *not* be listed here.  W+ t) m- s6 I% Y
    :input ACCEPT, n  m6 u# f% J4 J, Q  s/ w" [0 S
    :forward ACCEPT2 X% _# W+ w  [$ j
    :output ACCEPT
) `: p3 L$ k* m$ d    -A input -s 0/0 -d 0/0 -i lo -j ACCEPT
/ u& \, R) X$ U9 i& `' H4 Q    # allow http,ftp,smtp,ssh,domain via tcp; domain via udp/ c# A1 `6 m# y. V, k0 _
    -A input -p tcp -s 0/0 -d 0/0 pop3 -y -j ACCEPT
$ @, b( W. Y3 V, k4 _: Z    -A input -p tcp -s 0/0 -d 0/0 http -y -j ACCEPT* g' [. _1 v  ?/ L! h2 V$ u
    -A input -p tcp -s 0/0 -d 0/0 https -y -j ACCEPT
0 G; w6 M+ F: m  N% x    -A input -p tcp -s 0/0 -d 0/0 ftp -y -j ACCEPT5 V' I( [6 e& l: n
    -A input -p tcp -s 0/0 -d 0/0 smtp -y -j ACCEPT
* {* U" K  r2 J' M, P% n4 m8 A    -A input -p tcp -s 0/0 -d 0/0 ssh -y -j ACCEPT- C% A' N8 Y& G7 M. q
    -A input -p tcp -s 0/0 -d 0/0 domain -y -j ACCEPT
9 U: [! q# g0 \' O4 l8 p' R: F8 u    -A input -p udp -s 0/0 -d 0/0 domain -j ACCEPT
, _: T; P" I4 r     # deny icmp packet
) w4 [/ k4 {9 m8 s! _# r, r4 r8 \1 Y     #-A input -p icmp -s 0/0 -d 0/0 -j DENY
7 _: s+ D/ M( m" C; X     # default rules2 i$ {! T6 g6 w! C
    -A input -p tcp -s 0/0 -d 0/0 0:1023 -y -j REJECT3 K9 Z+ u( k& u
    -A input -p tcp -s 0/0 -d 0/0 2049 -y -j REJECT4 z1 d% x, T/ C+ {/ `! R
    -A input -p udp -s 0/0 -d 0/0 0:1023 -j REJECT3 s  r5 n" F$ k/ S4 t0 K6 }. C
    -A input -p udp -s 0/0 -d 0/0 2049 -j REJECT7 _7 p9 M( C. T; P
    -A input -p tcp -s 0/0 -d 0/0 6000:6009 -y -j REJECT
; I$ _/ [& {" C1 x1 O0 k    -A input -p tcp -s 0/0 -d 0/0 7100 -y -j REJECT
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:19:51 | 显示全部楼层

Linux系统防火墙防止DOS和DDOS攻击

如果/etc/sysconfig/ipchains文件不存在,可以用上述内容创建之。创建之后,启动ipchains服:     /etc/init.d/ipchains start
% ]& n6 v5 H7 s; s- u    *** 用netstat命令发现攻击来源9 L& X/ `3 a; r
    假如说黑客攻击的是Web 80端口,察看连接80端口的客户端IP和端口,命令如下:/ j) o" {' Y4 l6 |, P9 ]/ s2 J
    netstat -an -t tcp | grep ":80" | grep ESTABLISHED | awk '{printf "%s %s\n",$5,$6}' | sort: F& e# m# l4 Y7 s. J
    输出:$ A+ |) c; ]6 z' j+ r$ X; ^
    161.2.8.9:123 FIN_WAIT2' w$ D: E7 T2 _0 t) S
    161.2.8.9:124 FIN_WAIT2- c0 s6 u5 o9 q% ~, h( ~
     61.233.85.253:23656 FIN_WAIT2
0 n# H9 v: ]3 W7 x, |) V* n' V    ...
) s& j1 f4 F8 u    第一栏是客户机IP和端口,第二栏是连接状态3 f* o7 ]& J( t7 [9 c
    如果来自同一IP的连接很多(超过50个),而且都是连续端口,就很可能是攻击。
. d7 N; u( x& ^1 q9 W- }0 j1 F$ F    如果只希望察看建立的连接,用命令:
# z- D1 T- A/ j' o    netstat -an -t tcp | grep ":80" | grep ESTABLISHED | awk '{printf "%s %s\n",$5,$6}' | sort
: r7 q3 w2 W0 l1 M  i8 P    *** 用ipchains阻断攻击来源
" j4 r7 |9 `0 X% P    用ipchains阻断攻击来源,有两种方法。一种是加入到/etc/sysconfig/ipchains里,然后重启动ipchains服务。另一种是直接用ipchains命令加。屏蔽之后,可能还需要重新启动被攻击的服务,是已经建立的攻击连接失效, I7 h, j" X/ t4 S
    * 加入/etc/sysconfig/ipchains6 T! T. g3 K  t1 M$ w
    假定要阻止的是218.202.8.151到80的连接,编辑/etc/sysconfig/ipchains文件,在:output ACCEPT
6 V" `/ o" N8 m: y    行下面加入:
9 T; {0 U. P9 R$ C0 z    -A input -s 218.202.8.151 -d 0/0 http -y -j REJECT' n+ j  g/ [' |# R
    保存修改,重新启动ipchains:: G8 L! }5 m- U/ z# S% _
    /etc/init.d/ipchains restart4 G7 h0 Q' v7 N5 P8 f
    如果要阻止的是218.202.8的整个网段,加入:& ]) ]1 s! T6 w8 @$ _/ p* P" }' K
    -A input -s 218.202.8.0/255.255.255.0 -d 0/0 http -y -j REJECT
; K3 V$ K' l8 A. a) t. w    * 直接用命令行
4 T1 b. M1 |* P0 l    加入/etc/sysconfig/ipchains文件并重起ipchains的方法,比较慢,而且在ipchains重起的瞬间,可能会有部分连接钻进来。最方便的方法是直接用ipchains命令。4 B- |, Y5 c- W& s' q" y; h
    假定要阻止的是218.202.8.151到80的连接,命令:5 o2 K7 O9 k4 p1 ^' U
    ipchains -I input 1 -p tcp -s 218.202.8.151 -d 0/0 http -y -j REJECT9 D7 |/ T- v; l3 D6 \6 o& h4 k
    如果要阻止的是218.202.8的整个网段,命令:
4 y* [+ z: X% e) P/ P# d; J    ipchains -I input 1 -p tcp -s 218.202.8.0/255.255.255.0 -d 0/0 http -y -j REJECT
3 s, }% b6 m. y0 z5 _) W. Q/ q    其中,-I的意思是插入,input是规则连,1是指加入到第一个。
3 a* k+ H( E9 K% @) `: x2 U1 s, l    您可以编辑一个shell脚本,更方便地做这件事,命令:
* Z4 @6 Z3 w" H2 ^# @    vi blockit
+ g" M; J+ F2 g    内容:
2 d% R) u! o! l& z' d5 E    #!/bin/sh
/ Q/ C3 p- a3 m2 J. v8 r% @9 q2 _    if [ ! -z "$1" ] ; then* b! P7 b% \0 ~1 }. F1 @
    echo "Blocking: $1"7 F, E# h% |  l' i7 |1 h
    ipchains -I input 1 -p tcp -s "$1" -d 0/0 http -y -j REJECT
' J; _2 Z. E- H- _$ a2 n    else4 i" G7 x& d+ C" D- [
    echo "which ip to block?"
5 I$ z/ k) p8 L5 @4 j& S; M1 I    fi
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:19:52 | 显示全部楼层

Linux系统防火墙防止DOS和DDOS攻击

保存,然后:     chmod 700 blockit
4 |1 u7 t! k4 I" M/ b0 N" |; ?    使用方法:
5 O3 t. O+ [' _( T' D    ./blockit 218.202.8.151' Q  n3 `( R. E4 T3 C  M- d7 b3 h
    ./blockit 218.202.8.0/255.255.255.0
  I) m2 X# A' q$ E) ?    上述命令行方法所建立的规则,在重起之后会失效,您可以用ipchains-save命令打印规则:6 \- Y$ ]% z5 T  A' R# f+ d" T
    ipchains-save
- G6 {* S# e3 Q4 x: ~- w4 a    输出:6 r1 b$ C- b' d: L
    :input ACCEPT
) ?0 [7 G( m. E0 ^; b/ X    :forward ACCEPT
# n7 A( m' \* k! ^/ l3 b; [    :output ACCEPT
7 a* F+ T$ O: R    Saving `input'.
* A% ^9 P: c5 C$ ]8 C) P# t    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 -i lo -j ACCEPT
% T6 a( j! J3 w% {5 x/ J% _# U    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 110:110 -p 6 -j ACCEPT -y
# i, p+ u* p1 W, q, g$ ?    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 80:80 -p 6 -j ACCEPT -y7 L6 J. g: z' n) J3 O9 x
    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 22:22 -p 6 -j ACCEPT -y" v$ A8 @. \8 {7 ]$ u6 T8 f) A$ ~( b5 U
    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 88:88 -p 6 -j ACCEPT -y
+ {; r4 o$ i5 N; {/ O    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 89:89 -p 6 -j ACCEPT -y4 h5 H2 S9 B/ N  H
    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 90:90 -p 6 -j ACCEPT -y4 J9 F# K3 o8 x9 a. g
    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 91:91 -p 6 -j ACCEPT -y
% Y5 W; x* J8 ~2 m2 \0 l6 ~    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 8180:8180 -p 6 -j ACCEPT -y
* t0 o3 g; `# n8 G    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 443:443 -p 6 -j ACCEPT -y0 ^* a5 j3 Z5 ~( g
    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 21:21 -p 6 -j ACCEPT -y
+ O  Q( I( h; N3 A) [    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 25:25 -p 6 -j ACCEPT -y
% ?8 B4 s2 ^4 n3 i7 l    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 22:22 -p 6 -j ACCEPT -y
- }! I7 t( j7 I; @    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 53:53 -p 6 -j ACCEPT -y
; e  R. k! L+ j) |2 T    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 9095:9095 -p 6 -j ACCEPT -y
2 c% G) X( b" L( W" G9 a    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 8007:8007 -p 6 -j ACCEPT -y" F' B9 s2 r. f  ^7 g+ Z3 G
    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 53:53 -p 17 -j ACCEPT
) W4 K+ c% M6 N) f5 \" T- Y    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 0:1023 -p 6 -j REJECT -y
' C2 x+ T6 I: }, N    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 2049:2049 -p 6 -j REJECT -y% n) j- z! p. U' T1 o7 @5 b7 i
    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 0:1023 -p 17 -j REJECT8 e$ o# D+ r! i0 u
    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 2049:2049 -p 17 -j REJECT
( B' p7 k7 C( i1 C    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 6000:6009 -p 6 -j REJECT -y
2 M- L: e# E- @/ l% X! @4 J" ^( K; k" U    -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 7100:7100 -p 6 -j REJECT -y! t: |- v5 T% J- y9 V  B6 `
    您需要把其中的"Saving `input'."去掉,然后把其他内容保存到/etc/sysconfig/ipchains文件,这样,下次重起之后,建立的规则能够重新生效。" D1 k: M- N% k$ ^; t
    3. 如果使用iptables
; I4 ]7 w$ e" x: }    RH 8.0以上开始启用iptables替代ipchains,两者非常类似,也有差别的地方。
) n5 b1 s! x/ ^    * 启用iptables
0 o; M1 h- G: }    如果/etc/sysconfig/下没有iptables文件,可以创建:, x: A) T1 C& ?& R1 Y
    # Firewall configuration written by lokkit. X& ]+ k3 z3 Z" ?
    # Manual customization of this file is not recommended.
$ k% j6 a7 d5 e: Z* B+ b, f. P9 h0 N    # Note: ifup-post will punch the current nameservers through the7 `/ n, t" g* g& \
    # firewall; such entries will *not* be listed here.: {7 [9 P- m* m# C* a
    *filter
9 u( j. `/ g. Q3 E, i  `    :INPUT ACCEPT [0:0]
; X! |5 d9 a/ y3 D" F4 O( g    :FORWARD ACCEPT [0:0]( Z/ R6 v9 ]! \  t. Q: Z( b+ g# z' i
    :OUTPUT ACCEPT [0:0]
& [1 n5 v* k0 `. ~& X2 x* @- I- z    :RH-Lokkit-0-50-INPUT - [0:0]8 G' f3 E6 R, n& T
    -A INPUT -j RH-Lokkit-0-50-INPUT
. ]$ e( k" s# J+ {7 P$ X    -A RH-Lokkit-0-50-INPUT -i lo -j ACCEPT. A' O/ I8 }, R
    -A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport ftp -j ACCEPT
# g- c5 d3 |) r: r0 F  I8 j    -A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport ssh -j ACCEPT: z- S" [+ p) Z0 r/ b: y
    -A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport http -j ACCEPT, k; q8 v9 n9 {+ m& ]* ~/ e
    -A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport smtp -j ACCEPT1 X: {4 d$ p3 c. W9 |1 p: l, X
    -A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport pop3 -j ACCEPT( C* c! \7 o& C8 C
    -A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport mysql -j ACCEPT
  i; u8 x) t  i& u9 P    -A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport 2001 -j ACCEPT! b* w2 \( w9 i2 T
    -A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport domain -j ACCEPT$ e7 A( b  |+ J2 s' c
    -A RH-Lokkit-0-50-INPUT -p udp -m udp --dport domain -j ACCEPT" o* J- |. w, A; W9 A
    -A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport 0:1023 --syn -j REJECT
" P5 P$ g8 s- H* q% {, g    -A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport 2049 --syn -j REJECT
1 B$ t: }1 J1 z1 O; `. I    -A RH-Lokkit-0-50-INPUT -p udp -m udp --dport 0:1023 -j REJECT' u# F# V% X+ o% t5 X2 S6 f" I) n
    -A RH-Lokkit-0-50-INPUT -p udp -m udp --dport 2049 -j REJECT) m* h  c  m" z4 v$ {  M
    -A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport 6000:6009 --syn -j REJECT
' _9 Y1 `5 e6 X1 a8 B6 x    -A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport 7100 --syn -j REJECT
% m; Z$ C7 N6 H& y/ w; {    COMMIT( i. y( D( k! ?# K
    以上配置允许了ftp, ssh, http, smtp, pop3, mysql, 2001(Prim@Hosting ACA端口),domain端口。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:19:53 | 显示全部楼层

Linux系统防火墙防止DOS和DDOS攻击

* 启动iptables     /etc/init.d/iptables start7 V8 h8 F' j9 ?0 ^0 P, ~* x
    * 设置iptables为自动启动
1 J1 {" [3 ~0 N5 H  B' f' P    chkconfig --level 2345 iptables on* Y' N" O1 n1 i5 n5 j# q1 _+ Y
    * 用iptables屏蔽IP" }4 R2 }/ s: t5 x
    iptables -I RH-Lokkit-0-50-INPUT 1 -p tcp -m tcp -s 213.8.166.227 --dport 80 --syn -j REJECT
4 ~' c" z! X& c& S  ]( b    注意到,和ipchains的区别是:
* i6 B: N- q/ j/ q, _    -I 后面跟的规则名称的参数和ipchains不同,不是统一的input,而是在/etc/sysconfig/iptables里定义的那个
! T5 i! i' q. A4 J    多了-m tcp
2 E: x. A5 ~" L# J, C3 _" P& J3 w    指定端口的参数是--dport 804 b) F  A3 W% x9 J7 m+ s. ]9 d
    多了--syn参数,可以自动检测sync攻击
$ W* `! {6 y6 p4 k+ i( P; b    使用iptables禁止ping:-A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 2 -j ACCEPT-A INPUT -p icmp -m icmp --icmp-type 8 -j REJECT --reject-with icmp-port-unreachable
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-2 23:44 , Processed in 0.202481 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表