|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
7 h9 O& ~! V& W% D* Z. n. U
% j6 e9 P, u9 A. o在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:
1 X1 i7 W4 X$ ]6 E5 |# |! C ip6tables -nL --line-numbers
. ]* k" |, R5 d6 c2 j& [) W. y" X# d9 i: X) Y) A* v: U. M
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:2 ~8 x- Q4 T) O8 [
3 |7 H, U! ? U6 L# H
# vi /etc/sysconfig/ip6tables
+ } P" S4 Y. b/ R2 q. a7 g可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换) f. C) v; K2 G# e
*filter# O3 w4 m- r4 l6 n: m
:INPUT ACCEPT [0:0]
# |7 h8 E( r% X8 Z" M9 B0 z# E5 q:FORWARD ACCEPT [0:0]
% n4 y/ C8 [! c S5 ?4 Z1 K: c:OUTPUT ACCEPT [0:0]
4 R u) ]0 K. R) {5 k, q:RH-Firewall-1-INPUT - [0:0]. C e$ R+ [ |$ h8 q( ^
-A INPUT -j RH-Firewall-1-INPUT* g/ w3 W x7 U( L; `
-A FORWARD -j RH-Firewall-1-INPUT
# \# j* p/ i; t+ V-A RH-Firewall-1-INPUT -i lo -j ACCEPT9 S3 D& J. S$ |8 A5 z$ m1 }. k
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
6 {) s4 }& I1 w z-A RH-Firewall-1-INPUT -p 50 -j ACCEPT5 |. c# s3 a" r9 _
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT5 N9 B( g' U m8 Z0 f
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
9 }0 |, |/ i z/ {-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
( T1 H# v. O4 Y* p( v-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
0 A* r, Z( [: d' z. g5 s& S-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
' l, T" \+ Q# o8 J. R. b-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
8 a- F& Y! m" A9 u, I-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT N1 V* n' U0 f3 N
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited5 H7 x5 i U( K6 R
COMMIT# G4 v4 {3 L) g) v/ b7 h& U" l
与 IPv4 的 iptables 规则类似,但又不完全相同。
* z) y$ ~; ~$ \; Q! B# i2 x5 T6 A* L1 D4 Y
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:# z% G) {4 z0 f: M- m
+ @2 E( f5 ^1 w% j' d. v; `-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT. \1 Q6 D& ?7 z" k; v4 J
-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
) D: i: L; e# C- [- n0 u" N: v0 }2 g% x/ ^
要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:/ I; I6 _6 E3 g3 R
0 P' _: D8 {. x# ?, n& W9 v& i
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
j# R3 B S$ \, |5 h) e0 H-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT+ W. C& c1 B" p' Y
同时针对 tcp 和 udp 协议开启 53 端口。
3 r, O2 a+ p7 Z, S! l$ B8 y
" b% l) g7 O, z8 u5 n6 R要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:# k2 X9 X; l- n3 k# h O2 ?
* z8 p9 @$ j$ p# e: f. k {* H-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
. C. B+ ^" f# S9 O. ]& m要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
, { X) E ^' v( j' F
! y4 N9 E" k: d, {-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
, o$ O8 e t% t; }对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
2 y1 \; \; ?& n& O2 n: H' D( \, ?2 b7 h3 m7 X/ A1 f9 t
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
/ X7 k: ]" R9 b0 _$ N: C' B4 [3 PCOMMIT
; B: z1 l& j" O# t+ _. e改为:
# S/ E' {4 b2 _# p8 J; y7 F' c4 q# C/ p
-A RH-Firewall-1-INPUT -j LOG
1 W1 L. C8 ~# N-A RH-Firewall-1-INPUT -j DROP" p7 X* {& N& Q% r
COMMIT
F. n& X. X3 h+ m4 b! M保存并关闭该文件。然后重新启动 ip6tables 防火墙:7 N# a; ]2 d Y) c: {
* x' z6 B8 r" e4 V
# service ip6tables restart
5 X/ f- m/ j: G! F; w8 G然后重新查看 ip6tables 规则,可以看到如下所示的输出:0 y- c0 J4 L! h D1 M& Y) e
4 H+ ` F/ S& k4 o! h* T6 I
# ip6tables -vnL --line-numbers
; Y' ]. [+ {& T) w) N9 y$ d输出示例:
) x, U- c0 D7 H. i, S
1 b; y" F7 I4 eChain INPUT (policy ACCEPT 0 packets, 0 bytes)
6 \) K2 S8 t4 y9 ^9 p/ snum pkts bytes target prot opt in out source destination+ k8 ?4 T/ \6 u( z2 I' o m
1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
$ A$ P! L: z3 b1 i6 m+ IChain FORWARD (policy ACCEPT 0 packets, 0 bytes). }4 [( ]' G# n( O: {, e5 X( U
num pkts bytes target prot opt in out source destination5 _/ M( k) W2 ~; ]& E* H" @, }
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0
# x7 P4 i) M- j# l- G4 [Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)3 o7 w# z% O6 K* {9 o: H
num pkts bytes target prot opt in out source destination
' z. Y! k! ^7 ?& zChain RH-Firewall-1-INPUT (2 references)! ]% w" z0 u+ ?3 ?
num pkts bytes target prot opt in out source destination
& |+ k: Z P2 s& ~1 6 656 ACCEPT all lo * ::/0 ::/0
X' c. f! V2 h+ r% L2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0
" }& [* _+ ^6 H4 o$ }3 0 0 ACCEPT esp * * ::/0 ::/0) o/ N! T+ m8 p, b! o6 ^
4 0 0 ACCEPT ah * * ::/0 ::/0
( G9 Z7 _* U+ H. m W5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
' o9 y& F+ x1 A, i: u, H! N6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:6312 g2 M0 W5 v) s' `8 O: t
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631
% @4 ^) \0 R/ \ B3 v o( S8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000. ~4 }5 T! }( K5 Y
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
3 N0 A# t [) E/ i10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
* e' K8 S4 e! b9 u7 g11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80
4 J1 W+ l9 n' z! @' l8 p7 r9 c1 z12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:536 h; B' E* g$ y$ s! u* n: h
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53- l/ A3 s# e% ]4 r: L/ o, k
14 18 4196 REJECT all * * ::/0 ::/00 P3 m8 b& a* G+ p# c
IPv6 私有 IP¶; o- K% S; h& B
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?
( a* l0 ~: b$ x Q3 K0 N
$ y( \8 B9 r7 s% J; L4 U$ [不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。) i# Q3 }3 d7 u% H
' f8 H5 X0 P& y) ?$ q" b6 G. Z
自动配置 IPv6 防火墙示例脚本¶
5 H! |3 u/ l2 T. F6 |# f; X( ~与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。1 K2 G5 Z. w! C- A$ C! G
8 {! L7 x" N) n& |& S( N8 [#!/bin/bash
7 Z q7 L8 C7 EIPT6="/sbin/ip6tables"# o1 F: I7 [, ]1 v( d/ \
PUBIF="eth1"
7 n; r3 ^0 S* I4 G0 fecho "Starting IPv6 firewall..."2 j3 g6 J0 ^2 h9 j/ B) q A
$IPT6 -F
% l3 u% Z, |" N$ L$IPT6 -X3 q2 W6 M3 ]- h. j& e6 ]
$IPT6 -t mangle -F
1 Z8 r2 B( P9 Q9 \: b: l9 m f$IPT6 -t mangle -X
. ~& i& {/ l* g9 K- s+ W0 N4 ]
* K x0 C7 V& g; \" [& }9 {7 c/ D#unlimited access to loopback
- ? t) x3 N" x* a, R$IPT6 -A INPUT -i lo -j ACCEPT
- w8 {0 r: c: X2 K: j0 B! V$IPT6 -A OUTPUT -o lo -j ACCEPT& B k7 u+ i3 Z$ M5 i' E
! S! S# G' Y# A/ y/ d; a
# DROP all incomming traffic
5 S+ ?# f8 o1 _$IPT6 -P INPUT DROP
, {- Y7 Y! O- n$ b$IPT6 -P OUTPUT DROP
& s$ U7 L/ ~% t& r, `' Y$IPT6 -P FORWARD DROP0 R B/ ?& ]' e" O
8 e6 L. c8 Q$ M" Q
# Allow full outgoing connection but no incomming stuff9 A4 W8 F, C6 ~* B% d
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT! V0 |* o3 z( b+ J- S
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT* j7 o$ Q; c4 A5 o) l, f# m% }
& K% h: t8 | U( |
# allow incoming ICMP ping pong stuff2 V3 N; C0 B0 f. ~: ?% H
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT3 `7 L' l0 _& V$ \
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT
' B- [9 m. h1 t
! ~0 E: f( R! n, l" ]& K############# START 在下面添加上自己的特殊规则 ############
: } p& p! y) |' |& `/ ?; K### open IPv6 port 80
: u4 _; P* f5 X$ q h4 O#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
. g2 V+ U* r0 R9 J- e( @* P### open IPv6 port 22
! K5 E$ }2 r: i, R8 D#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
5 P: T$ a- q% ?9 ~$ {6 I### open IPv6 port 25% |! |6 n; E, ]! ?" r
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT. M3 l3 E8 u& _& X' v
############ END 自己特殊规则结束 ################
1 r' x- R# Z" O6 S4 y5 W8 D; R
7 \* Q' s0 M# X2 n1 ?) X1 R+ l#### no need to edit below ###/ w& O1 m$ |8 Q( h) m
# log everything else
, I$ \8 Z' t9 H3 q( c$IPT6 -A INPUT -i $PUBIF -j LOG: D g( b/ K& f" n( ^8 x
$IPT6 -A INPUT -i $PUBIF -j DROP |
|