|
|
楼主 |
发表于 2022-7-3 08:31:37
|
显示全部楼层
示例 1. 删除已有规则' ?3 r; P: I$ G5 d
在开始创建iptables规则之前,你也许需要删除已有规则。命令如下:: w$ o3 s" |* e
$ ~* k; t. B6 ^% \; b
iptables -F* p1 X! C6 Y( e* l. R9 U
5 [0 |" i+ C# M/ G$ }/ \- u: u
( or)) h6 x; u% v" e( B
, k4 y; S+ `( E4 Eiptables – flush
* D( Y$ d* m6 @) K j% w/ [) F! h6 g4 ?8 q! h* M- O
2.设置链的默认策略
' y- q6 A; [. ~$ {/ N% q5 J, r, g3 c9 {! R
链的默认政策设置为”ACCEPT”(接受),若要将INPUT,FORWARD,OUTPUT链设置成”DROP”(拒绝),命令如下:
j# H3 E1 L+ r5 m4 }
4 j6 }: {1 I4 m7 r. h# liptables -P INPUT DROP& o* T. \* ^9 |9 k2 D
0 h- Q( ?5 a9 G/ B! uiptables -P FORWARD DROP
% c" A5 o* I2 c
9 Y; {; D% C. n2 _8 l+ y6 \: ciptables -P OUTPUTDROP
+ @8 T4 c7 m5 L* _
: u. n2 l. Z% @* a7 b! L: e当INPUT链和OUTPUT链都设置成DROP时,对于每一个防火墙规则,我们都应该定义两个规则。例如:一个传入另一个传出。在下面所有的例子中,由于我们已将DROP设置成INPUT链和OUTPUT链的默认策略,每种情况我们都将制定两条规则。当然,如果你相信你的内部用户,则可以省略上面的最后一行。例如:默认不丢弃所有出站的数据包。在这种情况下,对于每一个防火墙规则要求,你只需要制定一个规则——只对进站的数据包制定规则。5 O1 \6 C- P b, ^9 X" G0 i
4 L! e6 V* K+ i/ H4 I3 `
3. 阻止指定IP地址5 E, _) k' I1 E+ M/ e$ Q- N4 d
) y9 O4 [ n4 T5 c
例:丢弃来自IP地址x.x.x.x的包
$ n) P, ?& |; X" w3 j* W# L4 n. w* @( ~/ b
BLOCK_THIS_IP= "x.x.x.x"5 f1 e5 L$ I/ c7 `7 B4 K
- N8 e6 R5 b% H! V' e" x
iptables -A INPUT -s "$BLOCK_THIS_IP"-j DROP
( }( v# [4 l4 ?/ W; q* R/ i. T
; N" i W- I% ~/ Q7 I c注:当你在log里发现来自某ip地址的异常记录,可以通过此命令暂时阻止该地址的访问以做更深入分析
% S9 s. L1 `; O# ?5 z( F
( W, Z0 K& j$ ]# O6 |例:阻止来自IP地址x.x.x.x eth0 tcp的包0 d5 j+ s9 Q( ~" t: K& O
! ^1 y: V* H4 [& |7 r
iptables-A INPUT -i eth0 -s "$BLOCK_THIS_IP"-j DROP: D4 W# H% w) C, r' d
0 a5 x0 F8 ]. B z7 Z" K" ]0 Siptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP"-j DROP
7 @ F5 h- L2 u- T$ P% ~5 b v. l
+ W/ x/ k3 c! h" _4. 允许所有SSH的连接请求
) V6 ^' z4 ]; b$ C% U% [* V. {# P& s# b
例:允许所有来自外部的SSH连接请求,即只允许进入eth0接口,并且目标端口为22的数据包: C3 Q5 c2 E+ q4 T* {
) W9 J2 f( W) w- D6 G
iptables -A INPUT -i eth 0-p tcp --dport 22- mstate-- stateNEW,ESTABLISHED -j ACCEPT" f; H) e" d/ M
) z' Y4 j! X( D& v2 A& _iptables -A OUTPUT -o eth 0-p tcp --sport 22- mstate-- stateESTABLISHED -j ACCEPT' Z e7 f- J8 G- u6 a/ A9 h: G& ]0 L
2 W, a. V9 z! e6 D5. 仅允许来自指定网络的SSH连接请求
' S7 G$ i; q7 o6 ]$ C; S& u: U. F1 ~+ k. W2 n
例:仅允许来自于192.168.100.0/24域的用户的ssh连接请求
1 r' ]& h. h3 s1 Z5 j; |+ A! n) ?0 G; D& R
iptables -A INPUT -i eth 0-p tcp - s192.168. 100.0/ 24--dport 22- mstate-- stateNEW,ESTABLISHED -j ACCEPT
) e) s: s: y# \. i/ B9 \7 A
; {" y' y8 _! xiptables -A OUTPUT -o eth 0-p tcp --sport 22- mstate-- stateESTABLISHED -j ACCEPT
6 i( H/ }9 v& `; z3 }1 p) O5 C8 X/ B9 r2 g
6.允许http和https的连接请求
) \2 H5 Q0 ~3 K7 [" l
( Y! ?& g5 _% i9 W% G: `/ \例:允许所有来自web - http的连接请求
+ }+ j& S1 K1 E" T( W. O1 q
" z4 q) v' E/ O& Q0 l* g+ M1 ciptables -A INPUT -i eth 0-p tcp --dport 80- mstate-- stateNEW,ESTABLISHED -j ACCEPT& X/ S7 ^; Z) f9 c1 }+ F: \
( c8 n- a7 `/ a A$ l% Niptables -A OUTPUT -o eth 0-p tcp --sport 80- mstate-- stateESTABLISHED -j ACCEPT8 g' t7 g- H* X5 y+ d
6 m2 E0 N8 h! b例:允许所有来自web - https的连接请求
" L! @$ N' [- r, o- \$ E
+ ]8 d* f5 K+ Y& c; i2 diptables -A INPUT -i eth 0-p tcp --dport 443- mstate-- stateNEW,ESTABLISHED -j ACCEPT
1 q" T; H" [- X8 n5 X8 b& d
9 L$ X4 f, }* H4 S, K" |iptables -A OUTPUT -o eth 0-p tcp --sport 443- mstate-- stateESTABLISHED -j ACCEPT
s1 r, E6 ?+ Y6 m. _" H0 ^$ F+ v# U" Q8 |3 F
7. 使用multiport 将多个规则结合在一起' `2 ]2 K7 ]2 k5 t& V
' s5 p& c' d5 _& z8 N( }允许多个端口从外界连入,除了为每个端口都写一条独立的规则外,我们可以用multiport将其组合成一条规则。如下所示:) `' ^6 [" ^- F0 d$ M
, ^2 H6 y) Q2 L s# }7 Y; Y例:允许所有ssh,http,https的流量访问- p4 j0 A" g+ s F, g
3 T1 F, M2 E* O9 L wiptables -A INPUT -i eth 0-p tcp - mmultiport --dports 22, 80, 443- mstate-- stateNEW,ESTABLISHED -j ACCEPT
. w% K$ N0 h6 s- x2 g
- K' J9 u% }$ }( ]* s d+ @iptables -A OUTPUT -o eth 0-p tcp - mmultiport --sports 22, 80, 443- mstate-- stateESTABLISHED -j ACCEPT" o+ L4 q1 a. O4 K. A3 s. l# B
: y, E/ P% B- H ^9 {8 Z. b
8. 允许从本地发起的SSH请求iptables -A OUTPUT -o eth 0-p tcp --dport 22- mstate-- stateNEW,ESTABLISHED -j ACCEPT
7 A3 w4 D9 @% n0 M; e/ e) `4 j, [: w& e$ ~; @
iptables -A INPUT -i eth 0-p tcp --sport 22- mstate-- stateESTABLISHED -j ACCEPT
" x8 \& {+ p4 e3 I; E$ n% f$ j% w7 _& s+ a. h Q
请注意,这与允许ssh连入的规则略有不同。本例在OUTPUT链上,我们允许NEW和ESTABLISHED状态。在INPUT链上,我们只允许ESTABLISHED状态。ssh连入的规则与之相反。' z4 p4 Y3 I; d. Q
3 k1 j( ~+ Z6 B6 [9 q
9. 仅允许从本地发起到一个指定的网络域的SSH请求
( |. A) o6 n- _! A2 P6 y9 l7 r$ ^5 x5 G2 D
例:仅允许从内部连接到网域192.168.100.0/246 P2 w) k+ F2 `7 y: ?' L- @5 P
5 l' g ^6 S9 K" q2 xiptables -A OUTPUT -o eth 0-p tcp -d 192.168. 100.0/ 24--dport 22- mstate-- stateNEW,ESTABLISHED -j ACCEPT
- G( Y/ T* \* F+ _. ]
# s% f9 a* ]2 |- t) Wiptables -A INPUT -i eth 0-p tcp --sport 22- mstate-- stateESTABLISHED -j ACCEPT/ t, \) a3 ]; B9 P6 d7 q7 K; L
- S; Z' c( p9 b6 r. n+ r! |
10. 允许从本地发起的HTTPS连接请求8 h) U- p% d- }7 H' m
9 h7 o q% h+ ^" [
下面的规则允许输出安全的网络流量。如果你想允许用户访问互联网,这是非常有必要的。在服务器上,这些规则能让你使用wget从外部下载一些文件- P7 d9 D3 ~& _: {/ D
( g9 p% B/ O& k d+ j3 ^3 @3 I: P' Z
iptables -A OUTPUT -o eth 0-p tcp --dport 443- mstate-- stateNEW,ESTABLISHED -j ACCEPT
; k b* V# [6 K3 M' Q5 y" H9 f5 r9 r( E7 v* x: {( W2 j
iptables -A INPUT -i eth 0-p tcp --sport 443- mstate-- stateESTABLISHED -j ACCEPT7 g V. M* P' a! M
& a6 W$ |& f# i. H( g4 U
注:对于HTTP web流量的外联请求,只需要将上述命令中的端口从443改成80即可。6 E* o& c$ r$ U
) P' x8 k5 o) ?) I+ ?
11. 负载平衡传入的网络流量
. e7 t! ?( s: d; l! ?+ Y! x. A& K( X @
使用iptables可以实现传入web流量的负载均衡,我们可以传入web流量负载平衡使用iptables防火墙规则。" X. x2 ~9 ^0 D: \
6 X+ q1 a# c, X" o S
例:使用iptables nth将HTTPS流量负载平衡至三个不同的ip地址。
- N' M; l+ T% T$ I% e8 C5 u! O. |0 @% Y% X
iptables-APREROUTING-ieth0-ptcp--dport443 -mstate--stateNEW-mnth--counter0 --every3 --packet0 -jDNAT--to-destination192 .168.1.101:4430 E; \$ y; k5 N( M/ l2 Q
: w L" k. g* }' E
iptables-APREROUTING-ieth0-ptcp--dport443 -mstate--stateNEW-mnth--counter0 --every3 --packet1 -jDNAT--to-destination192 .168.1.102:443
/ `1 X0 `) T! q0 j# Q4 a2 ^# e6 a& W, h X! l, i
iptables-APREROUTING-ieth0-ptcp--dport443 -mstate--stateNEW-mnth--counter0 --every3 --packet2 -jDNAT--to-destination192 .168.1.103:443
; F6 h% ?& f: r# Z9 A% g W
4 m$ |: P+ e6 [$ ~6 O) Z9 R' Z12. 允许外部主机ping内部主机iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
' f# p. |0 V {2 W' ?5 P8 o3 G
2 u# r6 J& w, |5 Y" J" Jiptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
( C# o p2 K" i0 c) H, c) y( \8 h# V0 `3 @8 k
13. 允许内部主机ping外部主机iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
. g, r5 t6 p! T6 l! r3 w6 [
) g- _2 l& j; W7 m/ Iiptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
7 v$ e' V# N- B m6 j, E. G! d: A" m M1 V+ y, s; n
14. 允许回环访问
" \/ V/ R3 I( [
& d: z) c- _+ n4 Y5 [例:在服务器上允许127.0.0.1回环访问。- \" l1 K- W" I. t6 V5 a
2 e6 L( g- Y7 giptables-A INPUT -i lo -j ACCEPT( y6 o9 S( `( \% Q2 Y+ n
! e2 J8 ], i* W! f1 s8 N- D
iptables -A OUTPUT -o lo -j ACCEPT
+ l& x. N0 d. C2 q6 G
$ {5 g5 U. X8 ^4 a7 Q15. 允许内部网络域外部网络的通信3 J+ [0 {; R, u; \ S! t- n
; `" X# m9 @/ c防火墙服务器上的其中一个网卡连接到外部,另一个网卡连接到内部服务器,使用以下规则允许内部网络与外部网络的通信。此例中,eth1连接到外部网络(互联网),eth0连接到内部网络(例如:192.168.1.x)。6 r2 H+ {$ |- S) a
" a2 s; i2 e" q' v9 yiptables-A FORWARD -i eth0 -o eth1 -j ACCEPT" f* Q) F( _: K
$ F, I* B; w. S) o4 C16. 允许出站的DNS连接iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
4 z; |* k' ]5 `* t( d
' h/ c+ p( T# l1 |1 z+ |iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
, D x% \ Z/ T& ^
; ~, O, ]% W& G7 ~) ~1 i; f17. 允许NIS连接
( a8 x+ Y w4 {+ R7 H, X3 H
3 T- D1 a- r& |2 |4 Q如果你使用NIS管理用户帐户,你需要允许NIS连接。如果你不允许NIS相关的ypbind连接请求,即使SSH连接请求已被允许,用户仍然无法登录。NIS的端口是动态的,先使用命令rpcinfo –p来知道端口号,此例中为853和850端口。) E+ N3 [8 K, z
& B+ J+ z; b) z9 e$ Mrpcinfo-p | grep ypbind
( [0 X& [! C, y+ z \; W3 f: h$ h) [6 s2 Y5 ]2 S4 w
例:允许来自111端口以及ypbind使用端口的连接请求3 R6 R! t7 }3 q8 |
4 \! [$ [! x8 S+ A. p7 R
iptables -A INPUT -p tcp --dport 111 -j ACCEPT/ A! g+ b9 R* V6 @/ Z
: X* G- i" Y* W4 s1 P$ e* D& qiptables -A INPUT -p udp --dport 111 -j ACCEPT
8 ^/ X5 b: ^8 e U! V9 v1 Q! N1 `4 p% T4 r2 C' ^! Z. f% P2 @9 b. E
iptables -A INPUT -p tcp --dport 853 -j ACCEPT- `' O2 @6 u# c0 L- d: ]
( Y5 J% g9 \- K# i) V$ c( G7 riptables -A INPUT -p udp --dport 853 -j ACCEPT% L* Y* F& o! V) Q0 C+ F& f" {+ o
, F& Z& u1 Z) V' u, L; J; f
iptables -A INPUT -p tcp --dport 850 -j ACCEPT G1 @4 N1 S" X* b( s
& {) S }5 y! s, X4 o0 D/ J* T6 V3 ^! Wiptables -A INPUT -p udp --dport 850 -j ACCEPT1 L. C Q2 ?9 s) D3 a
0 g8 w- K2 k0 I0 H; I) j注:当你重启ypbind之后端口将不同,上述命令将无效。有两种解决方案:1)使用你NIS的静态IP 2)编写shell脚本通过“rpcinfo - p”命令自动获取动态端口号,并在上述iptables规则中使用。& X+ @: }/ I ]9 @/ d
D' W I0 f8 C7 c7 l6 H
18. 允许来自指定网络的rsync连接请求% P3 F; X0 f+ M, o$ L1 z5 N1 f
5 u) ^$ t1 F& N例:允许来自网络192.168.101.0/24的rsync连接请求
2 b4 y" m3 s5 b# n* W* v0 I$ T' m B) c7 U8 P" A
iptables -A INPUT -i eth 0-p tcp - s192.168. 101.0/ 24--dport 873- mstate-- stateNEW,ESTABLISHED -j ACCEPT" P5 z2 l3 D9 C
, E! [2 L2 u1 z3 Piptables -A OUTPUT -o eth 0-p tcp --sport 873- mstate-- stateESTABLISHED -j ACCEPT' B) p o2 x/ I# }7 V
' Y% |% _ }% h$ d' u
19. 允许来自指定网络的MySQL连接请求
) N( |. a/ j" {
3 k5 ^, @. X. m B7 I$ ]2 [很多情况下,MySQL数据库与web服务跑在同一台服务器上。有时候我们仅希望DBA和开发人员从内部网络(192.168.100.0/24)直接登录数据库,可尝试以下命令:" |* D& H( s6 k; L
4 |2 b# l* l8 B9 |3 ^ l* e, ^
iptables -A INPUT -i eth 0-p tcp - s192.168. 100.0/ 24--dport 3306- mstate-- stateNEW,ESTABLISHED -j ACCEPT* x- R! G3 |1 a6 n
8 T$ s& A- D- m: V' A$ [
iptables -A OUTPUT -o eth 0-p tcp --sport 3306- mstate-- stateESTABLISHED -j ACCEPT
" c6 s9 N6 ?8 B4 z( n7 L% _5 Z: a
6 U/ u+ h. @: V20. 允许Sendmail, Postfix邮件服务* E/ U$ ^. C" e; S
( C9 \5 F' ^3 _. l& ]* [. \Sendmail和postfix都使用了25端口,因此我们只需要允许来自25端口的连接请求即可。5 A( \1 m0 t/ |8 e& h0 m3 {
2 T5 g2 z2 G3 @" Z) d
iptables -A INPUT -i eth 0-p tcp --dport 25- mstate-- stateNEW,ESTABLISHED -j ACCEPT
5 E* G2 G+ e$ r! ]' e
1 f8 K, u. m9 Z aiptables -A OUTPUT -o eth 0-p tcp --sport 25- mstate-- stateESTABLISHED -j ACCEPT
: x) g6 |; J7 K C2 r0 g6 t5 T; d( P8 `* i/ K! z# p
21. 允许IMAP和IMAPS
2 h/ \! Q& D' W0 ~5 [6 ^0 h1 S: }: I
例:允许IMAP/IMAP2流量,端口为143
4 h9 A! ~) o1 W% O- O# R# K. J( K& L, @ m: ]4 n; S- B# o
iptables -A INPUT -i eth 0-p tcp --dport 143- mstate-- stateNEW,ESTABLISHED -j ACCEPT
: Q5 t, O7 N. }9 M# n* u9 o# u; L7 V9 _2 \* d. K& Z: P* ^1 j% d8 y
iptables -A OUTPUT -o eth 0-p tcp --sport 143- mstate-- stateESTABLISHED -j ACCEPT
1 Q/ N- y( x `6 r* E1 w- H( ]& h% N8 j6 t" n3 S+ Y1 c, F+ n
例:允许IMAPS流量,端口为993- k8 {) G9 a; k( W5 C& Y' _/ n
5 y6 n0 ~1 G' s1 d
iptables -A INPUT -i eth 0-p tcp --dport 993- mstate-- stateNEW,ESTABLISHED -j ACCEPT& j' X1 ~$ O+ i" E& V
+ q8 U+ H! g) q/ y4 ~% viptables -A OUTPUT -o eth 0-p tcp --sport 993- mstate-- stateESTABLISHED -j ACCEPT9 V. z# [0 j: Q& K& F. e
1 K! \4 v5 U1 B, z# I
22. 允许POP3和POP3S+ k3 E! P; [( C. D! ~7 E8 S
. A+ ?. [+ Z7 v# |/ g; v8 K
例:允许POP3访问
. I; d- i4 X" V9 F
5 Q. A1 i3 @! f& B3 piptables -A INPUT -i eth 0-p tcp --dport 110- mstate-- stateNEW,ESTABLISHED -j ACCEPT7 u7 h9 a8 F, @3 I% k( P% g9 Q
0 l+ s6 g+ V* I% Z
iptables -A OUTPUT -o eth 0-p tcp --sport 110- mstate-- stateESTABLISHED -j ACCEPT+ H; D r/ h' f, y+ N# T5 I' u
9 S) c" D( c* g( t2 U例:允许POP3S访问! t6 T6 ?9 r+ e1 k' e$ p! Q4 d
% s3 \, k4 p. {: k& |4 s' L; b
iptables -A INPUT -i eth 0-p tcp --dport 995- mstate-- stateNEW,ESTABLISHED -j ACCEPT
* F) d6 X) ^' ?! `# h% A! V
G' q3 B/ Z5 f& y/ ]: T4 j- Kiptables -A OUTPUT -o eth 0-p tcp --sport 995- mstate-- stateESTABLISHED -j ACCEPT
; r- Q9 V: p e1 x. C
6 K, Z# q- }' u H23. 防止DoS攻击iptables -A INPUT -p tcp --dport 80 -m limit-- limit25/minute -- limit-burst 100 -j ACCEPT( k+ V. h) J3 v; u4 Z# o
( W! w K+ R) Z1 G# Y3 c1 o$ Y5 F+ _: Q上述例子中:$ A8 }/ V6 D V# z' V1 Z k
* x( J9 k8 m; D. ?( R
-m limit: 启用limit扩展
" U' S; Z! H; I/ n$ V# Z9 Z B# X$ ^! \( s5 X
–limit 25/minute: 允许最多每分钟25个连接(根据需求更改)。
% z& w; {1 `( p3 Y
) Y# {4 d. e" q/ @% o–limit-burst 100: 只有当连接达到limit-burst水平(此例为100)时才启用上述limit/minute限制。
# I1 n z: K# \. J, y t9 B
- r/ |9 _ p1 d24. 端口转发. Z" _# C( N' m
例:将来自422端口的流量全部转到22端口。
1 i/ @! ^" X, m+ M( Y+ U+ N" n8 y7 D+ K c7 x- |
这意味着我们既能通过422端口又能通过22端口进行ssh连接。启用DNAT转发。
: g1 E+ Z7 M4 i& B; ]5 C
# Z" W! a+ w2 |6 G& J; [# p1 aiptables-tnat-APREROUTING-ptcp-d192 .168.102.37--dport422 -jDNAT--to192 .168.102.37:22. [8 \! \) Y; I& J, ^9 }3 i
7 G( n0 v* t4 c* q: o1 V" m除此之外,还需要允许连接到422端口的请求6 w, w; M5 j( V+ [9 g
( `. G! z9 \- u% G* t# w9 E" Oiptables -A INPUT -i eth 0-p tcp --dport 422- mstate-- stateNEW,ESTABLISHED -j ACCEPT; E. l: P$ W Z: n2 p
6 k# _0 `/ |; ~+ W3 F( [iptables -A OUTPUT -o eth 0-p tcp --sport 422- mstate-- stateESTABLISHED -j ACCEPT
) r4 a+ }" P L. X4 ~" l; l3 O7 R, B) K: p" T' n
25. 记录丢弃的数据表+ o" i; |+ v; D
7 p7 g W: K ~5 L第一步:新建名为LOGGING的链
8 z) ^; N- O& d! U* D5 o4 f* L0 j% y L
iptables-N LOGGING+ {- @% R6 y3 \( R
. A6 F2 U- i0 X& z: G$ L: A: X0 r! k
第二步:将所有来自INPUT链中的数据包跳转到LOGGING链中' Q8 h7 O3 K( n$ i6 }2 S* Q: |
1 f, J) \2 S) j" K: i( r1 Q
iptables-A INPUT -j LOGGING
7 ^8 g7 T" G- [* s: Q `& o2 j2 d% N- H/ d
第三步:为这些包自定义个前缀,命名为”IPTables Packet Dropped”
7 q4 ?2 b: r6 I4 j% t4 G% }& K1 C6 F2 x1 M7 d, w" O/ x
iptables -A LOGGING -m limit-- limit2/min -j LOG -- log-prefix "IPTables Packet Dropped: "-- log-level 7
- G% M* i8 u5 P) f' H T$ p$ V' L
第四步:丢弃这些数据包4 F. D- P4 b* F& A3 ], I2 l' N
. b5 |1 G$ Z% E$ v6 a, ? yiptables-A LOGGING -j DROP |
|