|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。& r6 | T1 \+ A
0 S; e. p9 z( [+ g( m
在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:
+ _9 E$ f2 P3 s2 O; [- \. } z1 d0 D ip6tables -nL --line-numbers. m: S' G! B* I' b
3 m; l, i: S" S9 q! p
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
- A8 u2 z7 Y! p& r r' \9 t6 p4 U W/ m
# vi /etc/sysconfig/ip6tables
0 p2 J# v3 u/ s) i6 A! P$ k9 d可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)
4 }* W5 i% C% E9 Q' G: J; I*filter
; z9 G+ `% E: J) b4 }% ~1 W:INPUT ACCEPT [0:0]
7 M/ z; V% y4 J:FORWARD ACCEPT [0:0]
3 a$ s: N8 v0 p( I:OUTPUT ACCEPT [0:0]( ~0 |- r5 i; W" s* e$ r
:RH-Firewall-1-INPUT - [0:0]
" ~# g3 D+ m+ l( F/ f-A INPUT -j RH-Firewall-1-INPUT
1 \( w$ m% W* w-A FORWARD -j RH-Firewall-1-INPUT, w) e' W1 N/ M
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
1 n7 n z. q1 p6 g- [1 h$ t-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT g+ B% }# ~8 |! U5 Y& { U
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT* {* h/ \/ J5 W& F
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT+ Y+ q( `6 n4 }0 W, k3 o+ ?
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT( j" y( N( q! E) L* X/ Y9 u3 L/ h
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
; T" M& f- N, Y-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
7 \% A2 p) ?7 `8 I-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
: ?8 u0 O. l: y0 ^-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT. x' [6 y# M, W# {
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
m: w3 ~- q3 c/ n: n7 b0 D-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
" j2 G: C$ {7 t1 j; X4 VCOMMIT
" ], |$ k0 N) l: g: l6 J与 IPv4 的 iptables 规则类似,但又不完全相同。$ J m& C1 C* O, M1 g& B! B
& }9 ~* F& [8 Y8 i; S
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:/ y* W7 ?4 i$ H5 j' F7 }$ [: I
& }/ r2 G( D, K* \' u-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
7 s* J. S# \. Z, J3 c-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
8 e' J- ]3 A2 _; U* ?
7 t6 u3 z$ e" _5 s! E2 ], H" f要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
( d5 A' @) Y8 f" ^+ v) E' z) v# M5 `
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT& @# e4 d1 o) D
-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
7 W( O% Y( Y+ `9 B/ U8 f i9 R8 U同时针对 tcp 和 udp 协议开启 53 端口。
/ c( R) A) O8 D L" e/ C) d' v: d8 K; x6 S0 _- U
要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则: G6 i* L" A4 m9 f6 O
9 r$ e3 Y% U: J" i( b' c
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
3 S2 g3 n3 i( s8 a: o* c' ~$ U要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
7 t5 d; v' n- f U1 G! ~- P9 v
) b, x+ V; t3 |) p( }-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT! c+ m! J: r% [. g1 V
对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
4 \* f, w1 f8 B) g% [0 K/ Z
8 Z0 R7 N8 @6 k+ E6 }-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited4 }4 {% @- E0 q6 A4 X+ F Y! r; _
COMMIT* q, _2 ^( |' x6 K; h2 R
改为:( _$ O; l5 [+ O! ^! e
+ \! ^1 L# q& ?1 g. T: {: s
-A RH-Firewall-1-INPUT -j LOG
. _1 n; K5 I4 s. q-A RH-Firewall-1-INPUT -j DROP9 x1 K% J( A; \6 h( M5 K0 i9 [
COMMIT2 |/ @# @3 }+ p6 o
保存并关闭该文件。然后重新启动 ip6tables 防火墙:0 O$ ^0 b7 K) _6 T: |
8 b/ B0 v, f( K# service ip6tables restart: v$ e% P5 _- G2 y. Y7 {
然后重新查看 ip6tables 规则,可以看到如下所示的输出:( u- q7 k% p) y1 D
4 d& C. z4 I C/ H5 j7 V# ip6tables -vnL --line-numbers
; C5 U# ^# ^+ w# `2 ^输出示例:& q+ X8 q) R' U! u
; h9 G0 u$ G6 L' t9 r! h
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
1 O2 }5 r* l" w4 \" h Bnum pkts bytes target prot opt in out source destination
3 x6 c% g2 I7 {1 b1 Y+ C4 o w! v# Q1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
: d% ~4 P8 K" O3 e) b8 T0 dChain FORWARD (policy ACCEPT 0 packets, 0 bytes)
: E. E- o8 O) h, S% Wnum pkts bytes target prot opt in out source destination% x x: _. G4 \- f6 {& U# I8 C
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0& C7 A' V* r( L4 r0 l5 `
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)4 b1 I' _9 E' U& q, u. m3 g
num pkts bytes target prot opt in out source destination
" T$ @. ~, g4 G' L2 j1 GChain RH-Firewall-1-INPUT (2 references)' R. f1 G; X# N0 G9 T. p
num pkts bytes target prot opt in out source destination
- ^1 [$ U5 y' v1 6 656 ACCEPT all lo * ::/0 ::/02 N* E1 h. P, G; _& U; N
2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/08 m: p, m4 I& g5 r: I
3 0 0 ACCEPT esp * * ::/0 ::/0
- F- X) E6 l. g7 ^/ \4 0 0 ACCEPT ah * * ::/0 ::/0
* \# K1 L, V) o, K* c5 L# s5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
+ z8 A6 u1 k' k" K1 W0 E) l6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631
* i) D$ J2 T! [. ~: b& Q: m7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631
3 O) f4 S: B" z: N8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000
/ h9 }5 \) f. b o* K9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02* j8 e. K$ m( [! y: G% i& n
10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:229 x8 m/ a+ h; t$ ?+ E, i
11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:803 O% X. g, m9 F7 ~" E' T
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
: ^1 A0 s4 j3 [* g8 \13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53 b$ Q( H( G* g: h: f' A
14 18 4196 REJECT all * * ::/0 ::/0
. w8 ]- T- B) ]& m' wIPv6 私有 IP¶1 O; f0 H8 [ D. G& t
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?( r( {+ u5 T: E O/ y" j/ @; Q
" k. c" o( F3 S' e+ k不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。; t1 L8 r" _5 F; m- m0 A* n d
: z& b U& K0 z; W
自动配置 IPv6 防火墙示例脚本¶3 C6 t0 o: o3 W1 s# m! \
与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。
6 D2 p5 o# K3 q+ v) m& x6 D9 H" q7 m! C2 _
#!/bin/bash
5 m7 n$ p' E% EIPT6="/sbin/ip6tables"" ^) y. f8 j5 ]. e: N
PUBIF="eth1"/ X3 I# e2 T7 P; e& q4 ` M
echo "Starting IPv6 firewall..."
% q1 y7 ` O& ?( \! M4 w' O6 P$IPT6 -F
8 y3 v. ?4 M! F0 @9 c$IPT6 -X9 |2 b; @2 T9 j$ D0 M1 H! }
$IPT6 -t mangle -F- U: y9 E: [2 A# z& d9 K) t9 p: w X9 D
$IPT6 -t mangle -X/ Z: j( [7 b2 p
, h3 m. S3 E6 Q; C& B! @1 K/ I! L; T4 x#unlimited access to loopback+ a( Y6 e8 S9 x$ X) S
$IPT6 -A INPUT -i lo -j ACCEPT" {2 Z$ q# O$ M) _" a
$IPT6 -A OUTPUT -o lo -j ACCEPT* _& O: |( E. j
0 J* z5 R1 x( c3 [# DROP all incomming traffic7 i" @* [) ^5 [1 ~- |: T" `
$IPT6 -P INPUT DROP7 N- I- s& n) q3 H! @- \9 U
$IPT6 -P OUTPUT DROP
$ W7 F8 @" X0 `5 K$IPT6 -P FORWARD DROP' F. H3 [5 [) P; |% o6 ~! W
2 O9 G9 K- U7 d# ^( I% p& V' o
# Allow full outgoing connection but no incomming stuff
7 i d% i6 K& O: |& Y' G5 V$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
5 _- ^( f( Q- g' Z1 f ~0 I1 `. d$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
. S6 e; P6 w) p6 K+ Z" g- H5 ~: m0 e4 u5 v
# allow incoming ICMP ping pong stuff2 D$ `$ v4 U% L1 Y' ~( N
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT4 a, m. x; L! W# f) x: d" e
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT
2 x) S6 } Q" l4 E. @( }; `8 D4 S' Z8 \( O$ m7 R
############# START 在下面添加上自己的特殊规则 ############. i# ?) `. F3 t
### open IPv6 port 80
: M R: ~& R( ?1 X: Z#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
% V4 N1 n4 u5 M+ Q### open IPv6 port 227 T# i2 ~. P( {' i5 A5 @: U
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
/ I& k4 |" C' h2 f0 I' D( a& v### open IPv6 port 25* H7 U9 {8 a Q" i
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT1 F% }/ G! R& k) ]% }* r/ {. s! N
############ END 自己特殊规则结束 ################
1 ^, E$ j9 y8 h: O9 T! R9 U$ ?3 W% O5 `; Q- U6 j
#### no need to edit below ###$ D D; D; I6 s3 F2 l* x: b
# log everything else) Q9 o3 U' q/ e8 i. o- \
$IPT6 -A INPUT -i $PUBIF -j LOG! v) s6 R$ m, N& v
$IPT6 -A INPUT -i $PUBIF -j DROP |
|