|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。& V' L$ r, t5 o' j7 }3 E7 w; C" w
$ S% c% p0 ~( y# |5 E在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置: F6 L9 e- }- n0 ]. A0 Z6 p' f
ip6tables -nL --line-numbers
5 A; l' I0 M8 n
; E" Q# R; }" }8 ~使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
# ]: v6 a& u2 t0 c: e8 R
$ Z! A4 J \6 C9 u% T# vi /etc/sysconfig/ip6tables
% |2 v# p7 B* d& w3 Y" {( j可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)
" i" |* P5 W' v% O; Q5 ?+ i) y8 D*filter
. g! W& O% O9 t:INPUT ACCEPT [0:0]
% u `8 p6 h' t% ]& U:FORWARD ACCEPT [0:0]. I, O6 k) a" N8 f* w# E
:OUTPUT ACCEPT [0:0]
; K- Z! g8 Q% ?/ b2 Q6 D:RH-Firewall-1-INPUT - [0:0]
/ b. X) C8 x! w-A INPUT -j RH-Firewall-1-INPUT# c1 U* {4 m" ^) c. B
-A FORWARD -j RH-Firewall-1-INPUT
$ ?# `7 t4 W/ Z- b3 ^, V5 s-A RH-Firewall-1-INPUT -i lo -j ACCEPT1 _1 y& q- Y- M" c8 N" z
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT( W3 `9 P" K8 @0 w
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
0 j, ]+ l5 J. [4 _5 T: W) L7 x" {4 E-A RH-Firewall-1-INPUT -p 51 -j ACCEPT; i! M; W3 I1 X+ K8 F" F4 Q
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT; a8 |3 q, j% w. Z- f4 C
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
2 U o+ O0 {2 r9 u9 a6 J: E" n-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
7 k9 [* N8 K+ w: W4 O8 J- e-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
; v4 X1 F$ J3 Q# J( J; y-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT6 b( R( J3 `: @
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
B2 P6 U7 f* ?$ h+ `! L$ B: F-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
. K# ]# K" `- b3 }8 e# X% r+ B! QCOMMIT
# _0 X2 q6 x8 P6 k6 {与 IPv4 的 iptables 规则类似,但又不完全相同。
, ]9 O$ i6 u* x6 q
" u0 x0 t6 e: M5 |/ t+ t% d: b要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:' L2 _# G* S8 A
7 Q. o+ L) Q7 i$ T1 F-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT1 n* Z' q: }0 L6 a! J9 G
-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
7 q& Z* V% s' }1 k9 {& Z$ z: i4 W: B/ V. q* J& r
要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
% s2 E: P# i6 T" S' k/ u
% X9 {/ H% z1 f' X-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
7 f3 Y( q' J' U4 B-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
" D4 \: N* v, s& c" i( k同时针对 tcp 和 udp 协议开启 53 端口。
: r6 {8 s; P5 \. n3 R, }: `( ~' }6 ?9 d4 k( h. W
要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:) T$ _0 Q4 G5 w- o3 K, \
f; r. y* M) U0 ]
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
& \, C; w0 {/ w( D& r/ i/ O! [5 A要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
6 \+ u# q1 b/ T
5 V, H# @ y1 Y8 W& j-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
6 ]( b; {% F; _; G9 `! T对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:+ Q) q) U! |# D
- f% q3 n2 ?/ o1 q
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited4 Z9 k! N, k0 M' `/ n X, W) L
COMMIT
, T r& |8 n- E7 Q改为:
8 ~0 m4 q$ W( m' X7 ?; ^; V' ~4 F
-A RH-Firewall-1-INPUT -j LOG7 u1 `4 q9 r! D* a M
-A RH-Firewall-1-INPUT -j DROP
{8 ]! }+ \) s& e8 yCOMMIT) w, u7 e7 z7 {2 s1 {5 E; m
保存并关闭该文件。然后重新启动 ip6tables 防火墙:
" d9 ]6 W; S4 X% o; r% i$ u; P( a! p, U! }
# service ip6tables restart
4 v X+ i5 J# w, q6 R+ w$ P2 s. K然后重新查看 ip6tables 规则,可以看到如下所示的输出:+ q! R; Z3 U8 Q' ]
8 I3 F$ Y. F5 ^1 `4 @" d4 q
# ip6tables -vnL --line-numbers P0 w/ w5 l3 h! l+ j+ z! _) Q
输出示例:
5 B% c; Z2 A- V& \+ j5 H
) R9 p+ X# Q! W2 Y7 q& gChain INPUT (policy ACCEPT 0 packets, 0 bytes)* q6 z4 f% i0 p. d( H$ L: n
num pkts bytes target prot opt in out source destination5 c6 n7 x, H$ o+ p+ R
1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
1 ~: o# {1 i) R0 hChain FORWARD (policy ACCEPT 0 packets, 0 bytes)
4 q) x* I$ p0 z. N/ Enum pkts bytes target prot opt in out source destination* _( X2 A- j0 C" B, P( K
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/09 n+ s5 I; g ~" R
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
% k2 q; w+ J/ m _' G7 znum pkts bytes target prot opt in out source destination {# C( x( p, m* {8 f# w) H
Chain RH-Firewall-1-INPUT (2 references)
6 h& {3 T* Z/ q' s& J3 e8 O) w. [2 s3 @num pkts bytes target prot opt in out source destination
0 x+ L' Q. z# Z8 s( s- z3 q5 L1 6 656 ACCEPT all lo * ::/0 ::/0
2 h+ P% O& Y* r) u% Z# _$ y, j/ `+ Z2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0
5 g; }) ?$ J! y0 E% v3 0 0 ACCEPT esp * * ::/0 ::/07 p9 ^7 |9 C0 e2 j
4 0 0 ACCEPT ah * * ::/0 ::/04 x. n+ r4 K% r: A1 M
5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353! Z- T: x3 l4 E. j% C3 s4 P1 N
6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:6316 M5 m' f& u& B% f
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631
; }' {. Z: q% S7 s6 C) \8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:610004 z- g( o: v$ c# y) p/ W+ L$ ~
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02, R6 y5 x* V) [' n4 o5 ]
10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22! _2 z1 {! l7 j: [- y
11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80
1 }$ g1 g$ b; ~& r* p. [12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
1 S6 I2 u. n. [ i1 f13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53+ F4 w* ?% k, c9 `* _; Q# B- \
14 18 4196 REJECT all * * ::/0 ::/0
# R s ~3 h/ n1 f6 H5 N0 D, VIPv6 私有 IP¶! H9 j4 p5 P; P9 u* e
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?
5 C. n; i' {" x/ }9 Q( D
3 i! h8 c, m7 |7 o# Q2 V" K不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。
7 e$ Q# P6 |2 ]& Q+ Z3 f4 Y0 j1 x3 l- P% m
自动配置 IPv6 防火墙示例脚本¶
( a4 z& D6 U, S" i& O7 t8 K与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。# ~) k6 J0 }, H1 }" M* P' J
; t' t# L. ~3 @5 ~+ `#!/bin/bash1 D* j' }8 J& a3 w0 W1 G6 e( L Q
IPT6="/sbin/ip6tables"
! Y) o: a9 Q% c( PPUBIF="eth1"7 \* C) [, z; [; e+ r
echo "Starting IPv6 firewall..."
. c& b3 I; H9 F- n. x$ D9 d& e! Q9 f$IPT6 -F4 C! j: f5 C# e, [- d0 g
$IPT6 -X4 c# W8 P h7 J4 I8 ?
$IPT6 -t mangle -F
; y9 ~: u% {1 A+ ^% j9 [$IPT6 -t mangle -X2 k- D' }) {. q% q! Q1 u$ }. A
" d5 E a; c5 B: _- h$ d
#unlimited access to loopback" `& D$ O/ I" R! o
$IPT6 -A INPUT -i lo -j ACCEPT
! r* I1 j ^. p- S: e! y$IPT6 -A OUTPUT -o lo -j ACCEPT& R5 Q- \0 l4 D& J3 \
/ B, p% u: w+ e/ t3 E* [# DROP all incomming traffic9 Q* e# u3 ?4 B; Z* y
$IPT6 -P INPUT DROP
6 y) p9 F! l, U1 s) {1 s A: X$IPT6 -P OUTPUT DROP
% G: Q% _0 J% R$IPT6 -P FORWARD DROP
/ y: u% Q& r) `; F5 r" O* K. Y9 i% x, [& }( o, R
# Allow full outgoing connection but no incomming stuff6 P3 c" N# K# W2 J# L
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT! [ U- G- W) ^6 N( w: [4 b+ I5 O* W
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
+ C1 S. P7 M* Q* v$ B* e E' _8 }
8 [, x, M; ^0 r+ s, r# allow incoming ICMP ping pong stuff
& v& z$ }2 M* Z w) z3 x: w% A* @$ W$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT, Y* @7 N L, P9 i& p
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT
1 D0 m: \' M8 o# t; C! j: G- X1 y, w! K" P( K4 ^2 N
############# START 在下面添加上自己的特殊规则 ############
7 i2 G L* }2 h% r6 s6 [9 G5 j### open IPv6 port 80 / S: k( A/ f& e: \' V
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
' J E' s' |7 g& a# k### open IPv6 port 22
& @ ]0 e v$ q% V* g#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT( E6 H9 |; I$ P) H/ z+ f9 X7 U
### open IPv6 port 25+ ~8 M# W8 ?- F/ E) C) `
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT8 w2 O; X( j! V' `6 b) a# h+ R4 X
############ END 自己特殊规则结束 ################7 a/ s, n1 n' z' J/ i F( _# N7 D
2 O9 ]/ {: y" |" t: g) N#### no need to edit below ###3 x3 L* i+ m' P) c4 N5 l. E: @ J
# log everything else5 s. d2 x U q* Z) @0 A# R
$IPT6 -A INPUT -i $PUBIF -j LOG1 f' [. g L0 f/ {4 i
$IPT6 -A INPUT -i $PUBIF -j DROP |
|