|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。, L6 m# V% w; N, z8 h6 |
& r6 I; Y8 L4 o2 i
在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:
7 |! ]5 Y- y" ~* ?5 b; w0 i0 j% c ip6tables -nL --line-numbers9 c( L6 ~( `6 U# Y* ~' B: D
- y1 i% l7 H1 b+ ~
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:) B7 @5 @7 z- s( \, r0 @$ [7 b( F
0 ]7 q- P$ X0 ]# Y- Z# vi /etc/sysconfig/ip6tables* P b( _6 }/ }/ ?
可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)6 i" d# o8 G/ t+ g0 [( R
*filter
) h3 q# o( k- p \3 }:INPUT ACCEPT [0:0], R7 o0 m1 B7 ?$ V! z
:FORWARD ACCEPT [0:0]" e) \) C$ g: K5 X0 Y
:OUTPUT ACCEPT [0:0]; p) A! A3 P+ }$ F$ ?6 r; l3 ]
:RH-Firewall-1-INPUT - [0:0]( P+ C/ z! L4 k. o5 h8 l7 Z
-A INPUT -j RH-Firewall-1-INPUT2 X: A8 j# T( L3 M: A% S2 q
-A FORWARD -j RH-Firewall-1-INPUT
$ q7 [4 @& P2 M: P! L- ?; F-A RH-Firewall-1-INPUT -i lo -j ACCEPT
+ j. a/ u. V! Z3 Q-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT7 @4 \9 K" w% s, u" E4 V# a
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
. W; W0 ]' \4 T; \5 t-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
+ m" C. H6 o1 i/ ?: ?-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
/ K. p% \6 T4 \9 {4 A. Y-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT k! J: i" Z3 X3 }, g, j4 a- U# y6 d w
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT# ^1 Z6 T$ r/ y* I
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT3 n' @; @5 }) H5 u( E$ R. E
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
6 A& J9 m( \. ^3 B: p- ?2 } L( t-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT0 S/ @: k8 f; U, B& J. X1 ?
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited L" N2 |9 I: N; D
COMMIT( J4 m2 o2 C* k1 d
与 IPv4 的 iptables 规则类似,但又不完全相同。
& H9 s+ M/ R! U9 y# N+ p* u# v2 l ?: R7 ]$ a v& p, c( P
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
6 q: Q! X% g9 \* d6 P1 W5 M* ]2 f( z3 N: {5 K t
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
, s* b+ Q9 ]$ z3 _- H* ~-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。2 v& v: g/ ?6 E; ]! X
! u" G( y0 J5 ]. t3 Y要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:# f9 I* l U( {+ O2 f8 U
$ Q4 f f( F, Q6 ^1 h, K; [. D: B! j
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT" m! }" S1 Z& f7 e6 I# Q7 G6 f
-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
: p# S1 J# ~: Q: P同时针对 tcp 和 udp 协议开启 53 端口。! _, v" L! l: q T# @* S) o
! L7 R% Y+ G( H* a* e' t
要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
% D2 f, q' j1 l2 m5 A! ~8 R! G i2 ?1 G3 s% M$ I
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT, n! K- k( B5 V. E2 ~
要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
! g! w4 u: G y: P3 g# o' U3 P. ^0 \: x, `8 E
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT) I/ L" X" J& p4 c1 k7 D# W
对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:" z5 n, L- S; g0 q
2 @+ E7 J8 R. Y- m. H5 A* P7 E-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
A3 L" g& ]& ^8 yCOMMIT/ b9 R! f# K2 ?; B! e
改为:
+ \, g) k0 Y- W/ j! y) I3 n. ^3 }$ Y0 n3 e, J& k
-A RH-Firewall-1-INPUT -j LOG' P0 e4 P- o% I" g, p. n8 Q; i6 h
-A RH-Firewall-1-INPUT -j DROP$ q& _9 ]9 k( H& P
COMMIT2 o! U* G, g9 J% t K" R6 L8 V
保存并关闭该文件。然后重新启动 ip6tables 防火墙:8 o; Y/ m6 U3 ?4 _3 `4 Z3 D
# U% {, G, b, s) Z- b# service ip6tables restart0 H& s1 o5 v" z8 t, q9 l
然后重新查看 ip6tables 规则,可以看到如下所示的输出:* Y* y4 v5 H+ Y" G( U# U
/ A8 j+ y1 x+ R# ip6tables -vnL --line-numbers- K% f1 _0 I- @& ~$ z
输出示例:% G! {2 f% Y; |4 n$ t
' n9 s( H& Y- ]2 u7 ]Chain INPUT (policy ACCEPT 0 packets, 0 bytes)2 j; J" D# A( V: w1 ^: t7 b$ t
num pkts bytes target prot opt in out source destination. w4 u. f0 V1 q9 \
1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
9 }% g! n, e U; a/ aChain FORWARD (policy ACCEPT 0 packets, 0 bytes)/ v I0 k/ N0 C; b7 f
num pkts bytes target prot opt in out source destination5 f4 F9 V! n$ v$ u* A
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0
( C. q5 }" \% QChain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
1 z! Y2 w5 H9 V& b3 T2 enum pkts bytes target prot opt in out source destination
7 C) W' e9 G h, [8 p# f' KChain RH-Firewall-1-INPUT (2 references)& B5 L. ]& A% s( N# v" {
num pkts bytes target prot opt in out source destination4 x9 F X u8 r+ ]1 e! p
1 6 656 ACCEPT all lo * ::/0 ::/00 |6 E: C+ X- G3 L
2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0. {$ B0 R4 y# d P; R) j- }0 b
3 0 0 ACCEPT esp * * ::/0 ::/06 p% d- i6 Q) X0 x; G
4 0 0 ACCEPT ah * * ::/0 ::/0
0 b& i$ V O- i# I3 L5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
$ c1 P: ~- @+ m K) ]) o' U6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631
2 m# |3 w! e# }' H7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631- G$ N* V$ V) g2 S! A, C/ G! ~' c
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:610007 [+ V7 `# O# V1 W# ^
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
1 A2 [" T9 L8 S. k10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:228 L F" [8 K3 F- H6 Q6 k; Z- M
11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80
7 O/ ~' j Q" N+ N12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53) M% H V% {8 f' t* i8 a. G( K
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:539 n/ r" C0 T; H: ~. b
14 18 4196 REJECT all * * ::/0 ::/0; ?1 q/ g* E( C/ }$ Q9 k- Q2 U, e
IPv6 私有 IP¶
: I' W5 e$ ?. F% rIPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?
. J# E4 f2 c4 J. q4 }& r
3 d/ D* ^* v5 H& u0 p J不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。
2 r; v% i" F8 X$ @" q# s* }- x- U+ r: e$ R+ T
自动配置 IPv6 防火墙示例脚本¶# ?+ g& e* X; w4 ]; `3 W' r
与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。
R* C4 j4 t, ^6 E g
' J8 q+ l$ V0 U: B. ~, T% t' {#!/bin/bash$ _$ Y/ f% t5 ~+ H& a+ \
IPT6="/sbin/ip6tables"
( @, N# e3 ?% |. A" _2 b! E2 G; T- bPUBIF="eth1"
0 ], [1 e# x8 recho "Starting IPv6 firewall..."$ R2 g4 F& K% I! n8 D: j! z
$IPT6 -F
N$ c2 ]$ [2 d; l9 O5 x, F$IPT6 -X+ ?( [# ~0 Q% N4 g
$IPT6 -t mangle -F# i: Q7 r# y; @2 A8 Z. E
$IPT6 -t mangle -X& V5 m1 l( ~2 B. g% I! Q1 |
3 m: ? ?/ R" w* `# t" O
#unlimited access to loopback6 H* Q% r& p; X! z( ^
$IPT6 -A INPUT -i lo -j ACCEPT
8 U7 ]. _3 B9 P0 t% j) R m$IPT6 -A OUTPUT -o lo -j ACCEPT" ?7 ]. z1 w9 t5 Y# @: i
7 z8 \$ p. m2 q& ~
# DROP all incomming traffic! Q6 R% _; J0 J; |0 {
$IPT6 -P INPUT DROP
3 a8 X* K9 P U. G8 f* ^+ n$IPT6 -P OUTPUT DROP
+ r g+ n2 w5 M$IPT6 -P FORWARD DROP0 W% R X( i/ ?# `* i, E
' f6 t3 C% T$ Q# Allow full outgoing connection but no incomming stuff x# D K1 y8 A6 \# {
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
6 ]8 W9 r9 N' U4 w5 y$ f/ D$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
+ P0 s* n& ?' W" H& k6 J& F. W" y/ i+ g3 r5 l7 f% G
# allow incoming ICMP ping pong stuff
1 J2 L8 ?9 p" ?, _$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT! ^; D# V+ X; c' n0 Z
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT
b8 i9 r& z( p9 f1 U7 C/ d, @$ U! S+ L# n0 w- M2 V. o4 c, f
############# START 在下面添加上自己的特殊规则 ############( C. D; l$ l7 [1 m% U' U& o5 |3 x
### open IPv6 port 80 ' P& x- { H1 L- Q/ u
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT6 L" X% h- a* S& D/ d. B6 @$ l; f3 z
### open IPv6 port 22' Z, Y6 q* a* G$ k8 `- e E: ^
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT( C' R' W' v" u, X) q
### open IPv6 port 25' \$ f( U$ T4 m! t
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT
% S5 A& F! ]. e) V2 P############ END 自己特殊规则结束 ################
6 S1 S& u' v! a" N) w# `0 E. d& V' x8 @6 j
#### no need to edit below ###9 K* b* G9 b; ]! \7 f
# log everything else
0 T, u9 J6 R+ ?- h: |$IPT6 -A INPUT -i $PUBIF -j LOG. b/ R8 l7 U6 D
$IPT6 -A INPUT -i $PUBIF -j DROP |
|