|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
6 \. w4 D( r9 j U! t
+ Y8 k* w M; J) ]0 ]+ X/ z在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:
1 q$ h. N! j% ~. W$ P+ l ip6tables -nL --line-numbers j1 \$ ~9 |4 `
& y, T. c; H2 C2 C; `使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
1 W/ ]; v* [7 I6 ^0 Q$ U" D5 f3 Y! G# [
# vi /etc/sysconfig/ip6tables
0 b* S$ H/ e2 B# }1 z; t/ c; K可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)( }9 A: ?, V' |2 B R$ T
*filter
( r4 k/ a2 Q9 \: ?:INPUT ACCEPT [0:0]7 n- n. e2 `- |, N: Q3 C
:FORWARD ACCEPT [0:0]
8 X$ ^; \. L- Y:OUTPUT ACCEPT [0:0]
, ^" ~0 M7 w( x! L) a:RH-Firewall-1-INPUT - [0:0]
! P2 H" p1 ^$ |+ R/ x! o-A INPUT -j RH-Firewall-1-INPUT; G8 {1 U V9 @/ j0 P3 S
-A FORWARD -j RH-Firewall-1-INPUT
% U' m4 r! q1 P7 s-A RH-Firewall-1-INPUT -i lo -j ACCEPT& K; E* C, X C1 D7 z& k4 [8 x
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT1 ]; E: ~/ C! L9 o `3 H, ?
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
' p; @" f% i! B! z# Y3 q" g! f-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
- t% p% S9 h! Y" x3 S( t3 R-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT2 B9 a! j( n. u6 Y6 o" r
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
$ f2 B, V8 T, H' ?8 X-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT: E, M/ S0 E; L8 t9 R8 ~
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
* S! X, u; t8 S- ^4 }6 _-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT/ U6 b: p+ U! ?( T% w% j- x
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
2 t2 r3 a3 w$ {( ?. @! f- E& F-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited) P0 Y2 ` \6 }3 U2 o) B6 ?
COMMIT
3 ]7 D9 |& l- b1 n: o9 h与 IPv4 的 iptables 规则类似,但又不完全相同。" M; H K# |) E7 ?8 x' f$ I* J
/ ^! J7 [' G' P
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
4 y5 b( f" m: R: H. J
+ W H# U: K' r6 B6 B5 H) _# ]-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
m1 z' c4 y: _-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
9 f4 E8 t" R- Y, ~# y* Z; M4 c7 m Y* d; q0 J3 D: D/ ^' q$ ]
要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
: N' o& i9 L- l' b. N$ _) B
" t6 ^* i5 W' C% {7 g. O-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
* `" O/ B' h! m+ T-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT2 J& F9 R2 f/ g! Q8 t- P. Z9 a
同时针对 tcp 和 udp 协议开启 53 端口。
7 l3 [0 D6 _# w- _. a, }+ o' m9 L, W) \) ]! v
要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
& W( l! f9 q. J% y- d( Z
/ n: E; @' Q: F9 y9 M-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT" J( [" ~: \+ R o. ~: ~: g) H. ~
要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
$ t) u+ S5 D5 e4 d
/ `$ M% D% {; I) w r. z-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
- s0 k: }1 D4 y4 q; _- w对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
1 G9 q0 u! m, S5 z5 W& o. u& E) a c
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
8 G& X4 `: ]9 O) q" ?/ |COMMIT! l) i* X5 ?6 a T1 C! Y2 |5 |2 h& e
改为:3 A5 v4 C( r2 G2 _0 t
0 ~" v7 f( c, i2 M# o u-A RH-Firewall-1-INPUT -j LOG$ h$ \! n! v1 y: p, w$ I7 y, ]/ M
-A RH-Firewall-1-INPUT -j DROP
6 }# \8 d3 N% U3 W/ lCOMMIT
) w# E% \6 F9 ^8 d0 }9 N8 [保存并关闭该文件。然后重新启动 ip6tables 防火墙:
$ O/ D/ r# N0 e) Q: M& y6 ?
) E7 m6 `. G- D# service ip6tables restart
% n3 V4 W+ h3 Z+ f1 o$ J$ A然后重新查看 ip6tables 规则,可以看到如下所示的输出:
: _4 {" y F. s- k% |6 y3 S& I: R Q" v# C# x
# ip6tables -vnL --line-numbers
8 N( p+ \, D# }6 E. Q% a7 T输出示例:/ C5 G: q2 r5 V( H3 ]. s' i) ^. g4 |
3 U* W; U% l$ O9 lChain INPUT (policy ACCEPT 0 packets, 0 bytes)8 v* Q2 h3 `$ d# h! U" r! I$ `) K
num pkts bytes target prot opt in out source destination- m0 u: e$ I0 K& B/ X" g6 v' [' Y; A+ X
1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
, J8 {* Y) P% L# r+ U6 ]8 XChain FORWARD (policy ACCEPT 0 packets, 0 bytes)2 O; E( L+ b# I# H, m9 |
num pkts bytes target prot opt in out source destination W/ C5 Q4 j/ O
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0
# r+ l- Z4 S. P$ kChain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)& [1 O2 F% K! t6 R- V8 {
num pkts bytes target prot opt in out source destination
7 e3 f+ E& n5 `/ kChain RH-Firewall-1-INPUT (2 references)
( v- r! n. S% [, }; D; s* Ynum pkts bytes target prot opt in out source destination
! o; h9 r" v( G- F+ `+ I" ^ k) {$ O' B1 6 656 ACCEPT all lo * ::/0 ::/0- s0 u% Z. a' } t U; b
2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0
! p- @: D8 x5 T$ E3 0 0 ACCEPT esp * * ::/0 ::/0
3 K8 v& m' n+ o9 j1 Q4 0 0 ACCEPT ah * * ::/0 ::/02 b/ i/ ~2 i; r" E& A2 g b
5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353* y' V1 J5 Y: b9 F' _
6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631: k9 x( ^. y, ?! y6 U/ B# j+ ?
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631, d3 m S# @5 I9 v! a
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000
) E+ v' E* q6 f9 H e4 M9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02: q2 T7 ~1 M/ R' Z& f2 A9 R
10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
1 r. z1 u4 y0 U7 n, {11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80
2 n$ n5 j( j6 Y2 L12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53% R! z, }* P" n" G% L" `
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53- P/ E5 s, H8 u5 ~# q& _7 B
14 18 4196 REJECT all * * ::/0 ::/0
' z$ P- x* l0 A0 V5 S" E8 CIPv6 私有 IP¶7 p4 R% o7 @+ \5 D) }' [" F
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?
4 d& m2 K0 ~9 h, n- Q7 O+ e: G
不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。. M6 r: u3 ~& h/ y) w" r
" r- I: |/ ~* j& J/ H. `3 {, }自动配置 IPv6 防火墙示例脚本¶4 M$ {1 ?2 e! k+ h
与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。
2 G2 |; l' [ k2 Y, N- F. M/ Q8 P% c; b7 U; Z7 ]) N4 A$ y; o
#!/bin/bash
! }/ p }6 K8 _" |8 sIPT6="/sbin/ip6tables"
9 V* a$ L: O: B: l. c: }PUBIF="eth1"
' x4 ?8 r. G8 n) K* g1 _- H' fecho "Starting IPv6 firewall..."
k: i1 K/ k' p$ c5 C* b$IPT6 -F1 o% _: S- H" X1 u* y, H
$IPT6 -X
3 }( N: M& [ y2 S9 T$IPT6 -t mangle -F6 D+ x. ]' [- L0 N" J& q
$IPT6 -t mangle -X* p8 ^) J3 F0 i) V
' x$ H- }8 F9 {' h! g- F& a#unlimited access to loopback
' \" N' Q" j+ Q* V$IPT6 -A INPUT -i lo -j ACCEPT `+ R" H; m6 b9 n6 @/ b7 `
$IPT6 -A OUTPUT -o lo -j ACCEPT; l/ g n2 ` _) B [4 q
" l, P {1 n: d; G6 s# DROP all incomming traffic# r8 i4 b: ?6 x @! Z. X# g) i3 F. ~
$IPT6 -P INPUT DROP/ P# h9 O6 K" t. e4 C
$IPT6 -P OUTPUT DROP) ]: B5 e: N2 C3 B S0 Z7 x1 i
$IPT6 -P FORWARD DROP
: C0 l$ R C: D- p; t( b4 B/ V. j' i$ C1 ~+ M3 A/ e- C
# Allow full outgoing connection but no incomming stuff" l/ z- w% t, Z/ a0 t
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT1 m l, G6 P7 y( S4 i
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
4 ^ h5 K! i7 I+ N9 O5 e
3 I) Q. n! _, w8 ]2 h" _( {# allow incoming ICMP ping pong stuff
( D2 i6 N: q& I/ n' s j$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT* _: N' Q0 {) I2 ]' Y: r
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT i7 G; c* H* ~1 F2 k% \5 ]) b& j
& @, p V- S9 Q; q8 X6 e8 s9 g% p# f7 I############# START 在下面添加上自己的特殊规则 ############' @5 H. X/ }6 p3 W& T3 ~
### open IPv6 port 80
9 T% U; R5 L4 K# X2 |, B#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
! N: P v% R1 a) Z! V. F7 F### open IPv6 port 22
+ |% H( G% U8 k: s/ {7 ?% _#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
1 Y! i1 j+ T7 t1 ^9 r* q9 h### open IPv6 port 250 r* ?& ]* l. ~. v( [0 V+ a" n$ l
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT
/ D9 `0 _0 T* H' r+ ]9 e1 I############ END 自己特殊规则结束 ################4 o2 H( ]: O. k! y% M! c4 ?1 K5 \
) ]* n4 P( Z3 f' E, G#### no need to edit below ### E/ P9 {" w9 I. j
# log everything else
' d( ?+ o; y5 q; `- Z, ~( g0 ~$IPT6 -A INPUT -i $PUBIF -j LOG/ ?2 `" k0 ?" U/ `2 O
$IPT6 -A INPUT -i $PUBIF -j DROP |
|