|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
& _( G& _' y0 Q, m: y6 o( j; b9 B, h/ e
在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:
2 r% i2 e! r/ u5 V) H3 e) n ip6tables -nL --line-numbers
3 H) h9 Z$ o+ o: B9 X8 L4 z' @+ L% e- o2 s+ U
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:4 T. c8 g. `6 R4 T2 l- r
8 }1 G) J& O; W9 t2 N: P# vi /etc/sysconfig/ip6tables
, L: V4 m e6 ^; ~可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)3 |9 Z) l7 K: `! \9 g1 s
*filter
+ h8 X: V8 ?6 b:INPUT ACCEPT [0:0]
5 W% s3 b0 \- W) u0 j:FORWARD ACCEPT [0:0]
* A& D" {, O, K# J:OUTPUT ACCEPT [0:0]0 _- n% Y3 v0 @" a
:RH-Firewall-1-INPUT - [0:0]9 K% V8 C4 z: [
-A INPUT -j RH-Firewall-1-INPUT
4 f$ Q* `( b$ @/ _) i-A FORWARD -j RH-Firewall-1-INPUT
( Z+ e. X7 w2 {; K3 F, m-A RH-Firewall-1-INPUT -i lo -j ACCEPT* ?" t j! d3 y+ Q0 ?& Z) x
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT% w, |$ \0 `5 D9 h
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT! B" r0 Y X; D
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
% S" n* G/ H1 R0 X5 F! J-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT; W$ D0 c5 D$ e+ V" g
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
$ S# X' b6 N* V, B) C-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
7 `2 H, t0 e6 H5 [0 |-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
$ U k3 s. x- V8 I: {. `- o- N0 ]-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
. ~$ w2 v+ ~. w" \9 l-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
2 I3 N2 r6 s: @-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
5 R4 M: \1 e5 v5 {COMMIT
# c- }! h: V8 C# L+ ?: m/ ]6 O与 IPv4 的 iptables 规则类似,但又不完全相同。
4 ?9 [6 ~( x2 T/ g5 `7 D" ^2 z' C
1 w+ |5 H2 u) d# o要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
0 i* e8 t& E N. s
8 M9 ]) n9 G: F-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT. f6 z) W; D3 r, R1 _' |
-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
; l, |$ s1 z' u% o! f* F& P( L
% p; o: Y/ S" _6 C3 J/ N要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:+ Z$ G, Y! k& [
( U# g0 c- M& W1 _* C$ J
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT7 F; b, z: Y+ G% p; R: X
-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT: z) q1 ]) y# b3 S
同时针对 tcp 和 udp 协议开启 53 端口。( R+ b& K1 S; m9 L" \, L
! V5 J% P2 U4 J0 k要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:8 t( k- v3 c# e3 t5 j
8 H( ^0 }. p8 L8 l0 i
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
3 [1 D; H9 W) e' X: ^0 o, ^+ j要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:& u- R! z" _+ F
+ O$ e) ]+ Q \-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT" u: C+ ^) U/ [& i
对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:4 p, ]3 V" A9 }
4 M4 |9 g9 e) l! k-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited- ?; @- E# m) G' P8 R
COMMIT
" M" A; e2 e: Q# s. o$ K1 W1 e7 V; T改为:
: V! t, Q! X; [1 u2 x0 \3 k' i: c2 _9 _; }, A I7 W
-A RH-Firewall-1-INPUT -j LOG
7 ^6 a% |- g v5 k% f$ j-A RH-Firewall-1-INPUT -j DROP
; b% L+ R+ X* a b5 T$ L$ NCOMMIT7 e: r6 V: e4 @2 z7 k# B
保存并关闭该文件。然后重新启动 ip6tables 防火墙:+ v4 T" }# q+ ^2 h
+ S# V) S$ T6 {: ~
# service ip6tables restart
, t' K# d6 {. t* m. Q然后重新查看 ip6tables 规则,可以看到如下所示的输出:; }; c$ B- v0 O* ~' b# m" g
1 \ m# b1 y6 m$ V3 }* w% y# F& S- f* ^; d
# ip6tables -vnL --line-numbers0 M- K2 o$ Q% Q% j# t. ]
输出示例: T$ H! N L( c7 E9 M/ c+ Y, |
" D6 a6 S/ o G4 nChain INPUT (policy ACCEPT 0 packets, 0 bytes)) V7 }( G* y5 G5 S Q# ?7 I2 O
num pkts bytes target prot opt in out source destination
0 O- y$ j5 \1 G1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0* A+ I& a5 ]5 i+ A1 O
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
' g5 V- i5 a5 a% ^4 Cnum pkts bytes target prot opt in out source destination ]8 V3 [5 ~8 K* c E
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0% u! I; J; q3 U$ a
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)' Q/ Q2 p3 ^3 r" `* \' J- c/ R
num pkts bytes target prot opt in out source destination
t( i8 E" w" o( r0 a; B# DChain RH-Firewall-1-INPUT (2 references)- f' X8 ~ a% O& O
num pkts bytes target prot opt in out source destination+ o9 A+ M% s" p8 C. A
1 6 656 ACCEPT all lo * ::/0 ::/0
( g. ?' Y6 D5 a) p1 j, I" a. r* n, W2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0
* p7 e# j- N- Z' o% s h3 0 0 ACCEPT esp * * ::/0 ::/0' v! k3 p6 V/ \6 n9 E3 h8 y
4 0 0 ACCEPT ah * * ::/0 ::/0
% A8 _. [, Q! s9 |# |0 R" g+ r5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
" A& [$ t3 _5 T$ M1 c6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:6318 s& I: g9 A& M8 K n, e' A4 ~9 Q
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631
. K* R7 N) z, z. x0 L4 o8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000' X) ^& `2 O1 O2 D# S c
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
0 ]/ S0 w( i# h0 e5 \$ ~( R G1 ^10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
5 T" N- ~. _( P9 n% |11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80
1 i- ~8 ?. I- I3 g) l12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
3 U* u- S% U0 s13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:536 W3 a2 y6 g& i& ^
14 18 4196 REJECT all * * ::/0 ::/0
% b- U7 v& U& X2 FIPv6 私有 IP¶
, h* N& Y! W: U, {8 |IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?! ^' _ ^4 h x1 A
5 [7 p7 d: L" _1 i不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。. T4 x$ u7 K% H) e" E, r
" v1 n; ?) H9 m- z6 {# r自动配置 IPv6 防火墙示例脚本¶: r3 O7 q0 y3 H. L+ M3 C/ q
与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。
' x9 G$ v- b' ~6 Q
; i0 O8 v, K2 |8 F+ I#!/bin/bash
' Z& r# }+ ^, K# @; q6 \1 ^IPT6="/sbin/ip6tables", c# i! ]+ U3 h" z
PUBIF="eth1"
q8 s4 ]0 U7 O& ~; ^. Kecho "Starting IPv6 firewall..."
: M* V( p- p5 O/ M$IPT6 -F M9 L0 T' R1 V7 d. X# E
$IPT6 -X! g. ~/ D0 c7 U; D( M ?
$IPT6 -t mangle -F
# C" B3 I" F4 T) c# Q0 r/ z$IPT6 -t mangle -X
& L3 c% O4 Q l3 Y4 h4 F1 Q0 f: U) X4 b7 D! v0 c) n2 ~. k$ [
#unlimited access to loopback/ N+ n9 L+ |# X" w, B' k
$IPT6 -A INPUT -i lo -j ACCEPT( N2 X y+ U! C s; {# F% I5 }
$IPT6 -A OUTPUT -o lo -j ACCEPT
, [5 q" {) e$ ^$ r7 O) [: Z
/ W! j) A4 ^- [0 i# DROP all incomming traffic) ]7 u8 R" z* r$ n C
$IPT6 -P INPUT DROP2 W. _! t; c( d% \3 ?2 w5 z% B
$IPT6 -P OUTPUT DROP0 {- ^; M7 k6 y2 n, H2 o9 e
$IPT6 -P FORWARD DROP
8 w0 s; ]! ?4 C" C! E. Q7 Z2 f; q* W0 Y5 I7 k
# Allow full outgoing connection but no incomming stuff
1 [3 s2 P9 P. f0 H. x# f$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
9 R, A8 y3 {; n% W3 F! u( u3 J; `- o& K$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
: Q% d2 G1 r' ] W5 v
/ V& ?2 D# G5 H' @: [# allow incoming ICMP ping pong stuff
; k, M. `5 G) P) ?6 R1 {$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT
& v: K0 y* G: o& @4 P# c/ \$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT! f0 l: l: b" m5 i7 P5 L
2 B& ?+ H5 M8 o1 X6 H
############# START 在下面添加上自己的特殊规则 ############
2 v# Y* i5 Y6 ?' M$ d# r### open IPv6 port 80
( j7 C: _# I2 Z3 j#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
$ }' ]1 y2 n9 W$ Q! o' k4 m; |6 a, b### open IPv6 port 226 c' f& C& u$ n' ?
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
( b0 ^4 |/ m" G" ?4 }% D### open IPv6 port 250 b; ?, S. g5 v U
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT
: N* S7 H6 z* w q- y5 d" u############ END 自己特殊规则结束 ################& I( M0 @+ C: ^7 R9 N) ]* k
; n: O# i! e* ~. h' H3 u( d#### no need to edit below ###: n" t! h/ A& t. k, e& l- U W
# log everything else
1 V& Y% L/ \0 W X4 C: s5 L4 w$IPT6 -A INPUT -i $PUBIF -j LOG
# {$ ~' q9 `# F7 T0 W! L8 Z$IPT6 -A INPUT -i $PUBIF -j DROP |
|