|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
" c+ u, @* \, Y5 c2 L' w5 e D$ \* t; T0 k( w7 G1 f/ N" G
在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:
* L0 p+ t, }9 @' ~ ip6tables -nL --line-numbers
6 o# {0 S; A7 O/ Q( X4 t6 s" E- f7 K
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:9 Z! [6 K4 l: E8 d5 L0 q2 Z; I
7 D' ^7 B( b3 x# vi /etc/sysconfig/ip6tables
9 R4 f" v8 n; T# D% w可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换): i/ p+ ^. e( `9 A, Y0 r
*filter
* J! k& u' p/ d( J:INPUT ACCEPT [0:0]
0 u3 u# M1 V, l. q; f6 u+ X2 x) d:FORWARD ACCEPT [0:0]
+ g, T% j; m4 c9 H" P S' P:OUTPUT ACCEPT [0:0]5 ]2 b# c2 M' G a
:RH-Firewall-1-INPUT - [0:0]* M9 S$ B6 |: D: H: r8 q
-A INPUT -j RH-Firewall-1-INPUT
$ Q0 b) a! ~+ i-A FORWARD -j RH-Firewall-1-INPUT! g# y' R; }3 }- H3 E! {- ~2 K, Y$ O
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
' l$ q4 i. \" p) ~$ y' D, @( Q-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT+ K" q& S! K/ _& ^: I6 g5 ~- x
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT( U! P; V! u( Y' q
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT, B' i; G* U9 j# w' }% ]
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT1 g P8 X |4 {0 u
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT8 _2 J% d7 T. B6 E! I; @5 e. O
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
8 o0 x9 Q: l! O5 ^! U-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT$ J3 n' k6 X. D3 z1 \+ \5 T+ N
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
* A2 G( f" _9 S2 @. `5 v; g* z' g-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT. W) B/ } v3 p* v3 V- g
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited; G { J! k+ c% b
COMMIT
5 _. `% T( H" W) R1 p; |与 IPv4 的 iptables 规则类似,但又不完全相同。
5 P( g Z! X$ p) J: K: v2 w/ z; _( g B D# s6 I7 z M* Q
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
! F& ^; c4 P8 I# r# w8 v% X" [8 w& L4 `
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
# }) T( }5 C* g# @; e4 i' _* f4 z-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。& n: m+ p7 I* `& R
{7 \& X4 p. ]/ ~! D要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
( I7 j) A$ N0 t; |) D* T) O3 e( i/ N8 h+ B0 c* K
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT) o/ s! A% t8 x
-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT: b& W% f" `+ ?7 W
同时针对 tcp 和 udp 协议开启 53 端口。+ |% Z5 n& ?2 r9 c+ _; M
' A. s% f6 L& V/ ~: @ c要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
* O, {0 |+ O: I3 d$ [" s* Q' t( J
( _& v3 _* p4 ~-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
/ K- }0 W5 T' y9 T' g要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
5 h5 T) W! s# F' B) k6 G. s5 z8 P7 R t
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT# k) e+ ?6 s V7 m
对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
9 [4 s" d+ Q' l$ u6 N' N
- Z0 t o; o2 b" I, |9 |( Y' i) Z-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
, }% F' s3 o+ d" e1 b+ r8 h9 ^4 w/ S2 WCOMMIT
6 T5 o7 H2 M( Q5 E5 y, f改为:
8 T4 F& r* w& s$ f4 j3 @+ b" M0 I/ v7 [& R* Z1 U# G8 x
-A RH-Firewall-1-INPUT -j LOG/ o% s1 L; m# l- T0 F1 t
-A RH-Firewall-1-INPUT -j DROP
7 z2 u& O( Q: f# _! H5 g0 \6 K8 kCOMMIT
7 v0 q0 ^) e/ l7 F9 @3 Z1 E保存并关闭该文件。然后重新启动 ip6tables 防火墙:" g( o$ S3 J* X( b. o& X
! c# O3 D3 P( }; x3 D
# service ip6tables restart
5 h0 q+ h$ H# ~% p然后重新查看 ip6tables 规则,可以看到如下所示的输出:
4 p4 ?, W, B3 \6 | Y( N, c3 S- S( z0 {5 d
# ip6tables -vnL --line-numbers, M1 }+ k/ W4 f
输出示例:! B( Z0 G( S& f! Q- r' n
; H+ }1 B& h: Q- [+ V2 C. PChain INPUT (policy ACCEPT 0 packets, 0 bytes)/ h) J5 l3 L* k- S3 J: Z
num pkts bytes target prot opt in out source destination
8 j" L: b5 h$ K9 n1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
8 @2 e7 g: p, a% o* mChain FORWARD (policy ACCEPT 0 packets, 0 bytes)* u7 d' Z: L' s. x- }
num pkts bytes target prot opt in out source destination
& H1 }: c0 U6 `6 l! ^6 f h* g" D% Y1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/09 b7 ~+ b; G9 h
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
' J3 v7 {/ x1 |9 ?# ?num pkts bytes target prot opt in out source destination% k2 z3 z1 o" C& I. k
Chain RH-Firewall-1-INPUT (2 references)' D; O R1 {% H7 C4 X9 H4 ~2 g/ k/ M
num pkts bytes target prot opt in out source destination# ?6 T; b9 K3 S0 Q
1 6 656 ACCEPT all lo * ::/0 ::/0" {- U( c8 e" ~, Y) [& a( S9 M4 p
2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0# H( i/ j3 L% s" V `4 ?+ w4 y
3 0 0 ACCEPT esp * * ::/0 ::/0 `5 ^; R+ ^, v, ?
4 0 0 ACCEPT ah * * ::/0 ::/0
0 B! t4 Q: ?# N' M9 H5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
. R0 |3 D. d9 M6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:6314 @; s) |) ]: Z( K/ f4 o$ }' \7 U
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631. Q* @, G' _1 w8 w& k
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:610006 c0 e& R- k7 r% T0 H! J7 G
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02# g, L, b0 M6 s1 b( V
10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
6 S. [$ N# H# h. U11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80
. s1 E+ F1 h5 K' p5 i, x12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:534 ?* d3 V7 I9 ]: E% W5 {
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
& K6 W3 o% C% {( \5 F14 18 4196 REJECT all * * ::/0 ::/0
7 V, b9 v+ y& DIPv6 私有 IP¶
1 t; k$ z3 M# [; \: kIPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?& L7 B3 d5 o% C2 S9 P
6 u0 D5 z. W) o5 C( a# i
不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。
2 K/ u) n: s8 h4 t: Z1 a& G' T' }/ b0 y# E. m' [" ]! c W
自动配置 IPv6 防火墙示例脚本¶
9 i8 M! _: o7 }与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。; ?0 X7 q/ y, ]/ I- ^) D. M
$ b# [- c3 a- U, B7 Z) ~- i4 ?- k
#!/bin/bash
9 o9 h% L! y! }4 @% Y; AIPT6="/sbin/ip6tables"
% R4 Z3 ~- e2 {# v& lPUBIF="eth1"
" v }; p8 C* k `# i5 Cecho "Starting IPv6 firewall..."6 R# Q; e0 U ?6 M; O; w! q6 ]
$IPT6 -F
8 o) j9 k+ y( G. h8 @5 k! O$IPT6 -X
3 i8 H: C& p% O( |, m6 z( T$IPT6 -t mangle -F" k0 `' Y3 i3 l) F c& L: s
$IPT6 -t mangle -X
, G/ p9 N! j" I h6 `5 q: Y/ V# P- W( ~ k) l1 W. m# @" T6 C
#unlimited access to loopback
3 I$ Z% Y- H* }& A; c$IPT6 -A INPUT -i lo -j ACCEPT
1 x/ ]8 M7 _, x+ S$IPT6 -A OUTPUT -o lo -j ACCEPT; p* U; }/ h# \# Y1 j8 y& `
# O6 g/ e/ e" p6 ]( u$ R$ b# DROP all incomming traffic* v- p# i3 O! j5 s7 d
$IPT6 -P INPUT DROP0 k) N4 Z7 J, q6 F* y
$IPT6 -P OUTPUT DROP
) a" Y% b4 Y+ q( Y2 F1 f0 k$IPT6 -P FORWARD DROP# v1 _/ @* c8 D5 S
5 @6 m$ \ W; W s5 q( Y
# Allow full outgoing connection but no incomming stuff3 t! l" B$ z7 E5 V( P
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
3 U0 o" Z4 q8 x: h: y! E4 H1 _$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
/ O0 K8 D% e2 O5 z: E8 D( R$ \3 @% J$ o( e0 N4 w; Y
# allow incoming ICMP ping pong stuff5 |6 }4 ?) Q) ~* c4 m* ^
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT; a7 U$ _8 B8 s
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT; ^9 g: f9 P! z, A9 p& M
; A5 J L9 U* T0 p
############# START 在下面添加上自己的特殊规则 ############
; [3 `4 E3 E# U/ Q+ P) z7 w$ i, _### open IPv6 port 80 2 c- D2 i% W5 v9 A
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT G1 `" u/ W/ `& s2 Z
### open IPv6 port 22
1 Y! ^# y/ s" I/ ]+ i#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT7 X9 X4 ~6 R6 F- B3 {1 n0 \5 H/ g$ k
### open IPv6 port 25
/ E( b9 } a2 }, Y& T#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT* d9 U, S+ F$ T0 g* s7 M8 w! ~# G
############ END 自己特殊规则结束 ################
: t4 M0 s8 A' g: r
9 z& p6 g9 P9 d#### no need to edit below ###
* w2 L" ~: r' m& P. f( x* h/ h T# log everything else
) V- `- y3 {6 ^4 b, G4 B+ ~$IPT6 -A INPUT -i $PUBIF -j LOG& z) }* P+ Y* n4 S6 `+ j! l
$IPT6 -A INPUT -i $PUBIF -j DROP |
|