|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。8 j8 M7 b- M$ l1 `; Z
! \! k; U2 x% ^在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:+ `% I( K3 J- ~2 i$ z" k
ip6tables -nL --line-numbers0 r. r1 r9 D. ^# x4 C4 U( c
6 {; C1 v3 Z3 x/ p5 Q& Y% D
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
E& p' W5 A. Y; t
7 D4 X s* ?4 R- D; r1 H# Y5 V# vi /etc/sysconfig/ip6tables7 C. ?& ^0 O, _- m
可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)7 z6 h( {3 r; Y( p* `9 e) h: n
*filter
1 s& J: Z/ ^- |+ h:INPUT ACCEPT [0:0]" f: \3 g5 `" M5 c9 A" E+ l
:FORWARD ACCEPT [0:0]
7 E2 m3 @6 q7 b* N8 _/ S:OUTPUT ACCEPT [0:0]
# {+ c6 F2 g7 W% I:RH-Firewall-1-INPUT - [0:0]
- t7 Q% s$ l* \+ V/ W-A INPUT -j RH-Firewall-1-INPUT
1 W; r+ |/ t, j2 k$ L-A FORWARD -j RH-Firewall-1-INPUT
) C1 N* m i& U2 ?% B5 @6 g-A RH-Firewall-1-INPUT -i lo -j ACCEPT. W) U- z( u' A1 W* t. z) O
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT& t7 q# j! [) O( K2 b
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
9 _ ~, q6 Y% T$ r: n' r5 E( t-A RH-Firewall-1-INPUT -p 51 -j ACCEPT7 G5 {( v" k3 T0 C- D- E
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT5 M K M4 p- K3 Z
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
- E4 \: F/ z) t6 G8 k* N7 { ]-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
; q* ^# t) @3 v-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT* c8 X% V! d0 V. h! ~
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT( }: o6 [3 A' U9 U6 l4 r
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
4 s- Q" G. r4 H, \-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited; s- T, @! z- E$ |! P9 T h0 d
COMMIT( @% m! u7 J. ]5 n! n! _
与 IPv4 的 iptables 规则类似,但又不完全相同。
; ]! n( u7 h3 j0 ]' Q5 Z1 X- l1 R1 K& }+ T
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:- ^+ C+ \' k$ Y1 `2 Y1 g8 O0 g1 K
! D0 s2 s9 r* }-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT$ I. |7 [/ g, `2 T
-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
2 T( T5 Y# _4 J+ M' @3 H2 ? u7 N# f% E: D: W* I5 c; \
要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:. j1 N: P, e, P* ~5 ]3 i
* V/ E0 j# ~: n% z& j
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
+ R- F- F$ a3 I; ~! A-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
+ j' X( E+ |% _- @4 l同时针对 tcp 和 udp 协议开启 53 端口。. Z B9 W+ z' x; E% x
x/ B+ |# b" L要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
* v3 e; z# }% _0 d
/ ]" R9 h% J, g# U5 {-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT% r4 J% p- T2 y [, |; Q
要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
. a4 R9 V1 {9 \( z: S; X; L: d$ }4 L. U$ t2 p- F# k
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT' ?* V/ ? J2 p$ f6 s/ B
对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
/ L9 l2 ~0 a& `: {" y0 u7 _5 |1 {2 h' |
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
5 ~& i0 j9 O6 O t# V& m0 Y% P( {8 [COMMIT8 C: F1 W$ o5 V2 ?" O$ B
改为:
0 x' w! ~2 t, V; O& @* t2 C; R
6 K% n9 ~- u0 v% t-A RH-Firewall-1-INPUT -j LOG
) p G3 G" c8 @3 u-A RH-Firewall-1-INPUT -j DROP
% L& `8 ?; S( r( ZCOMMIT
+ l$ k$ W/ @' B' B$ V4 ` b5 Y保存并关闭该文件。然后重新启动 ip6tables 防火墙:
8 _7 ^, Y, U- l3 T% N5 O" I" w, B% }) L" F8 w2 T \+ u
# service ip6tables restart5 f# ^6 O5 `9 q5 b6 f
然后重新查看 ip6tables 规则,可以看到如下所示的输出:3 w; G* s( |, K r& q- Z
$ r: D# M' v2 n# P& ]& R* C
# ip6tables -vnL --line-numbers8 T2 W1 g s& Y$ t# ]
输出示例:( N0 w& F; |6 W- l! @
8 n# p ^% E y, j' f' lChain INPUT (policy ACCEPT 0 packets, 0 bytes)
0 A% m- t* W3 p" pnum pkts bytes target prot opt in out source destination& G1 H9 q( m+ m) `
1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
3 q% i! i9 q* w0 i9 _Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
, f/ l7 a' ~8 a# V& dnum pkts bytes target prot opt in out source destination
! A6 I9 Y- W6 ]& W! R$ M& Z( @7 q1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/00 Y+ ~3 ~$ u/ S# C8 i: C+ W% [
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
3 h* z/ k4 |2 }7 Lnum pkts bytes target prot opt in out source destination
, ^, f/ x2 P3 \9 |Chain RH-Firewall-1-INPUT (2 references)
4 J8 ?2 E; e) v* n0 unum pkts bytes target prot opt in out source destination
, L5 H ?3 N. {1 6 656 ACCEPT all lo * ::/0 ::/0
, I2 V& q3 h4 ?- J& S2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0" L% C; W- b. h- P8 O; ^, R
3 0 0 ACCEPT esp * * ::/0 ::/0
+ |% V5 E' |$ Z* }9 G4 0 0 ACCEPT ah * * ::/0 ::/0
- ?' S6 T' h2 y* s( j5 X6 H c5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
# z8 D6 F4 k Q, s6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:6311 A k4 a5 `2 J d9 C4 V2 a
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631
U, c D* j% N L' t* D6 ~; ?8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000
1 j- z8 ]2 e7 ^1 F8 S$ C9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02& f2 q% k( F! `
10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22' I: v( e+ J8 S* }* e! s! I, i
11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80& ?0 @# v b0 n4 A5 A* W- L
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53& e( j' N9 ?9 ^- k
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
5 H" h$ _4 e: m+ d) r# m# S% q6 i: S14 18 4196 REJECT all * * ::/0 ::/0" y' R* G$ t0 C1 K. u- M7 g
IPv6 私有 IP¶
( l# Y! K- a( v( h9 |- WIPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?
5 h* [- g: v: K6 H& ]; Y% N" | }, l* d( i
不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。- j; U7 `4 t* ^! y
1 N- U! ^! K4 i自动配置 IPv6 防火墙示例脚本¶
% |1 _' Z! @$ n8 S0 s2 ~. R与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。' _& J& ?6 R! q8 {
+ L% k+ T4 q3 S0 G
#!/bin/bash, n2 P: u7 p0 ^5 V/ I; T1 Q7 b
IPT6="/sbin/ip6tables": C d# x0 n& t: [: _$ _+ O$ I
PUBIF="eth1"1 K2 U, T7 } _% C3 X& [/ a
echo "Starting IPv6 firewall..."
; @# r9 [7 q7 w) F0 q1 h$IPT6 -F
9 f0 ^& t2 p0 ]( C, ~$IPT6 -X6 R0 d. C6 e$ Q% s4 i6 c! q
$IPT6 -t mangle -F
1 ?" \/ V+ l8 J5 L3 {( r$IPT6 -t mangle -X
7 Y1 X( W9 C g/ d5 _% ]$ L( N! M2 \% F9 y' R# c$ C6 ]' v
#unlimited access to loopback& n7 V, e; A' u# W/ K6 t
$IPT6 -A INPUT -i lo -j ACCEPT, f+ _2 \/ Z; k
$IPT6 -A OUTPUT -o lo -j ACCEPT6 J" [/ p/ @! C3 e7 w
5 Y7 _' _7 J7 l$ I. ] `9 n- k4 E' `
# DROP all incomming traffic
- W# D% x. ?) _: n$ r$IPT6 -P INPUT DROP0 _! |! {, ~' |
$IPT6 -P OUTPUT DROP/ L y+ l3 @3 ?8 j
$IPT6 -P FORWARD DROP
$ W/ s7 N. Y6 w& e0 O0 x: G3 i! f0 p$ j( f
# Allow full outgoing connection but no incomming stuff g6 _- r' P6 ?' p. g/ c: e; ~
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
. O9 Z# |5 \9 g2 h/ g% F( L% g) K$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT7 e1 j5 |8 ^ V; |
% v2 ^$ N3 m' l
# allow incoming ICMP ping pong stuff
2 l& B) x$ [/ ]$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT. b; o1 I" v/ N# K
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT
: ]+ [9 i! F( E( B0 y# @* V- q$ t# |: C0 U* ?9 A
############# START 在下面添加上自己的特殊规则 ############
' A& V6 p3 o: _* |$ G1 W# z" [" V### open IPv6 port 80 2 I6 B+ i8 t, O' J* o% u
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
h+ U8 @( N" s; k8 [8 d### open IPv6 port 221 k; S! M3 M) n3 U. T) N7 `
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT W& d% b9 H9 d- p) |
### open IPv6 port 257 @# x8 a `# F: m" W
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT8 f- U) e' C) q' M, q
############ END 自己特殊规则结束 ################
; \0 R" e( A# e$ ?: Y4 W1 x- Z3 Q% ?% @$ k* s* m1 b( n. i. D
#### no need to edit below ###
! I+ X/ p. {5 j, s9 ^% n# log everything else
* V8 n' f1 A* b' N |$IPT6 -A INPUT -i $PUBIF -j LOG: @) N `- X# ?' C
$IPT6 -A INPUT -i $PUBIF -j DROP |
|