|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
! s; b5 \( B9 Z/ _& z) ~5 Z
( n6 I: f7 ? x6 c, _, U' T在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:
2 P7 ^4 S. e2 v4 Z ip6tables -nL --line-numbers7 }& }$ e& r% F5 J! H
+ i+ D1 i% p2 A# e1 U8 r9 q
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
% ^0 y( C' G$ i, K- s R% z
/ z# ~* z9 K2 O( @0 N; C5 e; k# vi /etc/sysconfig/ip6tables! }* r0 h! C4 N5 c b
可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)+ |. a0 w7 S( c% v, {, b
*filter
- ?) a$ l$ ]& Z9 E d0 b4 T:INPUT ACCEPT [0:0]% v/ l: w7 s9 B$ D* c7 X
:FORWARD ACCEPT [0:0]3 z. L7 S0 L9 ?' T: m' f( z; b
:OUTPUT ACCEPT [0:0]
9 [2 y1 p# @) s; V# n:RH-Firewall-1-INPUT - [0:0]
* x/ F$ ?; A# k-A INPUT -j RH-Firewall-1-INPUT: d- [5 a$ b( y$ e
-A FORWARD -j RH-Firewall-1-INPUT9 ^% ?" W5 i7 _$ K2 `+ k s
-A RH-Firewall-1-INPUT -i lo -j ACCEPT" s0 K. ~: u) o5 d! R
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT& q! u2 \: w6 P2 |* l- Z
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT- M$ u/ n* h' R$ L" w
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT2 L! U5 G! C& v& q: f+ t2 |- ~- O
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
, G0 T0 W0 g3 B% [1 F) O7 m-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT' B3 |1 p3 O; O) ]1 X7 d% I) b
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT% [* D% z7 T0 V( ]" N4 a
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
& T- a2 a& X& o) U, Y( D, ]-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
{ J) `& S6 R& K f% y K3 J-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
$ N2 A1 s4 p, ?1 a-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
* v" `$ A! e# T/ U9 I( _- T7 B3 sCOMMIT
0 w! H( v6 V' W) D/ g" N+ S与 IPv4 的 iptables 规则类似,但又不完全相同。
9 d+ P& R8 ^+ v2 C/ ^
t5 ^( J2 N5 X( t/ d要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
0 l) Q' Z+ k( }7 w% @+ w) {& n% i* L# Y; e' C# X+ n: g
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
( l* L# Y7 e' y+ E1 a- \2 _. v- V-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
: H2 [- i+ `* y( N \
/ R; d4 b8 s2 u! Z7 h7 _6 p要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
9 O1 n$ D% m, k L+ Q1 [, R- `5 T3 s! b1 b
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT3 B; \% d) O! b
-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT, v6 t. @4 i2 ]" ?
同时针对 tcp 和 udp 协议开启 53 端口。6 w' u u/ ? `
K/ ?2 z7 H2 d: F5 R( r要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
& H5 J6 X u7 n
+ _( E+ c( s5 F% I7 X" d8 Z+ {-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
3 e j: a$ M$ N! p, e* }( _+ ]$ T M要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
: g% V+ P% s) g. A4 `2 ~/ M3 {+ \/ {; s! Q: M' R5 {
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT* O M; P {4 h8 }+ m1 a8 e
对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
5 _1 \! I/ q8 b6 t5 M: n2 S2 B" j
+ s* j. v2 n6 q2 |9 _-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
/ I9 t5 o; _$ [1 ^! y2 lCOMMIT% V( s% Y7 ^! T% W. [& H
改为:0 X( h4 M5 F/ Z5 F7 Y5 M$ Y
! X6 e5 V# z6 r2 C, k/ P: }$ p9 _& H
-A RH-Firewall-1-INPUT -j LOG' V( s+ \1 R% P" o: U* m8 v
-A RH-Firewall-1-INPUT -j DROP! R$ e% G/ ^3 a
COMMIT
$ B( E$ n$ Z# O2 J6 J+ D/ [/ }6 l保存并关闭该文件。然后重新启动 ip6tables 防火墙:8 E+ q1 Q9 `& J0 `; G8 P/ x/ y5 w
) D, ?+ [9 u% W8 l, s
# service ip6tables restart
, \- i! ?. @: F! t然后重新查看 ip6tables 规则,可以看到如下所示的输出:% e& ^4 `- x7 ~6 t# q, v
8 |% U) M1 a9 Z5 Z l+ v# ip6tables -vnL --line-numbers& I8 C7 y( w/ F) F# Y8 b- j; q: X+ n
输出示例:. g0 B K. j$ P* F2 J
$ ]2 p: f2 W6 L2 A' ~Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
5 K4 ?% \3 r1 T) f4 ?6 knum pkts bytes target prot opt in out source destination$ ]. K5 M5 o8 x' F
1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0* R9 u7 G- M) j
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
+ k9 X: s" F9 Xnum pkts bytes target prot opt in out source destination
2 v) G5 Y) u7 T0 x1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/04 s: a u7 \, z2 W. T* A0 E
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes), T5 m* k' P5 T- ^
num pkts bytes target prot opt in out source destination
* e. K' G; w0 Q( c) WChain RH-Firewall-1-INPUT (2 references)% z$ [$ D' e( \) Z% W
num pkts bytes target prot opt in out source destination! Q4 }1 P E: p) P$ b
1 6 656 ACCEPT all lo * ::/0 ::/0
0 x+ Z) B _. l7 }* G" F3 z7 V5 O. r2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0
' s! T, ? T' W! W# z3 j! t3 0 0 ACCEPT esp * * ::/0 ::/0
$ v8 x3 {- |, x* {: i, \4 0 0 ACCEPT ah * * ::/0 ::/0% x! @1 u+ T" N# l4 U" A* ^) k
5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
1 M" W9 _5 P3 Q/ ]9 w. m- A) R# w6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631
$ ^1 N3 f+ f6 i0 A3 w( }6 y7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:6319 s9 w; g9 ~: ?- o" m1 k' x
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000
N$ R* V& k+ c# c+ G9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02% I% r" G! K- F! s7 B' ]
10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
3 _: e z i w7 \: w11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80
$ ?8 E, F* _9 R4 c4 F12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
+ d" `/ w8 D+ ~4 E' P0 _13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
7 r4 Z- }8 B5 Q+ o! a14 18 4196 REJECT all * * ::/0 ::/03 Q6 G7 C# K- a6 j) ~
IPv6 私有 IP¶
! m0 G' C( f K- ]9 A0 OIPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?
0 b1 f+ v& ?$ y R# G
' q2 C0 \6 o6 y6 @/ Y不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。
3 K" w! X1 |5 `8 O, L( X( _ z! K* b2 j0 g* ]/ r6 M. @5 y6 i/ E! V
自动配置 IPv6 防火墙示例脚本¶0 `) h6 K3 S% T2 x' n
与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。3 s" Q4 d% }2 t5 B p& K* D
, C: x1 M: k) H' x' O
#!/bin/bash9 g2 M2 A' [" p! h# G( T
IPT6="/sbin/ip6tables"
* M8 [( w1 u HPUBIF="eth1"1 m$ r9 k; h1 C9 I
echo "Starting IPv6 firewall..."
3 F; W/ ?( {. T% s9 Y0 J$IPT6 -F- Y+ D$ V2 n2 ~ m: ?
$IPT6 -X
, g3 b0 Z% Z! W. w% o$IPT6 -t mangle -F; G& ~$ s9 l: {5 q: ~0 O, m4 z
$IPT6 -t mangle -X: \: V0 a; L4 O! f1 u- x5 t7 i
! m+ c% v4 S# F
#unlimited access to loopback2 } ?& z; k4 U) F$ m/ h
$IPT6 -A INPUT -i lo -j ACCEPT' o0 b( u" X6 [
$IPT6 -A OUTPUT -o lo -j ACCEPT
0 {& [# z' R& N) x! A; L" h4 e
3 `0 p, A7 H8 [* N2 N7 y# DROP all incomming traffic/ _6 S% Y- Y n
$IPT6 -P INPUT DROP. E4 v# S, a0 }& p
$IPT6 -P OUTPUT DROP
) f# E! M' S8 K$ n) L# q$IPT6 -P FORWARD DROP
* \ ] r; Q" W1 w" }6 J+ z1 J9 A" T6 w2 L& [
# Allow full outgoing connection but no incomming stuff+ O7 [; w- n8 R( h
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT7 h0 {6 x5 ~& G# e
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
7 u4 g; @$ k9 J! V
; E) q( Q/ P: P _ L# allow incoming ICMP ping pong stuff: s3 V% t7 {( ]' w# o" p: a p9 I- D
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT& w0 o6 X8 F& I6 h
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT5 ]: d* L' V3 {- A: p. H) m* j
! W1 ^( N9 N" y; n! \8 y############# START 在下面添加上自己的特殊规则 ############
5 W1 g2 s4 v8 Y' i% ^- x8 h### open IPv6 port 80 ! i7 E; Z c& f
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
8 r% i$ J7 u7 h1 Z5 N: S### open IPv6 port 22: X3 Q$ t& R+ D+ {2 M: L6 s
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
~" {% H+ ~7 W3 }1 j### open IPv6 port 25
- h( A/ x4 z& K: ?#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT1 s: Y3 ?9 u+ ? S7 `4 h6 y; Y5 W$ l
############ END 自己特殊规则结束 ################
+ O6 b2 R8 n) |* i/ Z" g0 T( t
#### no need to edit below ###9 E% I0 K; s, U* C! F
# log everything else6 W5 h; Z1 `) B
$IPT6 -A INPUT -i $PUBIF -j LOG( a1 r/ i& a0 q: ?3 [
$IPT6 -A INPUT -i $PUBIF -j DROP |
|