|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。' c9 s% I$ C) A$ r5 M/ @2 t$ G
& w4 P8 F1 R7 S/ \* L在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:3 I) w8 a; _' E% _ b3 k* w
ip6tables -nL --line-numbers A3 f/ P% ?6 ~8 u& b, ^
2 c# |3 j: x1 ^& U" b
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
7 A, m* x* ]2 r% F9 c
- o+ d1 _( u. |6 W- A* _1 m% m$ j# vi /etc/sysconfig/ip6tables
7 h# T: |) \2 H% J% w可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)) K/ h# v/ I$ ]- L- H/ p2 a7 s
*filter
. g% i1 E" [- d0 A$ N; g:INPUT ACCEPT [0:0]
6 `$ ?$ g; K1 U6 S& w:FORWARD ACCEPT [0:0]6 T& m8 [ ?- j5 E4 ~* |/ ?
:OUTPUT ACCEPT [0:0]
' @# Z7 m* S% q( Y:RH-Firewall-1-INPUT - [0:0]
. `& F! p/ C, b1 \7 D7 n! m$ h-A INPUT -j RH-Firewall-1-INPUT
4 c% _; Z3 `: |3 V& Q-A FORWARD -j RH-Firewall-1-INPUT
7 r- F' C1 ^& @-A RH-Firewall-1-INPUT -i lo -j ACCEPT: W% B# m' Q8 {
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT! T& Y3 P$ H. e1 p- A6 t Z* h
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT7 f i+ Q5 s J J- X
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
$ c6 Q$ L# R9 p0 Y2 C-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT1 H! r$ T" I3 k; g# ?& ?, L. ~8 n
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT! v2 {; m2 j' f) \
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
: ?6 K5 ^3 J# S-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT0 E, I; ` W4 `6 E3 x0 a4 x9 Z" H
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT0 @* `3 l: J2 f# K( F8 B
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT) b$ l" I* Y+ P+ N S" z0 @
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited' {) R: V- D2 n$ k& c) Z4 ~( {
COMMIT1 r" ]$ A3 B* J5 G
与 IPv4 的 iptables 规则类似,但又不完全相同。
$ s# h( Z. y, B
1 F5 D2 Q4 N8 {5 O9 x- L要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:5 d) s: K# d: L$ O- J# U* W
5 `1 s3 Q: J+ ~) ^ \/ M2 S-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
/ K3 T" b( d& |4 G% w- E& d |-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。- s4 U2 f- v, k+ M% b4 _
% t( H; O: B/ [- y! i! W, r5 C7 m
要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
1 I9 U, I* q' c# `+ v; ?7 }" m$ y4 _6 p" }* }1 J
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT. S" d: F, X4 j( R
-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
~# s: D, F: R3 D$ y1 T1 t同时针对 tcp 和 udp 协议开启 53 端口。/ d) z7 g8 L6 v
7 K9 |5 }( {; n% m/ X要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
! Q8 [, y1 |; T5 `; d/ {! _# ~1 [" ?- g
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
$ e2 s' C8 q5 [0 y, e2 ]) T' d要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
7 P1 V, U) c2 N9 C! N' s$ C E& J3 x0 X+ T5 Y' f
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
0 y/ ?3 |+ u8 E8 G对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
! Y$ l% z$ b, p! Y: R2 p2 c. @+ h& ?/ u: X1 y" i4 t' F; z2 \$ x
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
, n+ j$ Y7 [: \7 ECOMMIT
7 f2 l' B- \5 b- ^! l2 C3 ~改为:
1 g0 M% s% H* }! B5 F
/ S- I" u4 p8 f4 G$ s1 u( o-A RH-Firewall-1-INPUT -j LOG
& e. R8 U0 Q5 ?2 q-A RH-Firewall-1-INPUT -j DROP
7 P, L) v1 ?* K/ ]; F5 rCOMMIT# c- O% F5 ^+ h/ j( k
保存并关闭该文件。然后重新启动 ip6tables 防火墙:" J8 A. d( d2 X. S
8 r0 W5 G' b) @2 [ n8 W# u
# service ip6tables restart
3 X5 r+ u/ u: E然后重新查看 ip6tables 规则,可以看到如下所示的输出: Z- t3 Y2 R) I$ K
0 `8 L5 \' c1 \3 v$ P+ k# @3 f# ip6tables -vnL --line-numbers
2 c5 z4 W1 d, {. [. Y输出示例:( J" k+ ?3 X+ l2 S) C( u
% U( U1 U0 {$ `) d7 \5 B7 CChain INPUT (policy ACCEPT 0 packets, 0 bytes)
2 O; e1 y+ A4 R knum pkts bytes target prot opt in out source destination" G( p, n0 K% s' k0 P
1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0$ D2 O, y4 W4 ]* I; w- l0 W( n. X
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
U1 _- \% H1 fnum pkts bytes target prot opt in out source destination
4 @. m. Q/ E. K# d7 d% m5 ^1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0( [5 E' K8 Q$ E3 o% ?7 t$ o
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes). D4 r* f! _# `' l
num pkts bytes target prot opt in out source destination6 Y" r/ |, t [/ a# W0 X7 W+ Z
Chain RH-Firewall-1-INPUT (2 references)
/ T$ }4 g- M: v* \num pkts bytes target prot opt in out source destination
* ] M7 s5 R+ h5 o1 6 656 ACCEPT all lo * ::/0 ::/0- C( G2 M; R! L, \$ x" m% G6 Z
2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/09 o8 x. x6 O0 D4 p- @
3 0 0 ACCEPT esp * * ::/0 ::/0, Q$ _/ s' ^. T8 _8 s; Z' H% c
4 0 0 ACCEPT ah * * ::/0 ::/0
' B9 I, q+ c8 x$ r( k" T# @5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
2 _1 l+ I, ]& F0 h3 p# W6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631 @( U' |7 V5 {* H! ]3 F
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631" I% X! V/ F3 M/ _& ~
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000
8 U8 ~6 M5 j4 H! h1 K. h9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
' g( `0 _- j, @3 u/ F10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
+ L$ j. R! t- t: J( x* ~0 [11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80
+ \9 j* M. L; k# [ j+ T* G12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:531 k s; _$ Q+ A9 r& @0 ]% T( f
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
8 J3 x7 S( l ]2 X& q1 M14 18 4196 REJECT all * * ::/0 ::/0
. h8 B7 a& o$ O9 `; ]$ O. MIPv6 私有 IP¶
3 _2 |! n" y; m# G+ F8 [- IIPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?' y1 k3 ^. Q- F. X1 c4 y& k. @
' [2 `3 v% i- Q8 c不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。7 `7 E1 A5 w ?
* K' y3 V8 R7 G6 V自动配置 IPv6 防火墙示例脚本¶
" Y: |2 z% R2 \) `. P与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。% S" O5 {. C0 V$ n2 x. X
8 r2 Z" V* A' l: l& F2 s
#!/bin/bash
% R5 ^( {5 u5 b# ?& Z( C: Z8 kIPT6="/sbin/ip6tables"+ ~/ ]$ Q7 K( f; @, I/ @
PUBIF="eth1"% u8 r+ n' h5 o" J0 w8 C. L3 q& M
echo "Starting IPv6 firewall..."2 Y, k9 b" ?7 C8 F
$IPT6 -F
6 t0 K4 k" D4 r; E w! q; P) k$IPT6 -X
" Z4 Q; k% O0 C8 E2 q; d: g$IPT6 -t mangle -F" z4 r0 H8 W; l1 z) {4 I
$IPT6 -t mangle -X
6 o% l7 F! i/ U9 f
- F6 A7 E4 Q3 R+ ?#unlimited access to loopback
! i* s, X1 Q8 f. N v$IPT6 -A INPUT -i lo -j ACCEPT; C: q; ]) O. _. {' [$ d
$IPT6 -A OUTPUT -o lo -j ACCEPT
/ X* W8 P: P3 [% w( }% O# {
# Q2 k4 I! g2 s1 G# DROP all incomming traffic5 Z, _1 G- H) d6 H9 i) h/ }, `
$IPT6 -P INPUT DROP- Q* f; g. L7 C c4 ]
$IPT6 -P OUTPUT DROP- ~5 c3 j" ]2 t3 E# n7 `# j
$IPT6 -P FORWARD DROP; R) ^/ S6 c. x A4 i
& t3 {0 k; g9 q" |
# Allow full outgoing connection but no incomming stuff! k9 l6 ^& h5 S) Q3 ]2 i6 m8 n
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
9 C. | Z/ L, ^" g$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT7 n: y6 o4 _# u2 P( r2 j
3 J1 h9 I2 t/ i# allow incoming ICMP ping pong stuff: g, n2 ~- p4 C0 \! w. K4 J
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT4 M1 j, z. X8 p; c1 D
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT% |; r( j1 ~. T1 X+ I; U
B5 N" N% X9 _/ ~( W; ?6 {: O2 L
############# START 在下面添加上自己的特殊规则 ############
/ Y# Y$ I0 T* d( M- X; _% N$ ?### open IPv6 port 80
3 f, j5 U) }* F; B; ~ Q#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
' _- h- p1 u& h L9 g9 q' U### open IPv6 port 22
5 ~/ i# K; S7 I, @! B0 [: j+ F: v#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT; W7 h$ s. j8 M4 j: Z! T& Y; z
### open IPv6 port 25
! B" p8 H7 v5 ^ U2 j#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT
W2 E% f8 i: U! ^) s- F: K' C% _: l############ END 自己特殊规则结束 ################
/ ?$ l! H- H1 n# g3 V" N9 I1 f& I4 P! s$ m
#### no need to edit below ###) i3 i( V7 S2 J2 b: L9 ]3 E
# log everything else
, J. E/ M# _8 N: @. n/ L2 ?. ~$IPT6 -A INPUT -i $PUBIF -j LOG. }2 Q; m% D) L0 \8 I) `
$IPT6 -A INPUT -i $PUBIF -j DROP |
|