|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
- |: H4 Z" J% S- r1 ^; o
+ [$ P3 c4 q$ ]& }; V& J4 s" q$ E在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:) c. A, c% [: Y @! T
ip6tables -nL --line-numbers
; I: u- l" B, X0 U
* u4 N' Q* u2 b. g, m使用编辑器编辑 /etc/sysconfig/ip6tables 文件:; C% a! S+ E' y/ Y4 Q
: q" X& Y. T! y, b. i0 W) |+ J
# vi /etc/sysconfig/ip6tables. o9 Q* W+ K; \/ F- k' f. F
可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)
4 U. ^/ i- T! \9 v; d0 Q. y3 o5 O*filter% D* y6 \7 y0 y' x, K
:INPUT ACCEPT [0:0]1 V4 ~2 i* C9 b& `( I3 z& N$ o1 z
:FORWARD ACCEPT [0:0]
2 ]1 k/ _: F/ ]5 A+ |: y+ @& l:OUTPUT ACCEPT [0:0]+ |, G5 t8 @: d0 J: ]+ t( F8 O" g
:RH-Firewall-1-INPUT - [0:0]
- A+ t1 O0 B8 @2 m$ Q6 e$ \-A INPUT -j RH-Firewall-1-INPUT0 R! O) V0 N! X: N1 p( Q& I
-A FORWARD -j RH-Firewall-1-INPUT
6 I1 R L) @: y-A RH-Firewall-1-INPUT -i lo -j ACCEPT
7 `; C! W8 }! E0 l2 Q-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
- R' [' n1 s* G: W-A RH-Firewall-1-INPUT -p 50 -j ACCEPT9 b. Z& e- i6 t" O9 x
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT9 _4 B1 a" {' E0 J& @' n
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
2 r" c& R" c/ ]! o7 O: b0 D-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT/ F5 H. z( ]4 b6 d6 e0 r a
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT6 F7 J% q! c2 N( d5 F; G- ^
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
' c" n+ D' n+ n/ Y-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
/ |; Z. U R( Q# X% l8 ?-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT4 c d' k0 @8 C8 L4 w
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited8 N3 t. W+ l" N1 ]' v4 j" G
COMMIT" }/ x; _' n& W
与 IPv4 的 iptables 规则类似,但又不完全相同。
/ B4 X' F/ s4 t& R* L- D
: J; a" T& E$ @7 a; M: E& j& X要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:. k: M- w+ h* X& W+ ?
3 U7 x4 n* e, C; f9 I-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
; e5 z" l/ j$ G5 i* q2 A# k1 @5 Q-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
2 O' @3 ~, q: k3 N8 A) s( |; J
1 h. O5 k7 Q. f- b+ I1 c要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
- j6 J* D8 r- [2 i9 c0 P$ b9 j- H, j* F. Q& S2 e0 t2 `8 ^
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT$ w4 n* [0 r$ X3 h% J
-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT. X' i; v [: |( a3 m; `( g
同时针对 tcp 和 udp 协议开启 53 端口。
* O- d1 _1 f; `
* b5 b) m2 H) G" r8 [要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
+ \# e" ^1 u7 C9 s6 E2 G: a, M' l9 Y
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT/ Q! e( z! H6 i3 n4 ^0 D
要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
$ S4 K# `* ]5 Q a4 ]1 R1 `) C
% P& r' W4 L3 o-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
0 N7 l# h b' X5 }, q对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:7 j+ Y- B; w, E5 `
" [$ L3 z% ?- r- G* o( C, ?
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited( `. m, B6 V6 i; w2 U
COMMIT
2 y! U( S1 h( [. _2 D9 M/ `5 B$ \改为:
c: h* j8 q* O$ f1 |2 X' n ]7 a C: C4 j# y* b9 G9 Q
-A RH-Firewall-1-INPUT -j LOG
( g" P& j$ G! j$ s4 ^3 `-A RH-Firewall-1-INPUT -j DROP( ]* C/ Y2 L7 i$ n. [; ~/ m8 c9 c
COMMIT! e+ v; h' \# s3 d$ l6 O
保存并关闭该文件。然后重新启动 ip6tables 防火墙:2 \" K2 G T+ M- J1 c5 A6 `( B# H" n
5 ? a! w( h& ^ k3 X G6 G5 c
# service ip6tables restart' I" z; L, W9 t: F8 T
然后重新查看 ip6tables 规则,可以看到如下所示的输出:1 ]- z; r0 @+ v) [
- ~8 p! T( K) g$ d9 Q# ip6tables -vnL --line-numbers
# R; E" J( X1 U$ M+ ^7 H9 Q输出示例:
6 [% i3 t) S' i) Q+ i4 ^4 A) J, J
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) F" ]! _! n, y8 a/ M, Q2 Q
num pkts bytes target prot opt in out source destination
5 x9 q$ _. z* O1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/07 G" R1 o9 }: a. j7 _9 Y. R+ u( {
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)7 d/ A( b- s3 \! U$ `4 D7 x
num pkts bytes target prot opt in out source destination" @! Y: N/ \" S( i
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0
% O8 `0 ~: J: L/ b" {) o |Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
R+ P4 [4 L6 Snum pkts bytes target prot opt in out source destination
; C/ [# b( b3 `2 d( t: zChain RH-Firewall-1-INPUT (2 references)
+ v; y4 H4 ?! u* N nnum pkts bytes target prot opt in out source destination
# D/ C! v% L' A$ F% V5 t* @9 [1 6 656 ACCEPT all lo * ::/0 ::/03 N' D6 y" @* o6 @# q8 _
2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0" {4 r, p8 j% g9 l& k3 W
3 0 0 ACCEPT esp * * ::/0 ::/08 A' r; p' O4 ~$ J- e+ W
4 0 0 ACCEPT ah * * ::/0 ::/0: {, v1 I) x3 W4 R
5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
1 O8 n$ K K/ C/ ]. D. F9 r6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631
6 Q6 B& D) }/ k7 z& G7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631; R0 B. v: m# V
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:610000 |: W+ L! s, R! O$ _3 G
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
4 Q. G/ ?& O8 r: O; l" _5 N10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
% b! Z$ c' d! {" W1 e11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80# o' W& B, D8 \; r+ v
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
* w, n; D, F+ ]: K/ t6 Q& t$ r13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
* w+ w2 ]- W3 o" Q+ k( A+ h# Q14 18 4196 REJECT all * * ::/0 ::/0
. v. `1 g. }2 d' ?# [IPv6 私有 IP¶
; \8 V1 S* q+ M+ \IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?
# l9 i( d: w8 R" |( v- o0 t- C5 V. G5 e! I$ |/ M T# J% V
不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。
. \8 R q9 Z; _% y" W! H7 z
: I7 e9 y5 U- L自动配置 IPv6 防火墙示例脚本¶: s8 X4 x# Z- y5 |/ `2 F R( L. P" C
与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。! x' w1 c a8 C% @: }
# E. M# \. Q$ N1 n; y#!/bin/bash
* m' A* ?8 C1 aIPT6="/sbin/ip6tables"
' R2 G0 b% A; {" T) F# ]PUBIF="eth1"
4 R" }( Z& B4 V1 v+ Eecho "Starting IPv6 firewall..."' T2 g7 A5 N+ Z7 I. W3 h5 X4 C
$IPT6 -F0 B1 U; |0 W7 i1 b% t9 N
$IPT6 -X+ `9 S! h$ z1 `8 q& k; J: u& S: R& l0 a$ h
$IPT6 -t mangle -F* e! H6 M- [, m( D
$IPT6 -t mangle -X
8 g" Z+ ]* s6 I& X# r+ K/ k6 _9 z2 i8 W8 `
#unlimited access to loopback
! Z% I0 C ^" Y9 h; f! w& b$IPT6 -A INPUT -i lo -j ACCEPT
: p& Q8 o6 s/ A% W$IPT6 -A OUTPUT -o lo -j ACCEPT# ]9 z: y4 F' F: X
1 M4 K. L- F" d% v, c# DROP all incomming traffic1 v8 q- }8 W; B3 a
$IPT6 -P INPUT DROP$ B* B2 x$ k9 Q( y
$IPT6 -P OUTPUT DROP
( S! s; e1 x6 E" T9 n0 l; r$IPT6 -P FORWARD DROP
: V* O- A0 a9 e
' @3 P! d. I8 N# Allow full outgoing connection but no incomming stuff: C- f% q3 B/ v4 \
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
. h/ b. {; r& b8 v) b- d$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
; ?* e2 R; m7 i2 A5 V2 @/ A9 w' i5 ^) g t- x* S
# allow incoming ICMP ping pong stuff" g0 A2 F" n s
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT0 Z8 y- g1 Z6 M: N8 L$ p* y5 p
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT) Z r! n4 I( J. \
1 `) s3 Z) Y d+ G/ t############# START 在下面添加上自己的特殊规则 ############: p2 T5 D% |$ c+ M' e" E* d" I
### open IPv6 port 80 0 u: |% E8 o4 D* H
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
; m3 s ^/ i0 M. i0 ?7 S### open IPv6 port 22
2 }3 g% x$ b8 a2 T! v9 K3 k#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT' a( L1 D; }) X& ^9 O
### open IPv6 port 25. B4 ^* f. n; k6 [# \6 k
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT
4 a9 h' W; s7 _: L) T" R: ]% B############ END 自己特殊规则结束 ################6 f: Q/ w( z! \6 G9 {& @
3 y. h1 A, W) i% L n% c3 u#### no need to edit below ###
$ S) C3 M; w8 L7 r& y# log everything else
& C/ c. f) k6 ?- C$IPT6 -A INPUT -i $PUBIF -j LOG6 ~0 I( ?* C7 g
$IPT6 -A INPUT -i $PUBIF -j DROP |
|