|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
- |0 `7 c/ u; H% V1 E8 u) b+ J, d3 J" g+ [$ ?
在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:
. I2 f4 q& Y; M8 N ip6tables -nL --line-numbers3 E3 E5 @! S. Y/ C6 W
2 \, C2 C ~3 a2 H( |
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
9 p$ W$ q( Q! r. I2 s; g% \7 `+ d
# vi /etc/sysconfig/ip6tables A' E! B: d5 i* t. o
可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)
1 P$ |2 A7 Z% l& A*filter
2 i" ^) U4 p& e6 R2 ?! c- l8 { P:INPUT ACCEPT [0:0]
6 Y1 z" w$ Q; j6 k- R9 j; K:FORWARD ACCEPT [0:0]- T R% @7 I" J: R' {
:OUTPUT ACCEPT [0:0], t- x: o/ j7 X% |7 U8 u* j1 v
:RH-Firewall-1-INPUT - [0:0]& Z, ?2 G0 ^0 [# T1 i3 h/ o
-A INPUT -j RH-Firewall-1-INPUT3 a: T2 z" J& Q
-A FORWARD -j RH-Firewall-1-INPUT
) O+ V) n9 O5 I8 |. J/ }-A RH-Firewall-1-INPUT -i lo -j ACCEPT$ s* h ~7 d# Q4 F
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT* H T/ K+ K5 X+ e- o r: ]
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT& ?& R& `% H& J6 R3 c3 d; L) v
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
. Y1 i: x# P' k$ A0 N2 s-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
9 k* K9 M7 c0 U1 C) q }( w3 A+ B-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT1 q; P( G7 {7 Z# q6 Q
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT3 I4 t' m" m8 O5 c
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT3 J) ^' B* z3 }+ u; T! e
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT0 z5 l* F7 Z2 L* [/ ?- p3 m
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
& W' ]4 N/ y2 E2 ]( n- C2 L-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
$ f; m0 }( Y3 g* S# K2 ?COMMIT( x( v2 f+ Z. d( X% {
与 IPv4 的 iptables 规则类似,但又不完全相同。
y5 Z8 `& F# S R$ v" p. ]8 _. h% t8 L. m/ P! I( h# x
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
8 N- q% y, a; e* Q
: c# z( H" m; D' B) q# r-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT8 i4 E9 Y5 A7 L
-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。- j O! f4 J" w1 W% ? u2 w8 N" u* ]
5 u9 Y1 ~& C! O* ?5 r
要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:, W6 k+ @9 [1 n8 ]7 Z
/ @8 Y! E- @9 z-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT; d% Z5 {: m% l
-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
! r# e7 {$ |% a$ y同时针对 tcp 和 udp 协议开启 53 端口。
8 e, |' X5 S. A- f! J3 @% n5 L/ K, V" O) T4 u0 T) g4 _
要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
% G$ G6 L4 v8 \+ B, \# v
0 [, t. A/ _) w6 v-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT# q8 ?: ^, p# ~% j7 Y
要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:7 j' w8 Z' M* B$ W. f* `8 B5 I
3 u8 C# U& l, Q
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT) B2 h0 }2 S/ F: L/ ?: |
对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:5 `# }% ^$ g7 |% Y0 w- v. G
8 R' X8 B ^/ {-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
3 t8 B! r% ^. O- m# v& O9 hCOMMIT! H( G: e1 W' r: C/ z9 ]) ?2 D
改为:; ]0 h( f8 Y5 ^
- M$ S# v( } q
-A RH-Firewall-1-INPUT -j LOG. x/ w/ n* Q, _9 } _; r
-A RH-Firewall-1-INPUT -j DROP
! m1 _+ d8 x6 NCOMMIT
$ M6 ~) x# Q& D8 h6 k保存并关闭该文件。然后重新启动 ip6tables 防火墙:
' h! A# ?% q2 ~2 C9 x7 w `# O7 z9 @: X) b, A8 p2 ]& l. q
# service ip6tables restart) z F5 ^9 e- g1 l& z8 h4 L
然后重新查看 ip6tables 规则,可以看到如下所示的输出:
4 H1 _. s8 S3 F% } Y& y$ Y& r6 f' V. B- p# f
# ip6tables -vnL --line-numbers; I3 O9 W# J/ S( A* Y# f
输出示例:
* w( g0 S: e V/ O9 U9 {9 |( G6 \: E
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
! B& H# J) M( Mnum pkts bytes target prot opt in out source destination
p, |4 ^# t$ ]; S6 |5 R1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
6 k+ f) C3 k2 I- T) a9 u7 d% `9 UChain FORWARD (policy ACCEPT 0 packets, 0 bytes)
! X' P- M2 y/ K$ \# `9 x* inum pkts bytes target prot opt in out source destination4 x% j. z$ W0 h+ d- h+ _, o5 [
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0
! l" L* t0 S1 b* ]6 \5 DChain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
7 ^7 Y7 ]. ^2 j1 Mnum pkts bytes target prot opt in out source destination9 m9 H) e' v7 A2 Y2 `: n s& u, y- g$ d
Chain RH-Firewall-1-INPUT (2 references) U [+ j8 @, ~% y! Q: o7 `: _
num pkts bytes target prot opt in out source destination9 I, C2 X" l( ]3 L8 `
1 6 656 ACCEPT all lo * ::/0 ::/0
: U2 Q8 C& h3 z! O0 y2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0. x e9 u8 K& E+ p
3 0 0 ACCEPT esp * * ::/0 ::/09 v' T( S) O' w1 q- L4 @
4 0 0 ACCEPT ah * * ::/0 ::/02 a; m1 `0 m: I8 p+ \4 Q+ l
5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
( e0 e2 I( K; j$ K1 q' Q6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631; I6 L! ?9 l# L* N' J
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631
& O7 |# L* {. w& X6 A8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000) [$ S' n! Y6 I: u: F
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02' V+ a( p4 Q* B9 Z) t" |; g0 X! c N
10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
9 @' m$ [" z* K: D8 f11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:800 L" ^( p; e- t5 x# `# e* k
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
+ X+ }" _7 r" g) `& w- _13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:536 b! f+ T3 H r; S! a! ^9 m# R
14 18 4196 REJECT all * * ::/0 ::/0
$ p' ?# e8 x( ?0 Z P% iIPv6 私有 IP¶
: Q+ r% ^8 L5 W. g& `IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?! v$ h& n& K' o+ \7 C. q3 ~1 c3 c
8 h6 O- X3 s3 s: F不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。! Y, x7 J) `1 M+ z ]; u
# t' I/ @7 s, g4 O2 d' ?自动配置 IPv6 防火墙示例脚本¶
1 Z* C' w4 I$ U# A与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。
2 Q0 @4 }' l: Z* O
8 q7 H0 t# R5 x7 [. n#!/bin/bash a, E% E$ N+ S+ g
IPT6="/sbin/ip6tables"
7 S% b$ I- E( O2 v3 t) z. kPUBIF="eth1"0 n& D1 v* Z8 ^
echo "Starting IPv6 firewall..."
' O1 l5 ~& K* u- M. @$IPT6 -F
# M( N$ V4 ^) c1 |, f& d$IPT6 -X4 }( p+ D; Y1 l0 h
$IPT6 -t mangle -F
% P0 `5 I) B6 T7 l$ x2 n3 `$IPT6 -t mangle -X" r$ t$ H5 c! m% ]% U
& Y, ]% ]$ T2 f8 U: m7 l
#unlimited access to loopback
* \7 i$ A! G4 u$ H$IPT6 -A INPUT -i lo -j ACCEPT
0 U8 } S5 g% P3 m$IPT6 -A OUTPUT -o lo -j ACCEPT
9 N) f1 W4 f9 I0 X, V" O( x F/ ?* |7 X) k, e- s
# DROP all incomming traffic1 l" z5 r' @7 N6 j( ^9 i
$IPT6 -P INPUT DROP3 r9 [* v/ f$ ^" Q6 u8 S O
$IPT6 -P OUTPUT DROP; W! t8 H4 @9 B0 ]0 R/ {/ A% V8 B
$IPT6 -P FORWARD DROP4 ~1 t! U' X1 z5 ~
' } h. ~& W+ f" K3 [8 Z5 i
# Allow full outgoing connection but no incomming stuff# m& w6 g6 z* x1 P; [# S3 A
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT; }, k" f( |5 U3 |! J5 S, u6 V
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT$ K) z# v% c$ W! f6 @! V* D
, e% H, ]' x) ?- W# allow incoming ICMP ping pong stuff; a6 }! r5 T( }! z, b' |2 A0 Q
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT) a+ e4 W: d' B$ ~0 y1 ` u- W* q$ f
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT
6 Y5 f% @* [+ \# W; y8 L2 x, R. [3 h) `0 j- s
############# START 在下面添加上自己的特殊规则 ############; M3 I( v. r' y3 l6 }
### open IPv6 port 80 3 Q. @* n( |7 E: _; I4 {2 |4 a
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
% A1 w: P2 [3 g9 v: E1 P( u% O### open IPv6 port 228 |, r) S# B. P |
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
! E( c G: p; Y; }3 h' l### open IPv6 port 25: d$ n4 f+ S4 _' t; P, z( N. S: x7 q. p
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT
3 K3 G* H! Z/ Q3 C3 ^1 M############ END 自己特殊规则结束 ################, w- f# H' W5 k/ Z b0 Z! Y
1 z, q9 }7 q# _" b# \& j% \2 J#### no need to edit below ###
' t! f4 c# r9 w- ~) a" W* q- N# log everything else
5 O2 ]7 J) o2 M e" k) F7 f$IPT6 -A INPUT -i $PUBIF -j LOG
' [9 P5 A' A8 a% Q! k( [8 d6 J: X$IPT6 -A INPUT -i $PUBIF -j DROP |
|