|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。# D2 l( J6 t$ i: _4 U+ ~
3 a9 H* O, @) U' d在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:
2 Z% o9 |% } l1 x9 T. V+ p! @ ip6tables -nL --line-numbers% E) G8 y4 k( }. I5 h3 H
6 l: R; e8 |: i n* ]/ `使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
, m6 F/ ^) S1 {5 h/ J# j/ t" q5 S
# vi /etc/sysconfig/ip6tables2 X. t& M8 L# I z4 R2 T) M
可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)
: m* t+ x& h: \/ g# e" m. x*filter
" p( n' {, s0 X:INPUT ACCEPT [0:0]
9 h F* i+ X- } {% E% h:FORWARD ACCEPT [0:0]: ^3 V# e' w- E$ w4 s [" U! p; @
:OUTPUT ACCEPT [0:0]
) J! j; @( c. [& c2 o:RH-Firewall-1-INPUT - [0:0]- u# J; X8 A3 o+ a2 w% A
-A INPUT -j RH-Firewall-1-INPUT" e. F! W; K W. h2 @8 Z+ f
-A FORWARD -j RH-Firewall-1-INPUT
. r; H% T8 o; `* x+ s6 x5 H# g-A RH-Firewall-1-INPUT -i lo -j ACCEPT
9 A: ]& N! ^; J" l" Q! d$ f-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT, D% g" s6 X8 J0 c5 N4 d
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT9 R C. b9 T1 p# ]( o$ S7 H& X
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT8 n/ O* n' @9 c
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
3 U- r3 Z3 d8 K- t! J" z. z-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
5 e! H7 {. d) Z5 J' S0 @7 R# d, E5 R-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT* W& T7 D! M& V" P- o6 |
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
% X2 }0 m, f) `0 C. b) X-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
4 H5 _5 ^* L! [/ ~. o" ~-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT- v0 f- p! C R8 C
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited: D5 `9 l3 m e" y( A; l% |
COMMIT
' B) Q2 W/ N: n与 IPv4 的 iptables 规则类似,但又不完全相同。
# ^ [2 U, O$ t( L* m4 h8 k! S2 ~- {+ s& V: a1 m9 R
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:$ V2 d3 R/ U; Q- ]$ V. w
7 \1 A- E8 D& F3 j% {. _2 T# |! [
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
) y5 z6 ]8 i4 K- S; l-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
2 K( q% j6 O; l, Y
: \: I9 k" E8 S; H5 w% r- y* I3 e要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:/ o/ Z. A; |$ `6 \
' ?$ U3 E5 H4 P
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT+ ]+ @0 d8 N% L4 T- \, V
-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT! x, ~$ x: g; P& ]4 c7 S5 x
同时针对 tcp 和 udp 协议开启 53 端口。( m$ `3 [ S$ t7 v
( J5 x: G9 W% Q要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:, w/ F2 ^% Y0 D+ z, x* y, q! v
" |- K9 T: x0 p- \-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
4 G; `5 Q) d7 |" U& M! r要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则: N! K% f* p% k1 {% ^( _; ~) Y
% K+ ] a* Y) k3 W d
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT9 K7 I0 d1 M1 ^ p
对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
5 @" l% V* p; {6 E8 O( q( y9 E! A8 j, G' N0 V$ d* v9 R/ _
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited; B# z) E( s. u) S1 Z% ]; T$ H" W; O
COMMIT
) B- O4 `$ I, W" G3 @( S改为:
0 V; d: J4 ~ B* M% X: n
& I6 I+ ?) {6 E t-A RH-Firewall-1-INPUT -j LOG
/ v s9 e( @9 F: J- }( F-A RH-Firewall-1-INPUT -j DROP
# H6 i S1 Z) [; eCOMMIT
! d4 W2 ~/ q0 Q4 [- z* n保存并关闭该文件。然后重新启动 ip6tables 防火墙:# K$ f) Z! a. S
`; G- K: B( b; I/ G8 v6 r# v1 J+ s" P$ O
# service ip6tables restart
% \6 E6 O/ G. P7 c% V然后重新查看 ip6tables 规则,可以看到如下所示的输出:3 M' Y( M* {0 Y, {( c
j! X- j& K* |. }# W0 g# ip6tables -vnL --line-numbers# t1 N( l+ i; l; c, U+ _; R
输出示例:
4 x' h3 ~" z2 G* t( f& V0 T5 A- P* z
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
5 A3 Z G1 J2 n/ T! mnum pkts bytes target prot opt in out source destination
9 P2 ~3 X5 o+ V q, z) Z; s9 [" w& `1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0; y0 y' \2 q4 i
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
- g+ l4 o: l; Q |7 O7 h6 |num pkts bytes target prot opt in out source destination* L! Q. t5 q$ I% W# R+ P' A
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0! H$ p* }0 u, ?
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
1 \/ T+ r* U& |0 v, i8 Nnum pkts bytes target prot opt in out source destination- G. V- ]- N* J2 W
Chain RH-Firewall-1-INPUT (2 references)+ M( P2 r! O6 h! J
num pkts bytes target prot opt in out source destination- X; R+ U4 a* s( W+ h
1 6 656 ACCEPT all lo * ::/0 ::/0
; S7 P2 V9 ~7 f& Z4 M' C2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0
) ?9 {. z2 y+ s0 H* O0 V* u; J3 0 0 ACCEPT esp * * ::/0 ::/0
2 m$ J: O" t$ Y& | Z4 0 0 ACCEPT ah * * ::/0 ::/06 O1 ~/ O; @. v- L% m6 F
5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
1 a2 G# h' w6 g) E6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631' C5 L: P* Y+ R% o: @3 @
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:6317 m }: S! b- d" l
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000
3 j& F h" j: t. ^$ l U9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
3 t9 c4 w8 Q5 {6 j4 r0 a% u* V10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
! D0 H; n' P# K# S& I, |11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80: s2 i y& B$ u# z9 ~
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53% O1 ~4 J' O, }% ^3 L
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53) H) R) Q7 t: f, \
14 18 4196 REJECT all * * ::/0 ::/03 |: U4 m# D8 T7 x$ {& K
IPv6 私有 IP¶
5 |5 \; g' ]1 B# ?) }IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?) k& \9 k- R7 I5 k# d/ R8 N
# l J4 z" L1 Q不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。: K7 D: \: O% O- H. w
0 c9 F! L; A# D3 Q
自动配置 IPv6 防火墙示例脚本¶ n$ F# D4 _! v7 F( @, X9 ?
与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。
( o: V9 v+ h& D+ i
; j0 w7 h: |' P* V; f9 }' g#!/bin/bash. B" o* U: M# {" x
IPT6="/sbin/ip6tables"! F$ p! Z2 Z. G: e! ^0 ]
PUBIF="eth1"
; z0 {* k- j* m; `echo "Starting IPv6 firewall...", J, x6 r$ u- z Z: F
$IPT6 -F7 |' c9 R1 W. c$ t0 y
$IPT6 -X
# u2 o) T$ s9 Q$IPT6 -t mangle -F
- s+ n0 S: ~- `* k. ~$IPT6 -t mangle -X6 I' b0 J6 g3 Y5 ]3 v* [; G9 f( r+ a7 B
; F; q' s% {9 {0 Y) S#unlimited access to loopback
; t% C( k" `1 k$IPT6 -A INPUT -i lo -j ACCEPT2 ]5 q# Z4 l8 ^
$IPT6 -A OUTPUT -o lo -j ACCEPT, ~! q2 Y$ H* K% [2 Y# [
3 O( p- h2 K# }3 Q; T" Y9 M( F
# DROP all incomming traffic
' S$ T/ t1 N2 w" h6 V1 |$IPT6 -P INPUT DROP5 S+ M. B6 K8 }& p2 O
$IPT6 -P OUTPUT DROP
k4 d- K9 `9 l# r9 Q# ?1 ?, p3 U/ f$IPT6 -P FORWARD DROP6 f! e; K/ ?, B0 T3 w2 q) \. p
: }7 s1 g; Y/ L- K; R2 o) P
# Allow full outgoing connection but no incomming stuff8 b$ m( m3 e9 d* n1 F
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT6 B* _5 {7 ~9 w) P! W: k4 \; y5 C0 b
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
7 h, o7 v1 B6 B/ I. }
6 I& m4 F! {( a5 }# }2 Y- N8 k0 h+ C# x# allow incoming ICMP ping pong stuff" l% Z9 n e' o
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT
! Z, W3 E0 v, D0 h1 P$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT" j! a1 [6 { c/ e
9 `; E# o( M! p n
############# START 在下面添加上自己的特殊规则 ############# Q9 t( }/ Z" s' a0 x. h3 b
### open IPv6 port 80 0 S+ q# ~% Z6 h: A, M- ?$ U* v9 _- A
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT( r+ M% X9 P* h& C$ H- I
### open IPv6 port 22
+ z# R- [! T$ R! s4 U" G; V#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
% I8 I* T1 U2 a5 f5 V### open IPv6 port 25: V" E( k5 ~/ {0 p9 s$ r& Y
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT! r8 q+ R3 z% k) I
############ END 自己特殊规则结束 ################
& V$ v6 j* p3 K; V4 M6 F1 y- P% s1 @& i1 ?4 [9 G, b; X `
#### no need to edit below ###6 I6 Q, ?$ I, R4 o
# log everything else
: ^, z7 D R# h$IPT6 -A INPUT -i $PUBIF -j LOG' M- Y! v0 k+ z# V& O" \( V
$IPT6 -A INPUT -i $PUBIF -j DROP |
|