|
|
楼主 |
发表于 2022-7-3 08:31:37
|
显示全部楼层
示例 1. 删除已有规则
( V( L$ u: R$ H6 _$ I$ V在开始创建iptables规则之前,你也许需要删除已有规则。命令如下:
: e D( _1 ^' G8 m) y- R( p
5 A. J* @0 t- I3 N Niptables -F: Z( A" j0 m" H0 E1 j4 E
) c7 n. g! e5 z6 m$ [6 G
( or)* W: B6 T6 G) S
( p+ w5 l% I4 i) S. p7 oiptables – flush
7 Y5 ^! X. ~# X
6 x! [# ^, ~8 e2 G" p$ o2.设置链的默认策略8 h& p3 ^, A' `3 T* e9 e
& u* v9 N1 A( m" e* k. Y链的默认政策设置为”ACCEPT”(接受),若要将INPUT,FORWARD,OUTPUT链设置成”DROP”(拒绝),命令如下:
) c! k% m$ z( _" K" ?) P% Q. N1 V8 q0 q
; l* _, P- e# X' Tiptables -P INPUT DROP
/ r# Y6 B7 f; E+ M; X* h" D% W1 q1 N# J9 l/ p
iptables -P FORWARD DROP) g% y* I( T# A6 Y# ~& Y) x
0 m: c6 }% ^2 E9 d% ~3 G1 G+ O0 Iiptables -P OUTPUTDROP( V4 \! _9 \; r$ p9 |
; e5 V1 D( {/ S, A5 U! w7 P; P当INPUT链和OUTPUT链都设置成DROP时,对于每一个防火墙规则,我们都应该定义两个规则。例如:一个传入另一个传出。在下面所有的例子中,由于我们已将DROP设置成INPUT链和OUTPUT链的默认策略,每种情况我们都将制定两条规则。当然,如果你相信你的内部用户,则可以省略上面的最后一行。例如:默认不丢弃所有出站的数据包。在这种情况下,对于每一个防火墙规则要求,你只需要制定一个规则——只对进站的数据包制定规则。
& O' V7 A+ o. @% x4 E1 [2 |8 }" V! P6 S: T0 B# Z
3. 阻止指定IP地址2 N0 \( H4 j0 K/ s0 b
$ x0 ?/ @1 ~! y* \$ I+ `例:丢弃来自IP地址x.x.x.x的包9 m2 F2 l2 Z& a, c# |& F$ A
+ {1 d& s t+ ?* X; S% Z
BLOCK_THIS_IP= "x.x.x.x"1 r& T/ k; ], Y2 _0 E
3 w/ @0 f4 u) \7 L4 e0 b6 L" uiptables -A INPUT -s "$BLOCK_THIS_IP"-j DROP
& P C& N; M2 E7 C" {7 ~, |- i5 q P+ j1 r0 H r
注:当你在log里发现来自某ip地址的异常记录,可以通过此命令暂时阻止该地址的访问以做更深入分析
* F9 {( N c% E) C$ `: [' C+ [# S; j1 l
例:阻止来自IP地址x.x.x.x eth0 tcp的包+ C$ @2 }6 `$ z: n. @& K" R; s0 m* }
* R7 n" J% ?% m
iptables-A INPUT -i eth0 -s "$BLOCK_THIS_IP"-j DROP
8 d( B4 T7 p7 Q# H; w" s3 }9 p9 D/ |9 t" l& g- s$ r) S9 {* l: @
iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP"-j DROP; o1 C( Z+ I8 _" l7 T+ r9 ]0 ~" t
- p9 E, s# t" q: H$ m* o: H9 e
4. 允许所有SSH的连接请求
6 X w7 @# B* ]2 M. w9 I* W! g# m' z) f: y
例:允许所有来自外部的SSH连接请求,即只允许进入eth0接口,并且目标端口为22的数据包
) q& O* ^7 c' d( O( d% c; n3 J: e" i
iptables -A INPUT -i eth 0-p tcp --dport 22- mstate-- stateNEW,ESTABLISHED -j ACCEPT
) F b8 `8 S0 Z4 ]
2 C0 I. i+ e1 y( F. \iptables -A OUTPUT -o eth 0-p tcp --sport 22- mstate-- stateESTABLISHED -j ACCEPT8 [8 X* }, `% D
( G8 O2 j8 W! n J% r( y4 b" x& n
5. 仅允许来自指定网络的SSH连接请求
3 a6 b% t* v! U: b2 |5 L2 z
& |8 Z; i9 Y1 P: T/ N7 j0 ]( o6 r例:仅允许来自于192.168.100.0/24域的用户的ssh连接请求- [. \, ~3 E3 X2 k7 q/ l% C$ M
; R7 H+ B$ ^7 L1 Kiptables -A INPUT -i eth 0-p tcp - s192.168. 100.0/ 24--dport 22- mstate-- stateNEW,ESTABLISHED -j ACCEPT
4 ]# X8 M& U- r! H% ~0 d/ Q5 R8 J/ v/ \& P0 P& c# w
iptables -A OUTPUT -o eth 0-p tcp --sport 22- mstate-- stateESTABLISHED -j ACCEPT
: m$ ^- {, F: d' F6 M3 y0 b& z" v5 @4 T5 Q J% K. g4 b
6.允许http和https的连接请求" Q7 b$ ], D8 n
, S! ^4 M: D5 H" ~" R4 g" l e
例:允许所有来自web - http的连接请求
) {& H8 Y, H8 u _* V
8 U- a. ?. E2 h; viptables -A INPUT -i eth 0-p tcp --dport 80- mstate-- stateNEW,ESTABLISHED -j ACCEPT
( c9 ?0 @1 `; X V* x7 F! U9 Q' M. v3 D
iptables -A OUTPUT -o eth 0-p tcp --sport 80- mstate-- stateESTABLISHED -j ACCEPT
o* J- h; Z" R% W& ]0 F- s: Z+ e0 U; `5 F8 _
例:允许所有来自web - https的连接请求' K* ^+ h4 O {% h' |, m, C5 H
. R. f6 A m7 v* N. piptables -A INPUT -i eth 0-p tcp --dport 443- mstate-- stateNEW,ESTABLISHED -j ACCEPT
y$ [8 g; p8 |$ K+ K5 z/ A& f+ N4 ~- X/ B E2 F
iptables -A OUTPUT -o eth 0-p tcp --sport 443- mstate-- stateESTABLISHED -j ACCEPT
0 }- q2 C% c2 h+ j0 l9 q6 m
n! G; X K& H- I7. 使用multiport 将多个规则结合在一起
; u7 O8 ^: r/ e: ]8 ?* {0 o- W/ q8 t! ]( u" I% B
允许多个端口从外界连入,除了为每个端口都写一条独立的规则外,我们可以用multiport将其组合成一条规则。如下所示:
n/ S; Q. u$ K7 X
G( I: j$ R( s7 `$ O" G/ V例:允许所有ssh,http,https的流量访问) r- r& @( i& i
: p" x8 e) s" z
iptables -A INPUT -i eth 0-p tcp - mmultiport --dports 22, 80, 443- mstate-- stateNEW,ESTABLISHED -j ACCEPT+ Q# [1 ~7 B. m# ]( e( |
( P; `4 ~. ~) o
iptables -A OUTPUT -o eth 0-p tcp - mmultiport --sports 22, 80, 443- mstate-- stateESTABLISHED -j ACCEPT4 @; `& w2 I, v/ `, g# b9 v' f
8 l; |6 l/ }; ^2 x f d
8. 允许从本地发起的SSH请求iptables -A OUTPUT -o eth 0-p tcp --dport 22- mstate-- stateNEW,ESTABLISHED -j ACCEPT
1 i0 [7 R. Y: {% B+ d( s
/ d2 f/ l; b* O0 p: giptables -A INPUT -i eth 0-p tcp --sport 22- mstate-- stateESTABLISHED -j ACCEPT
+ B4 g+ V: ]3 Z7 {
9 d: H- H* R6 [, n请注意,这与允许ssh连入的规则略有不同。本例在OUTPUT链上,我们允许NEW和ESTABLISHED状态。在INPUT链上,我们只允许ESTABLISHED状态。ssh连入的规则与之相反。
/ M( T" n6 y4 y% L6 Q1 c$ E* | d2 v+ }% z8 R \ w1 j5 Z. |1 O
9. 仅允许从本地发起到一个指定的网络域的SSH请求
; G9 W( b% }/ }, v" W# k2 a+ x* X& ~' |( {# g* {. J) l
例:仅允许从内部连接到网域192.168.100.0/24+ \" R7 X8 L0 }$ a% B4 u
* T7 @/ K3 A- Z# L; J% iiptables -A OUTPUT -o eth 0-p tcp -d 192.168. 100.0/ 24--dport 22- mstate-- stateNEW,ESTABLISHED -j ACCEPT$ t8 N) N* X% M2 W
( m. o0 W6 H7 [ g; w) I2 Siptables -A INPUT -i eth 0-p tcp --sport 22- mstate-- stateESTABLISHED -j ACCEPT. v" r H5 p1 I5 J8 B
o$ J% ]1 b, ]; D7 k5 w10. 允许从本地发起的HTTPS连接请求# h _ k. I7 M# F. c+ A
% B* s; }+ Z+ g. B3 ]: G x+ |8 P
下面的规则允许输出安全的网络流量。如果你想允许用户访问互联网,这是非常有必要的。在服务器上,这些规则能让你使用wget从外部下载一些文件
" u E1 a" _- H& S" D0 w; Y& b+ G
iptables -A OUTPUT -o eth 0-p tcp --dport 443- mstate-- stateNEW,ESTABLISHED -j ACCEPT0 Y/ \ D; |6 j1 S8 P. p
1 Q- D( ^# t Ciptables -A INPUT -i eth 0-p tcp --sport 443- mstate-- stateESTABLISHED -j ACCEPT
; m- D9 W& c' p
4 J) n' `0 ]! h2 \! V/ W9 A# x! y注:对于HTTP web流量的外联请求,只需要将上述命令中的端口从443改成80即可。
e9 a' i# _- [, u; D! t! e i; [
, j% P$ s3 x3 r/ u8 r) }11. 负载平衡传入的网络流量* L' V7 c% x" s) }' C
1 Y: o+ l( g# i- m8 R8 o# V
使用iptables可以实现传入web流量的负载均衡,我们可以传入web流量负载平衡使用iptables防火墙规则。+ {5 ?9 h5 p1 b# y5 i# j! y
- c! B9 `: p- k1 |) \- r, `+ s
例:使用iptables nth将HTTPS流量负载平衡至三个不同的ip地址。
* _" U; Y+ N. f7 [# K: I: ]: t! \: |6 c: t! t& m
iptables-APREROUTING-ieth0-ptcp--dport443 -mstate--stateNEW-mnth--counter0 --every3 --packet0 -jDNAT--to-destination192 .168.1.101:443, t, |( J! F. K3 x( W
& x3 l1 n( |6 {1 e$ R8 p7 ^iptables-APREROUTING-ieth0-ptcp--dport443 -mstate--stateNEW-mnth--counter0 --every3 --packet1 -jDNAT--to-destination192 .168.1.102:443
I' f1 ~" j1 _% u* f4 \( x. Z# O
: `* s+ ~4 M) ~6 u' j* D' }iptables-APREROUTING-ieth0-ptcp--dport443 -mstate--stateNEW-mnth--counter0 --every3 --packet2 -jDNAT--to-destination192 .168.1.103:443
# P9 z- ?/ n. F# ~0 i
& C k# q# U8 N0 I6 b" r! T12. 允许外部主机ping内部主机iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
' g' e5 S+ }) ?0 B" [8 D: h$ Y8 _5 K
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT. k0 X0 K2 Y( {1 c6 {
( x. t7 ^( b. c: M7 u2 b
13. 允许内部主机ping外部主机iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
% o3 A- B* p$ a. `4 f* z6 f( y3 n: i/ V
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT. E# `5 V# r. E) Q2 J
8 ^' h- k5 B9 q9 p3 O: E3 ?9 i
14. 允许回环访问2 O, |; n# D$ N; K3 A7 c
( n, ?9 N' f1 U8 j% r/ i* G) S例:在服务器上允许127.0.0.1回环访问。. b) x+ Q- v, G" D/ d4 Q
% v& b8 W; v/ @2 B! Wiptables-A INPUT -i lo -j ACCEPT
* d& x2 |7 S. D$ P! u' i$ l1 [' `& V# N( Q
iptables -A OUTPUT -o lo -j ACCEPT, k" a. r. d7 }$ u
: J" h/ P6 f* d7 \% l9 j. W* i* X' Z15. 允许内部网络域外部网络的通信3 J M, _0 L( _' U
$ @+ s6 J& b, V. k. K4 Q防火墙服务器上的其中一个网卡连接到外部,另一个网卡连接到内部服务器,使用以下规则允许内部网络与外部网络的通信。此例中,eth1连接到外部网络(互联网),eth0连接到内部网络(例如:192.168.1.x)。0 l5 A; N# z) D* u1 P0 `7 K
+ `. W! v9 W4 u, \' `- Q0 Fiptables-A FORWARD -i eth0 -o eth1 -j ACCEPT5 a1 p4 Y* v, R* d/ H- K
( a6 u3 g* N1 p16. 允许出站的DNS连接iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT9 o; M" x b1 ~- O, ^0 j' R1 D
9 I* ~+ C9 [3 W' U8 H1 xiptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT4 J5 F+ L9 S- k
/ \* U3 b) v3 R9 X$ |17. 允许NIS连接( X D. k9 O) F+ g8 x
6 {% P2 Q# A9 h$ L4 y
如果你使用NIS管理用户帐户,你需要允许NIS连接。如果你不允许NIS相关的ypbind连接请求,即使SSH连接请求已被允许,用户仍然无法登录。NIS的端口是动态的,先使用命令rpcinfo –p来知道端口号,此例中为853和850端口。9 w' J) i) j% X- X! r+ O2 V* v
5 p% Z3 W7 }/ ?6 N. Grpcinfo-p | grep ypbind% B# s) W! E0 ~4 t% d( {1 @
) y. K5 q: r" a, j例:允许来自111端口以及ypbind使用端口的连接请求
3 e' _4 p/ V2 W& O. d& K( V
! ]- k: m) @. b! w( [iptables -A INPUT -p tcp --dport 111 -j ACCEPT1 ~: K( U/ v/ P
2 `2 Z" }1 F9 wiptables -A INPUT -p udp --dport 111 -j ACCEPT7 _; b& ?1 Y+ N8 K
$ U( H1 w7 B! W. G; l$ _iptables -A INPUT -p tcp --dport 853 -j ACCEPT
8 o( k8 S h; b) K4 ^6 H5 {3 i9 }8 R0 f- H, E: D
iptables -A INPUT -p udp --dport 853 -j ACCEPT2 L4 O1 U! E9 ^- }9 X$ }
5 r! L# \, l9 `2 e2 g% V/ oiptables -A INPUT -p tcp --dport 850 -j ACCEPT, B- v+ u% {1 \7 K1 Y; @
/ v/ m, U( g4 A. M, x+ I/ y9 \4 k, Hiptables -A INPUT -p udp --dport 850 -j ACCEPT
' Y% v) F: v; a& M0 i! J$ u4 k) z1 V* H# e0 \6 o& m
注:当你重启ypbind之后端口将不同,上述命令将无效。有两种解决方案:1)使用你NIS的静态IP 2)编写shell脚本通过“rpcinfo - p”命令自动获取动态端口号,并在上述iptables规则中使用。
F9 F" u) c/ K- M3 N" N1 e# E" p, e5 t8 W5 ^
18. 允许来自指定网络的rsync连接请求
. ^; F+ x+ ~+ ^
) R; k6 [1 A2 F+ ]6 H例:允许来自网络192.168.101.0/24的rsync连接请求( `9 s8 `, a0 N; j
0 u. x g. S, {, t9 E' F4 @
iptables -A INPUT -i eth 0-p tcp - s192.168. 101.0/ 24--dport 873- mstate-- stateNEW,ESTABLISHED -j ACCEPT
% Y, O- t$ k, h) T- [8 f" v7 P! q/ E; m& {7 N5 q
iptables -A OUTPUT -o eth 0-p tcp --sport 873- mstate-- stateESTABLISHED -j ACCEPT
: \# h( v) G- K" f5 p
! {, C b: I( _' a9 e1 Z# y19. 允许来自指定网络的MySQL连接请求
* }$ k7 Q: Q" A D& z' j+ ?. }4 l, N% ~
很多情况下,MySQL数据库与web服务跑在同一台服务器上。有时候我们仅希望DBA和开发人员从内部网络(192.168.100.0/24)直接登录数据库,可尝试以下命令:
! Q7 ^% X, @' Z0 x
\& \3 q, z/ K2 j. j. siptables -A INPUT -i eth 0-p tcp - s192.168. 100.0/ 24--dport 3306- mstate-- stateNEW,ESTABLISHED -j ACCEPT
( u' z, \: E5 |0 X3 X
3 K: o( p! Z2 Biptables -A OUTPUT -o eth 0-p tcp --sport 3306- mstate-- stateESTABLISHED -j ACCEPT
4 u: `9 N4 K3 b k& J8 I& H" s- Z5 k @; O! n3 Q3 g
20. 允许Sendmail, Postfix邮件服务
, B9 c, w _& w8 K( G5 H, _1 j0 J: {, E [$ L
Sendmail和postfix都使用了25端口,因此我们只需要允许来自25端口的连接请求即可。
/ @- T% }: S( f
6 J# @1 j: ^2 M$ a' B0 [iptables -A INPUT -i eth 0-p tcp --dport 25- mstate-- stateNEW,ESTABLISHED -j ACCEPT I; O0 j M1 i# C
7 b. m' n' R3 ?6 t; S
iptables -A OUTPUT -o eth 0-p tcp --sport 25- mstate-- stateESTABLISHED -j ACCEPT
7 h- m0 ~( v" y+ ]# g! \8 _( s" U, F6 S, {0 \: Z
21. 允许IMAP和IMAPS* s8 o7 `6 `1 R: Z/ o1 G* B
/ a2 U2 L" X$ b" V z例:允许IMAP/IMAP2流量,端口为143
6 O( }2 l$ t6 x6 u8 \( R* E% k; m$ W( Q- o# w, h q
iptables -A INPUT -i eth 0-p tcp --dport 143- mstate-- stateNEW,ESTABLISHED -j ACCEPT" @& {! g3 u( y0 ]
) [ q# n P- b+ xiptables -A OUTPUT -o eth 0-p tcp --sport 143- mstate-- stateESTABLISHED -j ACCEPT! C* R3 m( ~9 e! B: t+ Z
7 e/ P% ?9 z, f* g( f4 C0 ?例:允许IMAPS流量,端口为9939 j* ]. z1 h# u
1 P' \/ ?- N5 {) G4 t: u
iptables -A INPUT -i eth 0-p tcp --dport 993- mstate-- stateNEW,ESTABLISHED -j ACCEPT
! E* ~. s8 V- s7 [/ R' S
# _: J; q* z* yiptables -A OUTPUT -o eth 0-p tcp --sport 993- mstate-- stateESTABLISHED -j ACCEPT- j3 D- ?4 s# s M- |
, @% J. f# q; S; o
22. 允许POP3和POP3S; T- D2 F+ b1 B7 ^% [
- } N+ i9 K; H \
例:允许POP3访问
4 z4 q* B1 d: r
5 J1 v+ [' ^; Q( `# `iptables -A INPUT -i eth 0-p tcp --dport 110- mstate-- stateNEW,ESTABLISHED -j ACCEPT! H3 c) |* }. }( \5 S
+ c: K: ~" Y( `' @iptables -A OUTPUT -o eth 0-p tcp --sport 110- mstate-- stateESTABLISHED -j ACCEPT+ U- Y& a% z3 q( ` H
: o0 V$ j* i. C# b/ r+ ~, P
例:允许POP3S访问 @7 x2 d8 \, y" G) V4 K
' i4 G7 W2 z/ | L; G
iptables -A INPUT -i eth 0-p tcp --dport 995- mstate-- stateNEW,ESTABLISHED -j ACCEPT6 g! K( v3 N" O) Y* g" b
% R# d+ \0 g, Jiptables -A OUTPUT -o eth 0-p tcp --sport 995- mstate-- stateESTABLISHED -j ACCEPT
+ y( n: S# {. W4 N' n6 v3 k3 z
3 ?3 ~, A% K$ O2 g, K23. 防止DoS攻击iptables -A INPUT -p tcp --dport 80 -m limit-- limit25/minute -- limit-burst 100 -j ACCEPT
1 M5 G6 ?5 r7 U' I+ _- H2 I) K/ w1 D2 }; [
上述例子中:
0 y- E: t# n; |! A; z2 b
) A" n# x+ w: b+ S, n+ u-m limit: 启用limit扩展
; m/ D; U' _" G% L9 Q8 E$ x& D% |6 c/ R% d# |9 E H1 a4 ~
–limit 25/minute: 允许最多每分钟25个连接(根据需求更改)。
+ k: I* n" Q8 ?- H% e
! Z% X+ ~; N/ a- y–limit-burst 100: 只有当连接达到limit-burst水平(此例为100)时才启用上述limit/minute限制。
: J: G$ z8 y6 s+ i6 q6 F2 c7 n- K
24. 端口转发
8 N. L/ z& `! X# g# V例:将来自422端口的流量全部转到22端口。
* I3 a/ T3 p9 G4 F: P
5 l& ~! p0 L1 T- l/ n+ s) r这意味着我们既能通过422端口又能通过22端口进行ssh连接。启用DNAT转发。
+ J* _: u; ~: j
/ l" S7 {( Y9 C- z0 C5 Liptables-tnat-APREROUTING-ptcp-d192 .168.102.37--dport422 -jDNAT--to192 .168.102.37:22
4 ~# R1 H! E, x6 M- R* T" @/ U" E1 L3 |4 C
除此之外,还需要允许连接到422端口的请求
2 B, c8 A8 M0 `5 m1 T6 K) L" Q& k
iptables -A INPUT -i eth 0-p tcp --dport 422- mstate-- stateNEW,ESTABLISHED -j ACCEPT
% M1 x$ c o& {9 k% B" ]5 C" P- K, w G# u' Y
iptables -A OUTPUT -o eth 0-p tcp --sport 422- mstate-- stateESTABLISHED -j ACCEPT
! v& W Y q" l* c* k& O; S# K# l. _& D* z4 `) o( b
25. 记录丢弃的数据表# d x9 y6 ~2 L8 m( j/ Z
7 H" F( _6 {" n8 `2 b! P" ]
第一步:新建名为LOGGING的链
0 g5 j4 S. `" p& Q2 }; U
. a* l1 Z! u; g+ n" G) Yiptables-N LOGGING
8 _/ t9 m3 i' I0 h0 t& r+ Y4 _! ?' n2 e# T
第二步:将所有来自INPUT链中的数据包跳转到LOGGING链中# }! u( v, S/ F6 n7 n
8 B& L4 @- I* `: W8 h+ ]iptables-A INPUT -j LOGGING
* c# c) Z8 n1 K9 F3 l$ Z) o$ g+ }5 A8 m) i4 d# h- k7 ?9 E" R
第三步:为这些包自定义个前缀,命名为”IPTables Packet Dropped” J7 S0 X K5 P# H+ k' B% n
% b k& J) Y: r2 y; X! W' g8 Y
iptables -A LOGGING -m limit-- limit2/min -j LOG -- log-prefix "IPTables Packet Dropped: "-- log-level 7% Z Y% ` y' x3 |( ~8 z& z* u
/ B; N( R$ s" C
第四步:丢弃这些数据包: [% G# Z* n7 \$ |. Q! ~4 C$ Q
5 `" ]* o3 P2 p7 X: p1 B) p6 C& Piptables-A LOGGING -j DROP |
|