|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
* o0 N. h ?' {% u; }/ b4 B
/ i1 W2 z5 H, E' g8 @. T在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:, @) }. s5 A2 j1 h& k( p
ip6tables -nL --line-numbers
/ o: e; j7 S( _+ i H
1 q' t, R2 [; Y( g8 E* F! u6 \# {使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
3 g7 F* F: s$ `$ I9 H0 y* Z' w; ]/ L# z$ u
# vi /etc/sysconfig/ip6tables
) i& Y6 u) p( b/ U可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换): t5 [) d8 U2 Z- V! h& f& F! e1 X: G
*filter( D3 M' e$ A e
:INPUT ACCEPT [0:0]' ?$ ]) _* v- C' M3 E
:FORWARD ACCEPT [0:0]/ h$ e! @1 X/ K0 I8 ^, o; H4 o
:OUTPUT ACCEPT [0:0]
( e/ ]/ T& b5 t9 H) h9 s" F:RH-Firewall-1-INPUT - [0:0]4 K$ t. c% V7 ^! I
-A INPUT -j RH-Firewall-1-INPUT
% l- g. t6 u8 ^, N9 }' J-A FORWARD -j RH-Firewall-1-INPUT
$ M4 _% k- c# P. N-A RH-Firewall-1-INPUT -i lo -j ACCEPT
/ E2 b& y" B9 |8 X3 V7 p- m/ M: F-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
( `% S( m1 d& S2 g; ~6 S-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
& P! y5 ]' \9 f+ V B7 F3 J! q-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
/ R+ y6 V/ O# T7 @+ D+ {1 M-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
+ s* F" P- X* y-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
5 A8 ]( ?0 X6 m3 s- t-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT4 ?! G D! z+ R6 [+ G
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT% v( M% v. M- u2 [
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT# M- C3 [2 Q/ s; J/ t( A
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT8 Z/ l0 ?, C7 g7 o3 G* ]/ P
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited& V" t7 R- Y1 y, ]! O7 e
COMMIT1 O: A' `! _& I0 C
与 IPv4 的 iptables 规则类似,但又不完全相同。
: I. w! c% S8 }# l3 F
; r: K: C6 d, ` n; z: n% B要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:8 @" U( s6 }7 h$ N9 z% f, R1 j
0 n/ [+ N' L3 H+ O. j-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT' k% [& S1 k. T, p" ^( H
-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。5 n: J: p$ ~' ~% {( L
0 I2 @/ a* d# z% O5 y( x, @
要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:5 y3 {$ n% \1 ^/ r, H( z
: ^; x, K. D o0 j" \-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
6 q4 r8 S; d$ l8 S a-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
- e$ E" P0 z3 B( s同时针对 tcp 和 udp 协议开启 53 端口。0 R6 f1 N9 R$ L- N8 n& m+ x6 n
g# t Z( ?& k要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
7 {0 C5 C$ I: b3 c, S2 f; M1 Z& |/ _6 F' L, u6 G, T9 c& w
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
2 o# D: N9 Y- z6 @要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:3 d( [& o8 M: ^+ f1 ?0 Y+ }2 U; e% u' h
8 _! b$ h0 ]: y7 m5 |9 ~3 g. W0 O+ ~
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
5 l' y8 L, t! G对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:4 T, F7 `1 u3 O; s0 V" S, p
4 h/ Z% d/ M* L& @0 k, M-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited, i( @# {& y; L% D; X7 W+ W$ w
COMMIT& N0 E& s4 ~3 _% p2 ?
改为:
# h; X; A9 K" ~4 \6 ^! }3 c" W- l. p' s% B. |7 X4 i: r0 l' M
-A RH-Firewall-1-INPUT -j LOG
- j m! q$ o* T$ }' _, `-A RH-Firewall-1-INPUT -j DROP7 i( }8 t6 ~0 w) ^; W) s8 S
COMMIT
- a a" R7 q" m1 b保存并关闭该文件。然后重新启动 ip6tables 防火墙:
; V2 V( k" p0 p$ A" \ h
8 \2 h' l& k, c! n5 q3 U# service ip6tables restart
, V u" _5 G7 s然后重新查看 ip6tables 规则,可以看到如下所示的输出:
# w( O5 `- U# A- b; Q+ Z5 h) a& g
# ip6tables -vnL --line-numbers0 c2 c6 Z9 h; j& o ]7 e ^9 E$ F
输出示例:
! s. y: t/ X; p- c
2 a/ B' k6 d* ~0 t2 H/ yChain INPUT (policy ACCEPT 0 packets, 0 bytes): O/ ?; A) y# W( u C
num pkts bytes target prot opt in out source destination% l+ Z/ C# U4 k$ X& ~ E
1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
' o( ~- g, Q2 d$ UChain FORWARD (policy ACCEPT 0 packets, 0 bytes)
" W: [6 S- k" a2 Unum pkts bytes target prot opt in out source destination: U& c& R3 t p" [
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0 ?3 K; p, Y. D, p8 V
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
E- x# A4 p( {) @num pkts bytes target prot opt in out source destination
/ T7 s# a" i8 GChain RH-Firewall-1-INPUT (2 references)
* P& r0 u; h: H3 Z1 y9 dnum pkts bytes target prot opt in out source destination
- g( J) A- r0 U1 6 656 ACCEPT all lo * ::/0 ::/0% h& r) @$ Z8 H2 ~' U
2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0
$ ~- |- m* X% H0 L1 `5 ]7 F3 0 0 ACCEPT esp * * ::/0 ::/0
0 o; Z! m) U, q8 a! \6 F4 0 0 ACCEPT ah * * ::/0 ::/0) M1 W, `9 x! o. f b
5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
2 w: }7 u6 n- T! u( i4 s: `6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631- X! r* w4 G& N; p3 o
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:6310 P9 S3 f1 |! c! h: [, `5 U, X0 C" E! o3 p g
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000
% B, i4 P, G4 \; k; p9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
( J- y4 [4 t) E% F5 }# u# W+ e9 Z) P10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:223 z1 V# K1 S& s3 Z
11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80
# y6 \3 }( @# _5 e4 Z6 \12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
+ ?3 R7 J5 @2 S1 d6 k& n13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53' O' g/ W# J5 Q5 g
14 18 4196 REJECT all * * ::/0 ::/0
/ n8 ~8 y& r% s: t* `3 @- fIPv6 私有 IP¶5 V; W; M: _( z8 Y9 V! i* K
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?
6 c: N) E! u% v- ?( z+ M; q9 i& V. B' m
不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。) d; O( }. ~2 i0 n5 y; u% a
1 x! z7 Q$ d. O! {" U' n4 q
自动配置 IPv6 防火墙示例脚本¶
: P2 q% O2 l- \$ Y+ Q! r) {9 C与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。& Z, j% {7 P" N( P/ Y( z ?
+ v4 U9 M F9 m# b2 \. Q9 A) R6 U& v
#!/bin/bash
! \; z5 i5 t3 k( e% S6 G1 }( I [IPT6="/sbin/ip6tables"
2 y# _, X( m# k" xPUBIF="eth1"; P# M% J4 o( m
echo "Starting IPv6 firewall...") A7 R- h7 ^5 m* \
$IPT6 -F
0 R- Y9 |% S% f) |8 j$IPT6 -X" o" H) r! ~" S$ g! ~3 N$ i
$IPT6 -t mangle -F
7 e( R2 s( ?2 G4 G2 D& i. a+ p$IPT6 -t mangle -X
" G/ P3 a7 }: ^5 G3 {& u
0 |0 R. [, l" X* i+ s) _#unlimited access to loopback* T4 d) p% Q' n
$IPT6 -A INPUT -i lo -j ACCEPT3 `+ D7 N* l) {, m
$IPT6 -A OUTPUT -o lo -j ACCEPT
/ }4 y9 B; J* e
: z3 [5 w. W. \; {3 Z( [# DROP all incomming traffic3 n8 C9 \2 [& I
$IPT6 -P INPUT DROP3 X5 f9 A+ _% W# O# M
$IPT6 -P OUTPUT DROP
& W. h: z2 u! V: e" F3 `3 ?+ K X$IPT6 -P FORWARD DROP
5 ^$ ^0 l+ d c$ J @
+ W7 R, J6 E5 v9 j# Allow full outgoing connection but no incomming stuff
0 S7 v( Q8 c# t! }1 S0 {+ D+ t6 U$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
# U$ b6 _0 z' B$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$ y) r* ^, r* c( X5 B' `7 c% S4 D% `5 L4 `7 V4 V8 v
# allow incoming ICMP ping pong stuff1 `2 `3 z( E, V1 n: j
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT
. k9 t0 J) m3 ?+ }$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT
. O1 `. k- C( |( s, E& Q+ |
$ ^( @' J/ C9 [# o/ V& c2 Z" z############# START 在下面添加上自己的特殊规则 ############' @+ k; F, ~% m: e% j1 v+ T2 c
### open IPv6 port 80 ! X9 @7 o/ i& E2 J8 C$ N5 p
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT% F/ d3 d4 F2 v/ w/ ]
### open IPv6 port 22' o) ^4 u' j/ A7 l( H0 J4 |; P8 x
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT8 n7 N. Q1 T0 R* |8 K
### open IPv6 port 25* r2 G: x* v3 Y$ l
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT5 q3 Z+ ^) z/ ]# W4 j
############ END 自己特殊规则结束 ################
- f# F6 H) j5 ~: t
6 X V, ?9 V1 m5 W5 u) \#### no need to edit below ###' J$ I1 P- k/ l! G7 g, k
# log everything else
) _3 F- U4 g8 H' M1 H1 e! x$IPT6 -A INPUT -i $PUBIF -j LOG/ V. T" r) d, s% ^$ G, ]: Z
$IPT6 -A INPUT -i $PUBIF -j DROP |
|