|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。, y: J8 B! ~& }% A4 ] H* w4 l
% P+ V" @/ I5 B v" [# B! V5 K在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置: f0 [7 u, f; v2 H3 y( U
ip6tables -nL --line-numbers7 e8 k3 u* o1 S. j4 S
8 C, e5 I4 H" T* s5 u! y. z- n使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
/ w, l( V3 x' y3 F l. P. v, O8 c& E; M& N# s
# vi /etc/sysconfig/ip6tables7 }$ O1 L# s# N
可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)
4 r* R& u P; J( [; w, a r*filter- l6 ^* B! Q3 L* A
:INPUT ACCEPT [0:0] e# T( A1 U* ?8 T/ r4 _
:FORWARD ACCEPT [0:0]
' g7 B# v" K! Z' a4 \:OUTPUT ACCEPT [0:0]6 s9 Z" A+ V1 v' I$ `0 c* w
:RH-Firewall-1-INPUT - [0:0]
( i! O4 b$ e0 `4 O! v' {) i-A INPUT -j RH-Firewall-1-INPUT
/ ^7 o/ f. W$ S! c-A FORWARD -j RH-Firewall-1-INPUT2 k1 `6 B, U, V. h7 h
-A RH-Firewall-1-INPUT -i lo -j ACCEPT# ?7 ^2 x' N0 [: S9 D
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
v- Z* X& S# I, o9 j-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
) X* Y7 b9 r6 v: a8 |& s-A RH-Firewall-1-INPUT -p 51 -j ACCEPT* `# C& a9 n9 ^
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT7 @- ^" ^+ e, `5 D6 O
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT3 q, C8 U @. C6 S! B' {
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT9 @9 ~' q3 ^. j) L; j
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
: a- u# c' O6 i-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
2 B0 J# E% N. x-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT5 `, k# C* O: P F* W
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited9 ]! h/ e! T, Y& Y( Z4 ^
COMMIT0 Z6 K! g' ?- u1 V, l! G8 Y
与 IPv4 的 iptables 规则类似,但又不完全相同。
- b0 a# e, B* V* b n4 H' g) l* C+ R9 n! d: c5 n- ?
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
5 [6 c5 T$ z4 e7 N `7 b1 Z$ y5 G6 y: p5 T, K- u
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT' P5 d$ p9 k* q6 y+ j# C, e
-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。4 y1 n& H P: t) z3 d
$ f1 I3 B. p; z! _3 `# \
要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
) Q* x( A# w/ B8 A) Z! Y/ \% r& j8 x0 @
3 W/ ? i. W8 @4 g9 k" ?! a% v9 f-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT \: I+ W: a$ w
-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
3 q1 b3 o K; @同时针对 tcp 和 udp 协议开启 53 端口。- _) [; r8 q" W$ v
x5 y; u5 V) a% `要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
5 b, ~* F8 x0 c7 a4 ~, [! F. l& I7 l6 D4 m
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
3 y) R E6 n" t0 [ N9 [6 _, ~9 ]要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
- N6 n" n1 t. S" P( Z& L' ] V& h7 \ H) ?! u( |- [0 g
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT! T2 O$ M( f/ H9 u
对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:& v: S! |! @' C
( ?, {+ C6 K8 H
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
" d% ^4 A( P; o5 P1 T1 \COMMIT. I' C6 P6 \3 Z! _
改为:" l- b2 B. ?" |: e
! w- \0 J5 I! R6 C; k( v% B
-A RH-Firewall-1-INPUT -j LOG
9 h! s: ~6 D2 g Z2 g; Q% Z-A RH-Firewall-1-INPUT -j DROP; x4 H/ n. c/ z+ M
COMMIT
- F9 R1 V6 Z+ _3 R6 B保存并关闭该文件。然后重新启动 ip6tables 防火墙:* a: {" T8 X7 u) U& f2 J
0 D8 R2 }/ g. h6 M) r# service ip6tables restart0 L6 W, |( [+ D5 e& |3 v, i
然后重新查看 ip6tables 规则,可以看到如下所示的输出:
2 E$ t" h9 u R: E8 F% d7 y) a8 }! } d5 a# o
# ip6tables -vnL --line-numbers( w. w( |/ Z8 l8 t# ^1 e% b
输出示例:# ~) k" ^* F; W8 ]- v
* |- k/ _% m" I3 H9 m5 kChain INPUT (policy ACCEPT 0 packets, 0 bytes)
8 ~+ X; O% `% e# v( ]num pkts bytes target prot opt in out source destination3 C& d& ^/ O: D I' V( I* Y
1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0- @& C% L* M7 {* `* z( J
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
8 G G7 v$ L# lnum pkts bytes target prot opt in out source destination
3 r! ~3 t, S5 s* u8 }. h" A1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0
3 O/ W, i7 F: P$ m0 JChain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)5 h% U9 M6 F- I0 |
num pkts bytes target prot opt in out source destination
, Y# Q* @" |& W* CChain RH-Firewall-1-INPUT (2 references)
6 a+ X" b4 o8 Xnum pkts bytes target prot opt in out source destination% g+ r- V& G6 g2 ~" [( x# I
1 6 656 ACCEPT all lo * ::/0 ::/0
# ]7 o# X' h: u: B1 R2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/01 a+ r1 o6 t" i% @5 l% y4 F7 _
3 0 0 ACCEPT esp * * ::/0 ::/04 a* }+ D4 S/ C" a! A: t4 x5 P
4 0 0 ACCEPT ah * * ::/0 ::/06 ]( W" y. a8 f9 d* @
5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
; h+ A, @( e$ \6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631. Z- O- {4 n! R& q' _" @
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631. X8 F5 J1 a* W+ ]3 O6 s
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000
0 e* ?8 K2 Q" _+ g3 Z9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
^! v( I, }$ U1 A10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22" B, e% `) w0 Y+ N+ Z7 k
11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80
6 J$ `# G, z b4 S [12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
, Q, e& z, D* q" D13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:533 s3 s* q2 x! ^4 x& @
14 18 4196 REJECT all * * ::/0 ::/0
1 ~# C7 [9 T/ P& S( HIPv6 私有 IP¶; m* M* W" ~0 I0 Q6 x
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?4 ^5 r8 ?8 a0 C5 k" i' T
}0 I' ^/ e8 v) M
不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。
9 B4 B( j) A) z$ R: ^; K) k
. D# F K w: c* S& y- J自动配置 IPv6 防火墙示例脚本¶ }0 w) j$ Z7 H9 f# I
与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。) P( p8 }3 x7 s+ Z
9 W6 i a# r2 c) Q2 R5 r E#!/bin/bash: r2 ?% T) Y! ?) g9 n
IPT6="/sbin/ip6tables"8 s' T! J/ |8 t
PUBIF="eth1"
h. B2 t+ l5 u% [, d- x4 ^echo "Starting IPv6 firewall..."
# T4 k6 u: ^4 w$IPT6 -F: K4 e' |# U* P9 f' p! |* `
$IPT6 -X
' e& H: ?* j& G$ P1 \5 A4 h% m3 u$IPT6 -t mangle -F
5 l( _/ Q2 [( T, `$IPT6 -t mangle -X
G) a) u' L" v+ V! [: Y) X2 R/ j- L% p0 M; q0 E- u
#unlimited access to loopback
2 f9 R5 S* O* Q$IPT6 -A INPUT -i lo -j ACCEPT8 H& U: Y, C" I8 e
$IPT6 -A OUTPUT -o lo -j ACCEPT
) w1 c6 c0 u: l' ^5 E( P4 r
7 m7 a! T' c: s$ w5 ?# DROP all incomming traffic; F& a3 d/ D' E; c8 O
$IPT6 -P INPUT DROP
8 O. G8 Q9 w& K$ L6 {; t9 @$IPT6 -P OUTPUT DROP; p; l4 w4 e2 O* z4 K3 ]# A3 E
$IPT6 -P FORWARD DROP
1 x8 y3 c/ ? p5 p* p( u1 u4 g- ^- f! G
# Allow full outgoing connection but no incomming stuff
0 T( B T6 |( j! @1 `3 K8 V5 ]$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT, l0 \- |) p4 m! ?! y; Q
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT; K' ?* ^; q/ Z
# h( Z* L$ g' q9 o! x# allow incoming ICMP ping pong stuff
$ E0 z2 t% I8 L( X& y1 S/ @$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT& B# P% B! ^0 A& d
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT5 ?9 B; J6 R( |* O( Z& `, F* `7 m
/ a6 d# z( t- t7 E2 a6 x4 N& N: }
############# START 在下面添加上自己的特殊规则 ############
& i: C; {. ?7 O### open IPv6 port 80 . x) O, P! l9 }9 N* L+ N# m$ r
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
4 e* ~3 h B5 u### open IPv6 port 22
0 U6 x) v' q9 i' h: d& v, f" [#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT. f2 e, z. n5 w+ i
### open IPv6 port 25% c7 G* z8 o3 [7 } @1 O
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT
# j, K! z# ?3 U& V+ V. t############ END 自己特殊规则结束 ################
* A9 }: P& J8 ?) @2 P
% H. _. a$ c: m) G$ ^3 \/ v#### no need to edit below ###
: Y$ k4 [6 A! R) a2 w1 n# log everything else
. \& T [; T2 B- J4 y; w2 L$IPT6 -A INPUT -i $PUBIF -j LOG- t9 O3 f6 _! a# a5 K$ c( u4 a8 y
$IPT6 -A INPUT -i $PUBIF -j DROP |
|