|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
1 n$ N1 q2 Q7 D8 S" K9 d- Z) l+ c @7 F; f
在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:
2 w+ g' ^* ?4 ]5 I' w ip6tables -nL --line-numbers: ]7 m' S9 `6 J4 S
0 O" i' _4 u c" W6 k" Q0 X! h使用编辑器编辑 /etc/sysconfig/ip6tables 文件:$ M k m; h( o+ k4 B; M6 `
% O6 c4 p) r/ i2 n- T, g- k v5 L
# vi /etc/sysconfig/ip6tables
+ K$ w2 u- g9 a% ?" Q4 m, o- n9 S可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)/ K; v) ^2 L9 J/ Z6 q3 q' c
*filter. X+ _; a0 F$ J& n2 Q8 C7 S4 \
:INPUT ACCEPT [0:0]
# d9 `+ z+ x6 y1 E:FORWARD ACCEPT [0:0]
4 N& Z, J( S' o2 b6 R2 M:OUTPUT ACCEPT [0:0]
7 |& s" [0 h9 g Q5 e% \' ^:RH-Firewall-1-INPUT - [0:0]
3 ^7 E5 @0 D0 X! t$ j7 S! C# p' B# y-A INPUT -j RH-Firewall-1-INPUT' T. z* s# X: H9 F$ \- E
-A FORWARD -j RH-Firewall-1-INPUT* C) J9 v, E2 Q. G3 _6 q1 u! q
-A RH-Firewall-1-INPUT -i lo -j ACCEPT. `6 f" ]/ X) u- b; a2 F
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT( n5 y3 F4 v1 R2 @! R
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
: Q. p% I/ L: n0 s# k-A RH-Firewall-1-INPUT -p 51 -j ACCEPT5 D) o- v" Y2 ^: H- h" e% ~6 H% N
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT1 B9 `$ i0 o* T E
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
$ W# W7 q a* G) S2 }-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
$ U6 [$ \! k) L* |+ s; [-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT6 _5 u5 k2 x V% s: K9 q9 u) f
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
. Z3 Z6 s w. W: p1 ~5 W7 t1 y-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT7 C! I' f$ B; P1 V# {/ ^ I
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited+ j* ^8 N3 F. M% [
COMMIT3 W+ @" l' @% x% Z4 E/ M6 [' y
与 IPv4 的 iptables 规则类似,但又不完全相同。
8 X v& \0 a9 _3 D7 }4 |
# r( g! C# A2 J ^要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:, x. u8 D. F4 S/ L
" Q1 |% i+ B% _! A-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
2 D9 s3 ?3 z d3 L" A+ A-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
, z! L; B7 i! P0 g5 n8 O
; w; Q- J0 Z; [' C/ c' [" I要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:( y+ W0 @( J6 m, y3 c# e
* e+ ^0 y; I. `
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
; p9 ?$ C" C; V+ t, g-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT5 T! N! z0 Z0 i) u- w: X
同时针对 tcp 和 udp 协议开启 53 端口。
& a+ f' y+ C# h! @* `! [( t- i! N. J) G) R8 p: e: M* j
要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:: m G: m/ S! j6 J& s- ?- C, o* ?1 r0 p
- G: `) q: y1 h/ b' [9 F-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
! M# D a3 u+ r: N要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:" v: `( i6 y8 i/ V" M2 u
% a: u; o) d/ p
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT$ L& D z+ `% N
对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
, q; V- J) B* s- q4 u- i9 A$ h9 T7 g5 ?( f( N1 Z/ _
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
/ @5 O& D! M( c: @4 l# ^2 xCOMMIT
' M$ P2 U, y/ G3 T, m改为:
8 ^$ W9 x3 O2 h! n2 w: p# c& ]- R& M2 Y8 t7 U1 \* F& |* `
-A RH-Firewall-1-INPUT -j LOG4 b/ e% E) c" L( y' ^# G" M
-A RH-Firewall-1-INPUT -j DROP
- d, u$ e) G( }% [6 U7 y! ?) O! [8 XCOMMIT9 ^3 i5 \. f) N8 b! k; }
保存并关闭该文件。然后重新启动 ip6tables 防火墙:3 E7 d* A% L" v7 u
; L- X6 M6 [- D; ?
# service ip6tables restart
7 x; p0 T5 h& l z% k5 e9 a* T然后重新查看 ip6tables 规则,可以看到如下所示的输出:
3 {! Z/ m9 C. r ]+ q( V; m: S* m% W
5 h+ h, p; V$ w r$ u# ip6tables -vnL --line-numbers% ?+ U% b+ b4 t1 I
输出示例:# D" R2 D1 s9 d& \% _
+ ]8 @" V0 J) Q( c1 K
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)* e1 }7 I3 J9 d c. i8 J
num pkts bytes target prot opt in out source destination* ^+ t9 h- f+ [; ?9 H9 \6 P: A
1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/09 M* [5 Y* h9 R" q" p
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)6 J1 e, d* d/ j- J
num pkts bytes target prot opt in out source destination8 t. o, D p t1 Q3 g3 g
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/06 ^+ a' W1 y) i _8 A' C( M+ J
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
; ]# i! ^* f6 F( a4 A/ unum pkts bytes target prot opt in out source destination
( _- i" t4 \/ ~+ gChain RH-Firewall-1-INPUT (2 references)
* z4 S" c1 @2 c7 Q3 r: fnum pkts bytes target prot opt in out source destination
2 s6 O4 P9 ^5 q0 |7 f% @4 A: O1 6 656 ACCEPT all lo * ::/0 ::/07 H: K; w7 e) {, F+ a. j' W8 O5 ]
2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/09 L7 ]1 w! x+ d: M8 ]. i5 d
3 0 0 ACCEPT esp * * ::/0 ::/0
" F+ i3 o) ~" l2 G4 0 0 ACCEPT ah * * ::/0 ::/0
4 x0 l5 v9 i s( N1 M6 V5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
3 s0 r8 }" S( s3 z" r" q6 Y7 ?6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631! ?1 l2 R5 v9 }, f9 x! ]/ [5 i
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:6317 ]; C; x+ z4 i9 a1 b8 h
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000& {( E* `! a: B% }
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
) D0 l! h# V' y9 K: \10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22! Z4 t3 B8 ^! \2 M( P+ I0 C
11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80' ]" ?3 B, {3 Z7 X4 N6 D L% X
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53$ Z& p$ ~/ j* p7 T7 s+ l
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53; z' {# k, g) N: b. P4 W7 R: d, x
14 18 4196 REJECT all * * ::/0 ::/0
" u& e' u" ]* S; o( [IPv6 私有 IP¶
) K5 V& Q* v' G: b* QIPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?
9 K% X4 {: W' K; Q: e' `( @; D; Q7 o* a) i% S- n7 {# X
不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。
+ q! C0 m4 C% W( J; C$ D' o& f& O
自动配置 IPv6 防火墙示例脚本¶! j/ `9 W, |0 t% P" W* }% a
与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。
, t, z- s& U7 B+ [" u- K" A6 j9 _" C& i# q2 @1 [
#!/bin/bash
( ?% c9 ~# Y- J* w. |6 s$ }IPT6="/sbin/ip6tables"
/ Q0 e3 q5 t. J0 @7 L; [PUBIF="eth1"
o& ~0 ]. F0 l: W7 c( Secho "Starting IPv6 firewall..."1 G/ T& @1 D, i; W( V' P5 q) @5 N
$IPT6 -F' }. R7 Q( ?( z! F
$IPT6 -X
4 C0 u# W/ y- |, j* M8 N$IPT6 -t mangle -F; N( L4 F2 u6 J2 s; Y
$IPT6 -t mangle -X
& D9 T4 D" Y) L6 @: R! f1 D
( `; m) a7 g4 H/ c, h#unlimited access to loopback/ r: X" Y% S6 E' e* |
$IPT6 -A INPUT -i lo -j ACCEPT1 r6 ^0 o) j1 c, V5 ?+ t9 M
$IPT6 -A OUTPUT -o lo -j ACCEPT
& M) v/ B; P* t' |, K4 x4 b' @: p7 U7 O4 @" V6 S; K V. [
# DROP all incomming traffic8 J K! w/ G" O# ~
$IPT6 -P INPUT DROP
* z1 W! [" m# J6 q$IPT6 -P OUTPUT DROP8 J% l0 `# E9 l, S0 z2 E) x! q
$IPT6 -P FORWARD DROP+ B& f" z. Q! `, s' g5 j
2 @; `( h# Y% p" u. u. {# Allow full outgoing connection but no incomming stuff& c; L, A2 H+ ~9 y& q' B: e: l) z
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
& [9 q6 W4 J5 i6 J. R4 z3 {; l$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# L! Q0 v" [- Q* T r# a( r7 ]
! I) }7 V3 P- h( Z8 p2 ?6 I M+ i# allow incoming ICMP ping pong stuff+ h9 r0 P% ~0 }$ \# U! a; W
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT' b1 K0 G2 h, k( }. p
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT
]0 F% g2 i2 I
/ _. K/ \6 R( d& G" S( K4 s############# START 在下面添加上自己的特殊规则 ############
! n1 ]. z! S' H T7 b/ T8 S" d### open IPv6 port 80 {; B6 @# Z3 K- i/ P8 F) }0 ^
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
4 P, Y1 \% |$ H( A2 [. q, J### open IPv6 port 22& O" R' X* Z- T" h' G' L, [
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
$ Y% |$ _: l" Z8 ] e8 S4 r; C### open IPv6 port 25: O9 |3 ^; v+ Q5 c5 P
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT
% z8 u/ E4 P/ a) l############ END 自己特殊规则结束 ################; X( O! \" v1 C) o; a( D5 ^" q
' V, r- |* l& F, @6 l
#### no need to edit below ###9 R* y+ {! q- c7 C2 D7 D- E
# log everything else
/ n2 I& R7 m* R8 `; S$IPT6 -A INPUT -i $PUBIF -j LOG7 a* l6 Y7 Y, p- Y F! a
$IPT6 -A INPUT -i $PUBIF -j DROP |
|