|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
2 d+ q+ p A0 g6 ^" p$ z2 Z, X3 k7 v' U' a% g: _% y
在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:( w" V [6 v+ z$ g9 O
ip6tables -nL --line-numbers3 @9 o) U0 j: N: b/ b8 l e
6 q- q5 G: O/ I1 N$ {使用编辑器编辑 /etc/sysconfig/ip6tables 文件:0 S! r7 n. ? G/ G; x
& b1 {. O2 Z, F# l) v& j7 n; k: ]# vi /etc/sysconfig/ip6tables& q: G4 }7 ]: o8 s; P
可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)( v j3 a% z1 X$ U1 r* B r/ U
*filter
) P8 Z i" r e* z! S' Y( F; Y:INPUT ACCEPT [0:0]
) q1 t% z3 b/ ^# V9 o+ w3 I:FORWARD ACCEPT [0:0]( ?3 x* X, p9 F8 i
:OUTPUT ACCEPT [0:0]- z" f9 y% m) K2 M, y6 N7 V
:RH-Firewall-1-INPUT - [0:0]; g/ r: r! a1 N8 E/ v- ]/ F. B
-A INPUT -j RH-Firewall-1-INPUT
3 P, q, q6 b* _- m; v2 }( n-A FORWARD -j RH-Firewall-1-INPUT& U! y F6 U2 E
-A RH-Firewall-1-INPUT -i lo -j ACCEPT, E. S1 P- |% }8 `1 e( G
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT: Y- { i. A9 I3 |
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
/ e* S) \) t1 Z-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
/ z, R; L2 v& ~, x# ]-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT: z3 f5 v& }+ a3 v; O
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT1 u8 d) K; {' j
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
7 x+ H, K' c5 F' E( m0 U-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
4 g0 F1 o* Q$ c, W8 w. s- ~-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
6 k- c) ]# ^9 f9 I+ r" q+ B-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
$ W+ i$ v9 E; ~; i-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
8 K. s* L+ N% M" ZCOMMIT
+ C# z! ]! A* |% f, |! t& h5 [: L6 I与 IPv4 的 iptables 规则类似,但又不完全相同。
+ H% C" j: Y1 [" v0 W# \
) O, R( ]$ g- U5 ?/ J要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
W7 Z: Y/ r: y/ _7 \* P% ?7 n. f9 ]0 x
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT0 j6 I4 n. v- h; S
-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。! z$ K9 p) a/ [# z, X% o2 c0 d4 P& M
$ i7 H: _5 B& }: v" @
要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
' J0 M( C6 G/ m; ]4 C
& a; ?! X9 B1 j1 {. J* }, t+ B# A$ ]-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT Y) ~$ V1 _4 ]% n+ t, j! W, x2 j
-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
$ e3 C% U9 _ P: v+ y( N同时针对 tcp 和 udp 协议开启 53 端口。
. K2 `" R$ k0 e9 z, C/ t. X! Y" c* p/ H* k' k1 v" o
要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:; T; e! O' r* P7 O
! e8 B; o7 ^: i& S5 ^-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
5 J, d# a1 n7 D% f& b要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:, _, u' M9 W& ^
! D% z. {# F( T8 R! p( y: R; i-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
( A4 `. K- \1 S对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
3 S5 i0 e( X8 H! g9 |0 B) [4 h6 f( ?
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
% x9 f$ J5 o* @* i* Z1 WCOMMIT0 F% b+ l) m* d. l5 R( Q' d; T
改为:
! P" |6 O2 E0 B
, Y% t" C3 N- |7 j-A RH-Firewall-1-INPUT -j LOG, K- v1 E/ n* J. l4 f* b8 Q
-A RH-Firewall-1-INPUT -j DROP
9 v3 g3 Z( |# ~, SCOMMIT
/ S1 e+ r2 b1 H9 O' s7 x保存并关闭该文件。然后重新启动 ip6tables 防火墙:: P& A; a) Q; T1 X
5 e! S% \) W) Q" m$ E# l
# service ip6tables restart
7 R$ c- o9 \( T/ |然后重新查看 ip6tables 规则,可以看到如下所示的输出:3 |: ~. |1 v& N# h- z! b, x
- D7 F* r* o0 `: ]; L. |
# ip6tables -vnL --line-numbers! @1 F1 M: Q4 A1 k# b
输出示例:
, u& l) c3 ^0 l1 R( J/ _6 p
' N( e$ N) }* _* o* k% H1 HChain INPUT (policy ACCEPT 0 packets, 0 bytes)5 F- H& v1 e [
num pkts bytes target prot opt in out source destination
+ S G+ t' f$ l9 W: T" i1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
2 Q I* ]4 _" r" X) Q0 j( l, L. cChain FORWARD (policy ACCEPT 0 packets, 0 bytes)% `9 Z* R* n" m- E! V7 F1 p
num pkts bytes target prot opt in out source destination
* M8 r2 \* U% H( S0 z1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/04 V ~3 o5 T; r2 F( r1 H# ?5 p
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)! o6 P5 B% i; S
num pkts bytes target prot opt in out source destination* B7 g: `7 ~& J, T' f, |
Chain RH-Firewall-1-INPUT (2 references)
9 Y8 t% l6 r6 \4 }- m8 ?6 onum pkts bytes target prot opt in out source destination" | F- A) K8 p. S( p: W. M; m
1 6 656 ACCEPT all lo * ::/0 ::/0
9 q6 S) W# p+ U5 B" V4 N& p, U2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0
, X2 i/ Q* @; B; y. Z3 0 0 ACCEPT esp * * ::/0 ::/0
+ S/ e# _! S3 c g. B4 0 0 ACCEPT ah * * ::/0 ::/0
, P" C9 a% f. Q8 y. }2 B3 T5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:53536 m7 }; _/ v, r: t8 {( j; N
6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631
% J! l" N. S' N+ q7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631
+ H. b d# `. o. E' y& ^% E8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:610005 e4 I. w) n* ^* R/ O
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
8 ]2 N: {$ V# \2 d# Q5 T10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
/ U2 I1 M m; g/ ?9 L- e8 q11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80/ s- V" P: c- y" ?
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
7 q, n& N* l* o( D7 Z13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:539 G0 E& Z& |3 N: k. J" ]
14 18 4196 REJECT all * * ::/0 ::/0" `, K) f8 \( @( Z
IPv6 私有 IP¶
# I/ y! u; ]$ e. t3 m x5 bIPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?! v/ [4 N; E$ t( U+ {8 `
( r \5 u- K3 R9 t% Y
不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。
# @" H( b2 |" X, U, O
& _1 z( l" m O/ j3 A$ e( H自动配置 IPv6 防火墙示例脚本¶
) P6 Y1 [8 R+ ^0 M$ t与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。6 i/ G0 v2 K6 D, F, E, ]
1 d9 s! H- |$ F+ a3 Z- s$ v' l" ~, U
#!/bin/bash
Q; p! @2 L% @' cIPT6="/sbin/ip6tables"- p0 f" y9 F5 {" j) W' Z" O
PUBIF="eth1"6 i3 J+ ]! D; _8 S4 E1 ~
echo "Starting IPv6 firewall..."
" L6 [ Y/ j7 U2 ^% Z4 Z4 |0 ?# L2 I$IPT6 -F
4 k- \3 i7 j% |0 o: V$IPT6 -X
2 |' U. P+ T( W1 P) M9 `$IPT6 -t mangle -F
/ F) }) w. x) |+ k- u% R. N) O$IPT6 -t mangle -X
' v+ ^: f/ |# w6 G5 \* Z0 U$ f$ a' G- b D' Y9 N6 W" ?# E
#unlimited access to loopback T' l0 |0 j$ l6 @# c- m
$IPT6 -A INPUT -i lo -j ACCEPT
# o2 C2 K0 j7 |$IPT6 -A OUTPUT -o lo -j ACCEPT
4 D$ w, A+ }0 K
* f ~6 K" ?) ~# DROP all incomming traffic' P9 M2 n6 B( v& I; y9 W9 f
$IPT6 -P INPUT DROP& g3 U% j$ x' F* [- M) Q% I Z
$IPT6 -P OUTPUT DROP" m- H* m- P" A6 ?/ i- r
$IPT6 -P FORWARD DROP$ Y6 e- z. E9 x' z8 a N0 w
0 H3 I. O1 x7 A$ i( L# Allow full outgoing connection but no incomming stuff
, }4 S5 x9 }/ u1 ~- I$ w$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT& T9 [: `! j \2 v% i V! \
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT- b$ \& M" x+ \- `" i
. n1 Z$ O% C2 Y P/ I% k& F' b# allow incoming ICMP ping pong stuff
1 V3 A B( h, h$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT
% Z! |' ^- u D' C" w0 C$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT0 f9 G, J- v O; k0 c
/ x9 V/ v2 H; {0 z/ Q* w7 `& z
############# START 在下面添加上自己的特殊规则 ############( `6 T2 ^6 A5 e: J
### open IPv6 port 80
( M; r7 W5 g# A4 ^, S1 h#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT, M4 y% a# O) B( k' Z; r0 `
### open IPv6 port 22
! O! w' L# c' \4 Z9 P6 h& x) O/ @! {+ I#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
; a( P) C5 @4 T4 ^0 J* n- F( E### open IPv6 port 259 w2 ?7 _+ n q( b t$ x
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT( j' d( R0 p6 |* O
############ END 自己特殊规则结束 ################
* p% Q& @, s' \& p8 o" P2 {4 [' ]* \/ o4 ?+ O: V
#### no need to edit below ###0 d" g& m. F$ p7 e9 [
# log everything else: n6 J0 p) ]) y0 l, V% t
$IPT6 -A INPUT -i $PUBIF -j LOG1 [& \' ]. [$ e4 Z( t& W- C, l
$IPT6 -A INPUT -i $PUBIF -j DROP |
|