|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。, k% C7 U4 a0 _; R4 ^
% D2 p' m6 }6 f在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:7 m2 k. a6 s% t$ ^ p
ip6tables -nL --line-numbers
/ z o# b; N# d7 q. A6 ?: j# t& Z0 f5 |3 P
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
3 m" N9 L% p% I6 `$ q
: p, `$ Q3 E; N3 x" L3 p4 I# vi /etc/sysconfig/ip6tables
5 u8 d) F- L/ y4 W3 j3 A }可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)
o) T; E) l- K. H# I) I) K" o*filter
2 [& r. m' K- F- }% y:INPUT ACCEPT [0:0]2 l4 O( _5 ?5 I6 ]6 F4 P g
:FORWARD ACCEPT [0:0]9 W; u! G1 `( n' ?; O7 a4 z3 T
:OUTPUT ACCEPT [0:0]
6 K: ]8 M- c' F:RH-Firewall-1-INPUT - [0:0]$ E1 v- x5 m; T* U/ L
-A INPUT -j RH-Firewall-1-INPUT
! ~, s; B+ |* r-A FORWARD -j RH-Firewall-1-INPUT
1 r5 M3 u2 {0 R-A RH-Firewall-1-INPUT -i lo -j ACCEPT0 d$ A t4 Q" k' r" q( ]& u
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT' I6 B* G8 c8 U# g0 Y: p# q6 [
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT* n9 k3 M$ {3 b j- V' r
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT* V2 P( U* u( J ^
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT7 E/ {5 ~5 Q; m* t1 P: }
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
0 M7 l- _9 r! W-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
, H/ k# `4 C% R. V1 X-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
" x! ~, v4 y9 V. B9 `5 [7 E5 V& S-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT1 z1 a7 ~2 d- n1 \5 ?
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT+ w4 z l/ E" I1 V9 K$ _
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited c w+ k5 y+ c% ]
COMMIT
7 K% S; o1 x3 I x. b5 Z; L( l与 IPv4 的 iptables 规则类似,但又不完全相同。( ?1 r0 c* e+ |) I- V
& A$ _' y% {# b; W& {2 J
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:' X: ?* T% V# m/ Q( b
( ?" n Y2 T9 h6 e" q4 |# t-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
0 L( F; @! o2 ?/ x9 A3 X3 J7 j0 J-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
( J$ n. m6 Z; \! A) H, n
1 A* a! c6 t3 X3 d要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:# \: U$ R8 T* I: K, {' m% C& X
x" W; X: B* H; U6 [
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
0 P, R% j1 O9 b. E" c-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
% W4 D2 D( w# E% E0 H' i同时针对 tcp 和 udp 协议开启 53 端口。* z8 ~; ^" F6 G& E
. g" k& `* t) n8 J- K
要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
" Q$ a2 d% t4 {* j' U4 H4 P* q" |% \( O0 U- b% d
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT% K( N0 L$ Z# [
要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:1 H( G1 T& _1 |# A
4 f* _ U* }' U" k-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
% }- w1 i# X! b% z7 q6 R对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
0 ^: E( Z* p+ X8 h4 g* @/ K% D' y& m' O
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited* K) W+ x' \. l ~$ _7 ^
COMMIT
+ V2 F$ t' {( p( T T5 J改为: o3 e7 {' f! T3 K) b7 a$ k5 X* G3 u
* ?8 e1 N; e* L9 D
-A RH-Firewall-1-INPUT -j LOG
6 |& @0 i! M& c-A RH-Firewall-1-INPUT -j DROP
& H' L) x7 X- h9 M5 K% bCOMMIT
& m# h8 w2 f/ U; w保存并关闭该文件。然后重新启动 ip6tables 防火墙:2 Z4 H. i; ~6 Q0 W7 q/ t G
& |% q8 y4 s' p& x# A+ @+ z
# service ip6tables restart
4 c) r2 k4 M4 _然后重新查看 ip6tables 规则,可以看到如下所示的输出:& T# z+ p0 I7 C9 `) t
' o) `( I" O, O7 a4 o* B+ Z3 ~# ip6tables -vnL --line-numbers- n1 s' v I7 R8 Y( K9 A6 v
输出示例:4 o# k& s& c, n9 V
; n3 a8 v5 {& `5 M; EChain INPUT (policy ACCEPT 0 packets, 0 bytes)& r6 z! K- z# b. j: S% E/ Z
num pkts bytes target prot opt in out source destination
E( X ?% H* h- ?1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/01 j. @! M7 |5 s& t
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
2 P$ `0 ~3 _% @4 z- T' A+ M2 |7 \num pkts bytes target prot opt in out source destination
8 s6 R; F- n" f7 D4 q0 @1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0
# J# H2 p! {/ }! T `! Z g7 XChain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
( h1 X, O9 X4 ?num pkts bytes target prot opt in out source destination+ |4 D9 f8 o! W. Y' y9 K
Chain RH-Firewall-1-INPUT (2 references)
3 ]1 s9 Q5 G: t( U9 o _: `2 a" unum pkts bytes target prot opt in out source destination
2 `, ~; h: R0 k$ C' ~1 6 656 ACCEPT all lo * ::/0 ::/03 f! j1 n# m" ~: @! q& a
2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/09 z8 g9 j7 F4 X3 \! H
3 0 0 ACCEPT esp * * ::/0 ::/0
" m; M F `. P/ L' ~4 0 0 ACCEPT ah * * ::/0 ::/02 A# v) Z+ f. X9 H* V* E
5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
' \$ A; ]! K1 E ~6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631
; {+ F) O3 K0 s7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631 j% Q$ X! C8 C
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000 w, O! p/ u: M/ J
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02$ ^" Z+ X5 V* q
10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22. h3 B0 \* T) u3 ?
11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80$ U/ I/ @. i& q$ v2 H
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:539 i$ ]. L2 l& F" H; R" t
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:530 X3 f* o8 L# Z( } v. ~2 p& d% Z: _
14 18 4196 REJECT all * * ::/0 ::/03 S( y3 e+ y# K$ s5 ~: D9 W
IPv6 私有 IP¶: ` Y- o2 Q! [; q
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?) _/ _. O y0 H
9 ~% f9 ]4 ]2 R; B5 Z: H, d" _$ B
不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。
6 C4 G4 i( J' y7 W
( T% A; W6 Q' R" ~4 L自动配置 IPv6 防火墙示例脚本¶
5 h9 w# U; `( l: i0 f8 ~3 l与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。" ?/ Q! C) a% k7 |* ^
% e) V; d: K! d; ^#!/bin/bash- p' X# M' K7 {5 K8 `$ n
IPT6="/sbin/ip6tables"" w: O. Y, z; d+ S/ o' n7 u
PUBIF="eth1"8 K8 R, C" T. Y$ `
echo "Starting IPv6 firewall..."
( C. l! I1 a! z$IPT6 -F- n$ K) ]; \. L2 X4 u) Q
$IPT6 -X- @' M- K+ F- F! u% m: q
$IPT6 -t mangle -F/ x8 O: p! X6 Y7 z
$IPT6 -t mangle -X
* K& C9 Q4 T+ _2 n' R8 S. D- M) K5 P* |
#unlimited access to loopback
L: P, X9 b* ?* T8 G# M$IPT6 -A INPUT -i lo -j ACCEPT
; S! y4 ]' K" A5 W4 N$ ?4 r$IPT6 -A OUTPUT -o lo -j ACCEPT
, |: V% \% K: y; t0 g& q
^8 t; d5 S0 y. c# DROP all incomming traffic. r1 s# N3 Q% i8 V4 m
$IPT6 -P INPUT DROP
5 @4 T8 M" `4 h4 ]/ @8 A$IPT6 -P OUTPUT DROP* n# p, s' S( ?( x# x c- J
$IPT6 -P FORWARD DROP
6 I, W, A, s# Z2 Y: Q- a" B* B+ b! b# U* E4 l3 j. F* q
# Allow full outgoing connection but no incomming stuff
* u" f5 T+ l) E9 T% M$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
1 g2 Z4 Y; Y$ c$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
8 F$ \( f8 R& h: q8 _: a! w5 N6 C `* K( i
# allow incoming ICMP ping pong stuff0 Z2 E: s& D$ h7 `! [
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT
& T4 _- U0 T4 D$ m$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT
R. e @+ |9 K0 i, f' s, [$ Q# E5 l$ Z
############# START 在下面添加上自己的特殊规则 ############
3 _1 ^) ]8 M& c. H$ a- U s### open IPv6 port 80
, V% ^3 l: B2 ~7 Q#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
" B/ l2 b2 N2 k& y0 B6 q! ?% n1 }1 E### open IPv6 port 22
1 [, N# x( e) u5 }#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
0 T" N$ j- n0 `### open IPv6 port 254 f$ N3 j, V4 K- D! Q8 b
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT
- \. F' A4 w+ |1 I4 `5 k' i; E############ END 自己特殊规则结束 ################
5 V& m2 f g8 r+ d9 r! m
0 z+ u- q7 a8 s" `# A& @2 h#### no need to edit below ###- J$ i! g. J# ^: R6 L
# log everything else
/ o/ T0 M# t. ^2 F, Q4 F6 \$IPT6 -A INPUT -i $PUBIF -j LOG8 [+ H2 V% `4 Z
$IPT6 -A INPUT -i $PUBIF -j DROP |
|