|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
+ O6 l2 c, W; [/ H/ v0 \& e8 ~! v7 T/ u% p9 M( U! X, O
在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:0 X+ e2 e. `+ W5 f+ z3 {( X& A- K
ip6tables -nL --line-numbers
4 X& V' H: S; h2 \
2 k" t5 i m; H) p使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
* N. q! s9 Q, ~# _$ H# E6 c5 ~' N# n% ~7 T* o3 S2 `
# vi /etc/sysconfig/ip6tables
' C8 B$ u& R3 E3 l可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)
7 |( f$ ]8 N2 w& H: S*filter
) U& S N! W% e/ g) G. Z+ p:INPUT ACCEPT [0:0]3 H6 {" R. C4 j
:FORWARD ACCEPT [0:0]
& G! s: t5 _: }; B9 ?+ C0 B:OUTPUT ACCEPT [0:0]& t7 A/ X$ k4 N, _8 O
:RH-Firewall-1-INPUT - [0:0]
1 p3 W/ Z* V7 G- e" Q. Z. X-A INPUT -j RH-Firewall-1-INPUT
V N; c; V. x- P-A FORWARD -j RH-Firewall-1-INPUT
b* P4 u: h& [-A RH-Firewall-1-INPUT -i lo -j ACCEPT G$ _. R9 W8 C* [
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT+ L. k' g0 {$ I6 d
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
" c4 j, Y7 S4 @3 h, q-A RH-Firewall-1-INPUT -p 51 -j ACCEPT& e: U( _4 I9 G: X' l6 D9 e
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT2 Y, x$ ?6 _) {4 ?# `! i! Z5 G
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT. s$ f& G9 i1 M* k& o% G% Y
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT9 b) d* y( v$ ?, l0 q) M/ Z9 f% Y" K
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT& J3 Z) k+ S1 G+ [: B, P
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT5 A# [0 d: ]2 n& V8 [7 U: i8 k
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
/ n9 g% p. u$ D# r-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited" Q" O1 s5 H$ F2 S, r, w0 {
COMMIT
! x6 M' F {/ V0 }- _; [# D与 IPv4 的 iptables 规则类似,但又不完全相同。) X9 V" s! b/ j8 f
! q9 e: ^6 \, k* \9 n要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
6 d2 ^( {: D m9 {# u4 Z) Z3 m+ E( W
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT5 k) \: ?. Z9 y' ~/ D2 U
-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。# Y3 k+ t- \/ s
2 [# B0 s( Z- A5 g
要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
' S4 K4 O8 i2 ?- K( I; ]8 e$ e5 W+ R' G
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
( e* d6 X) x& R9 ]" E-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
( } u6 r. i1 M t同时针对 tcp 和 udp 协议开启 53 端口。
$ e/ _$ D, c% j# l. ^& ]
/ |% n/ l1 q' y: j. v% Q% _; Z要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:5 z: l* c, j& X. [& G2 h% G
1 L! r" m5 H) b* c/ D; j2 |-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT" E! d; v, ?! P. q% Z2 z7 B4 c
要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
, b3 q ]1 k W' Q0 R7 }/ h
4 V' l8 v7 Y" \" y3 g6 d* b7 e-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT; W6 L$ |! I: N* C1 Q. |8 W
对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
. J' v$ M# e* J" H2 O* M! W1 |, d1 @* v) U4 P- F
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited! A6 N9 g* \/ T
COMMIT4 S; ~* J5 s7 s) m' s2 I) F
改为:$ R8 U. k* Q9 z8 ?- y; i6 e
. T# ~+ u9 q+ r- _7 a
-A RH-Firewall-1-INPUT -j LOG* v# O( P. z) t
-A RH-Firewall-1-INPUT -j DROP
/ N& z5 b1 ?0 D& ZCOMMIT( [0 f7 u' ]* P- T- v% f
保存并关闭该文件。然后重新启动 ip6tables 防火墙:
1 f% g. X4 L8 S/ r, p4 W
. x" O3 m) r& E0 E6 P# service ip6tables restart
! i ^. Y1 A/ m然后重新查看 ip6tables 规则,可以看到如下所示的输出:
+ @' t& T+ q; u: n! d
; k% t4 @3 R/ A% T8 i$ o5 ~% q# ip6tables -vnL --line-numbers Q7 y5 M) ^* h* t, G
输出示例:- }. w: _) m J f; G& G% b; g
) x2 y# S( J- P+ |2 H( k( vChain INPUT (policy ACCEPT 0 packets, 0 bytes)4 i* ?# L5 p$ `0 }+ u' _ _; ^' e8 |0 q
num pkts bytes target prot opt in out source destination
/ c0 D8 d# }) Z7 ~4 \( Y/ r1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
7 \: |# ]& u( Q$ a5 ?4 @" bChain FORWARD (policy ACCEPT 0 packets, 0 bytes)
e+ V$ D7 _# H: T5 V( ?num pkts bytes target prot opt in out source destination. F- J1 P \. W
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0$ b: @8 `5 H! a/ f$ @
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)& S2 g8 A0 C) L: ?- M4 \
num pkts bytes target prot opt in out source destination
$ w7 o( K) x+ O9 k' eChain RH-Firewall-1-INPUT (2 references)6 B' [+ I5 C; Q0 `. g
num pkts bytes target prot opt in out source destination
6 @4 x7 K2 N& {( Y% Z( U% \1 6 656 ACCEPT all lo * ::/0 ::/0
3 e1 a: V2 O9 u/ a( z2 v2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0
9 s" g' z E% c3 G8 Y% a5 O/ ~3 0 0 ACCEPT esp * * ::/0 ::/0
. ?; `$ V4 ^6 f" k0 C4 0 0 ACCEPT ah * * ::/0 ::/0
6 A) h# K3 a% \5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
% J1 r5 j' E ~6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:6318 o" E' O5 V2 r
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631
% |; J; K1 |; G$ R& [! q. b8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000/ B. k' ^2 ^5 _/ Y
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02) I' h& ^# d; {. C1 \
10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
" I, e# u, G, }11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80% x: p$ }* h0 f5 p
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:537 V h7 a4 J m
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
. c+ |* v+ |# }$ l) v14 18 4196 REJECT all * * ::/0 ::/0! b( |- b) U, O/ Z1 A
IPv6 私有 IP¶2 b) O5 T% [( U' c T1 K/ t
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?7 r, G" @7 v+ F) P0 c0 Q9 L
% h; N; d3 J% i8 n2 v7 H" r不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。
9 A" {3 a+ P8 J+ P
1 @- y" O" W3 a3 X/ Z& ]自动配置 IPv6 防火墙示例脚本¶
, X! ^) L! A# O- l与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。
! j8 Y- b$ @7 b# I7 k7 k+ ^. h. @! L2 a
3 o/ I+ ~, h* z2 e0 D/ n#!/bin/bash; c- t: q9 i7 h' J
IPT6="/sbin/ip6tables"
8 }" E* S9 F, x# A6 D3 Y8 `9 S2 @: x2 qPUBIF="eth1"
( B4 \, Q! i* @7 i& `4 v+ becho "Starting IPv6 firewall..."$ f9 r. m- q7 D( s
$IPT6 -F
" v; s, w$ |7 M8 p) b/ D7 L$IPT6 -X' {6 S1 q) v! e$ N
$IPT6 -t mangle -F
6 I4 p+ n, |3 V1 K$IPT6 -t mangle -X% _$ X; w0 R* o' g2 o
) b9 H3 T* L( i. }, D$ f& s
#unlimited access to loopback
6 o6 c: [3 Y4 s% d/ U. ~$IPT6 -A INPUT -i lo -j ACCEPT `5 V$ Z2 X1 h( j
$IPT6 -A OUTPUT -o lo -j ACCEPT
: a" H$ i! \+ j( {' D
+ s* E7 e% w. A; Q# DROP all incomming traffic
% m( Q* _9 ^0 h, G$IPT6 -P INPUT DROP; K0 A; W3 f8 t3 d$ I* k
$IPT6 -P OUTPUT DROP0 }$ i5 t; o" S7 E: v' f
$IPT6 -P FORWARD DROP$ W2 }& D/ O, |4 H/ \2 I+ F% r
- s5 m0 U; K5 E/ ?; |+ ^# Allow full outgoing connection but no incomming stuff
/ }5 U E) W) G/ S% b& ?$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT/ d2 }+ J& @" E% |$ S5 ^' i
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
: O( b2 R7 y2 _/ S# }9 _2 H& F+ U/ O7 t. } e
# allow incoming ICMP ping pong stuff' {4 G: r0 G7 `( m) p7 l
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT3 S6 N" i4 D( ]( P) J$ _5 }4 i1 K
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT
, L3 y* ]) x3 j0 o6 P+ p' [
! K g' R7 @9 _/ M' E############# START 在下面添加上自己的特殊规则 ############
; e# L, O- n2 l' e### open IPv6 port 80
: c. t, ]' t: s9 A" G3 D1 Z9 Z' D5 G#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT- D. [; `/ S- x, w, S9 k
### open IPv6 port 22 H2 @; l/ ]2 h8 A2 ^
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
4 C) s1 F5 x6 i7 Q" r6 L### open IPv6 port 250 B7 K5 p" A2 V, w" o/ {
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT8 k8 {* s1 t1 p- ]; J% c! ~, k
############ END 自己特殊规则结束 ################7 X( ~7 C- F; W' {8 l
- H9 d! I1 T% p0 C
#### no need to edit below ###
\; t# T9 N! ?1 g. m8 _4 @4 `# log everything else' r* e% P3 x9 @) I
$IPT6 -A INPUT -i $PUBIF -j LOG; c9 w7 i( M2 Q% \
$IPT6 -A INPUT -i $PUBIF -j DROP |
|