|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。6 @5 P) B: W) J: d# W
7 t7 ^" H; g' |8 ~# g( t ]0 C
在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:0 P2 Z9 H! V* y! o1 o4 \5 n
ip6tables -nL --line-numbers
8 @; I9 g5 Z) _* ~" D: E9 d, J5 ?$ J5 j! R! x4 `$ F
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:1 C- O( J. q. [# U0 j) q0 t
9 x" _+ [/ g) T) E: ~, ^* q; r s
# vi /etc/sysconfig/ip6tables8 L X& `- I6 w/ K
可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)' o* K) s# R% p. m U
*filter
/ X4 R, j' w9 w: |3 c:INPUT ACCEPT [0:0]6 r; x+ W9 ]) K: u5 m* @& v
:FORWARD ACCEPT [0:0], e8 H- t2 K2 o) `' v
:OUTPUT ACCEPT [0:0]
0 w3 ` E: P" l9 w7 C0 r9 A:RH-Firewall-1-INPUT - [0:0]* B5 r$ q; O/ [ i1 G
-A INPUT -j RH-Firewall-1-INPUT
. E( W- H( p' E) s-A FORWARD -j RH-Firewall-1-INPUT9 r) B: q9 }$ p b
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
" ]: a6 V. J( T$ b+ g0 O-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT7 W# L/ `2 v8 b8 P' O ^2 f
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT; ~6 J9 n* R2 ^. x' ?
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
4 b0 K( H/ ]" I b3 s/ q) P* I5 o( N-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
+ q! n0 H, n0 h, w-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT7 Y0 F* {! S L$ x! y6 ~6 u S
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT* \! \* a; J6 i |
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
0 c) _4 M. ~6 y O8 W# g$ ]" g5 Q5 u-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT$ K% l8 {! w% l* Z' \! H. ~' q& x
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT( q5 J$ p* T; y% M/ E" x/ O
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
5 x6 i1 g; V2 i! ZCOMMIT9 ]4 B: i! X& k# z# ~# Z
与 IPv4 的 iptables 规则类似,但又不完全相同。7 G: ]0 T, s n! Y/ t
; e( u+ j% _9 s( q
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
4 R8 j: P3 o P i1 n- z: ]) |& z4 v
- L S5 j, J6 x' O1 O-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
' X9 t$ Z# M" L4 z1 `. B( _-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。6 w8 W* `9 v% \3 Y3 W
: O+ h/ b! [3 s1 b要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
" D3 A7 E. n& l' c8 V/ @; b" a' b$ R! a- K: o/ [6 _/ X
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT9 y& K6 z0 b& u. h- M/ D
-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
: Q5 V9 i1 J# A同时针对 tcp 和 udp 协议开启 53 端口。
% z+ W' S- H& R& N6 h2 B5 M3 D* o
要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则: V) n: o& k. \! }2 r/ Q' |7 ]
) [/ j) R6 u, u$ }; k
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
) s1 D' w3 B9 r# u+ {, K; l# G3 E- Q要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
* m _- ?( ~( L, _! s
3 d% m, A& P9 j8 P' H0 S$ ^-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
% e- P$ y; B x1 M& l& E4 o4 i对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
1 w: V5 a5 V3 g; |$ q2 m w6 f' d& B t! Y; w! f( V
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited5 X% Y1 Q: x( k [# M% n, ?/ ~
COMMIT# R7 e9 b8 s5 `4 t, c
改为:: @* U0 H: L* B
1 R1 O0 K8 W0 ]: b3 k; a2 a+ r
-A RH-Firewall-1-INPUT -j LOG7 g& C4 b6 l( F2 d- ? p8 r
-A RH-Firewall-1-INPUT -j DROP5 I4 j. n5 Y, r, ~- |0 v5 \3 K1 ~
COMMIT# [- \. Q- u* Z5 G& X' b8 t% z: v9 r. Z
保存并关闭该文件。然后重新启动 ip6tables 防火墙:
. l8 W) M9 A" f" |4 D; X6 D4 q2 Q: L5 T; ~7 B
# service ip6tables restart
* I' j& q# s% f1 l( ]: }2 v然后重新查看 ip6tables 规则,可以看到如下所示的输出:/ B2 H! d$ W/ T, N- A* [2 S4 T
# L# x# o9 ]/ P2 C+ m
# ip6tables -vnL --line-numbers V& @/ t0 Q7 `/ u
输出示例:. T( F: @8 v6 r& K. C
- }: w8 O' z, j" n& E2 F9 v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
' I" { c9 w/ T; M4 Tnum pkts bytes target prot opt in out source destination
5 S7 A! }# P. S) {) ]( _: I( K1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
) P" b3 X. g: g4 ~4 r3 B) ]# AChain FORWARD (policy ACCEPT 0 packets, 0 bytes)/ z* e' [7 L& g0 [
num pkts bytes target prot opt in out source destination+ ^; u/ _9 U7 z" T ?
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0
B8 k+ {6 F# EChain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)3 f2 e- x+ R ]
num pkts bytes target prot opt in out source destination7 s( J0 ^/ K- d4 \
Chain RH-Firewall-1-INPUT (2 references)4 T( E6 T6 x) s! W8 F: C$ \) w0 T
num pkts bytes target prot opt in out source destination4 \# \9 D; U( Z: ^' f
1 6 656 ACCEPT all lo * ::/0 ::/0! M$ v! k0 r* g
2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0
: W7 P" Q' n* d. [+ X8 A0 @2 e0 ~3 0 0 ACCEPT esp * * ::/0 ::/0% M- \& ~, X* l1 b& ~1 c; G
4 0 0 ACCEPT ah * * ::/0 ::/0
, y& e' q+ P) K9 f& }$ i- E5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353+ i3 T$ I, N% R
6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631) p" @# u, ?2 w" a
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631" H& O& ]0 V7 q2 y& l! y" e
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:610006 x* ?; x* t8 z$ \: M2 O) ^
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
. o, K* S# Z$ K# Y0 K10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
3 e# F7 E( n; Z5 d11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80' B$ w* A( D" x7 ?" `- ]% u( z+ s
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
& K: E4 C& J0 j4 N9 F" @: C13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53% A' u- a. H1 G$ ]4 x
14 18 4196 REJECT all * * ::/0 ::/0" C( \+ d6 `# e* ?; i' D! S4 S
IPv6 私有 IP¶7 [' D7 N; J4 ^8 q$ y6 I
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?
7 X B; p5 [6 w% [+ y
9 `' ^8 ~8 w" Z# Q不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。
/ y& {2 y' [) k+ b; Z1 G! Y" s; j* g2 U' Q" A+ w3 ]* J) x
自动配置 IPv6 防火墙示例脚本¶
/ K5 v7 v$ T3 G5 j* u9 R与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。
0 q9 L5 i: w ?2 {8 X# ^
5 ~8 L' a" u9 F9 Z/ S#!/bin/bash
6 S! U" ?) \- b( G, H. H$ l, yIPT6="/sbin/ip6tables"
5 y8 l* b$ F7 c4 c1 {% M8 g2 BPUBIF="eth1"$ S1 H& Q9 _; J% v7 J
echo "Starting IPv6 firewall..."
- H7 Q/ a( t% ^$IPT6 -F
4 y+ V) C5 @$ z8 [+ K* v2 V$IPT6 -X8 F. E( Q3 g3 W; e( a/ g$ K
$IPT6 -t mangle -F
. `2 m7 G6 V9 @* _0 {- H7 \; z$IPT6 -t mangle -X
$ T6 J! J# B; A' L7 r" n, U' b8 D" s6 |# f
#unlimited access to loopback
7 L9 k+ w& v" l$ x3 ]' a: X! f$IPT6 -A INPUT -i lo -j ACCEPT
' C1 y/ t2 n: P, H- R' H- D- k+ @$IPT6 -A OUTPUT -o lo -j ACCEPT- u& A& {+ {% [- L V# W
1 D7 N: O! u5 h$ E9 l$ [# DROP all incomming traffic, x# N$ D% s% i7 w
$IPT6 -P INPUT DROP& Y8 ^/ \- _/ l. X
$IPT6 -P OUTPUT DROP4 [: h2 Q* U8 i$ z# H. F3 w$ w; K
$IPT6 -P FORWARD DROP
" L+ s) K3 d7 @, `9 t9 S
! X _ [/ E1 T9 H0 t k# Allow full outgoing connection but no incomming stuff
5 R2 n, F& C) m [ z) i8 Q$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT- e7 [$ U9 T6 ?2 ^" b7 U
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT, Q3 N8 a4 i1 _& m6 r
5 j$ y* |& Q4 j6 }& P( d5 a# allow incoming ICMP ping pong stuff
& x% w `! B% ^; m$ Q" s- K$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT+ g9 I5 K2 a4 k4 d1 K
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT- m0 g$ M3 f( g
; D8 g& n( P( N8 i6 [- A############# START 在下面添加上自己的特殊规则 ############
9 c- ^# T- V& _) f$ U+ J### open IPv6 port 80
' r1 b: K4 R# n% A! D L# ^( l5 n# `#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
" r8 z7 A8 P" U6 b2 T### open IPv6 port 22) @8 d/ Z* P3 W% V9 j
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
9 l1 f# c2 m8 }/ Q### open IPv6 port 25
8 `2 e0 N4 P3 d9 e' o, u% I% \#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT
) E; ?; `' v( |' Y" u# z( j% O( h############ END 自己特殊规则结束 ################0 _& U6 h. r" H6 d6 k. R2 n
! g4 V% E4 }6 e0 J3 a3 j1 d4 ~
#### no need to edit below ###: Q- O: R1 }) e5 v3 p
# log everything else
6 ?8 x0 C; P7 @4 G& E g$ b$IPT6 -A INPUT -i $PUBIF -j LOG I5 `: `# q% M) F! v, e
$IPT6 -A INPUT -i $PUBIF -j DROP |
|