|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
3 g# A% L& J- U3 W! f* Q I3 \4 E, D0 V/ S' z+ L" Z
在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:5 c' {) } k# M3 G9 H. c
ip6tables -nL --line-numbers2 A6 Q: J9 [5 j
7 M: K9 }5 i. d5 x/ q- J S7 n
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:6 y4 y2 p! |6 |/ a0 i2 k) S# U
8 o: O3 R+ Y1 G* g# vi /etc/sysconfig/ip6tables [2 L2 d3 W" W" {, L
可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)/ v" O+ R7 J& V' y
*filter' l& }3 x- n* O5 W }2 e
:INPUT ACCEPT [0:0]
/ W$ H$ V3 T1 B* p# e:FORWARD ACCEPT [0:0]
3 ]" p" V6 @ \:OUTPUT ACCEPT [0:0]0 ?2 r) O% ^) B
:RH-Firewall-1-INPUT - [0:0]0 W, B9 S5 p/ h9 ]% g, @. Q
-A INPUT -j RH-Firewall-1-INPUT2 n) g% i9 I P* V/ ?# j+ i) c) X$ Z
-A FORWARD -j RH-Firewall-1-INPUT% w" o) H6 W5 A, v8 `1 V
-A RH-Firewall-1-INPUT -i lo -j ACCEPT. ^4 n( g# W0 M2 R2 l
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
7 P" C8 v; ^8 ^. I9 a-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
- ?6 C8 q) `- ^) _-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
) p* \; L" s/ I- f- Q-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
2 O9 K0 S7 T( e/ J-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
) ]. `' R3 l0 S8 R-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT# d. W4 f; F# G5 |1 k( E0 F* l
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
8 x7 W3 _+ f' p-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT2 H; j* \3 V& R; g' Y% V
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
( i2 c, [" v; F! `9 M' c-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
/ O8 n2 Y3 Y7 Y( K- j/ j3 ACOMMIT; [3 l2 P. ?0 \: ?
与 IPv4 的 iptables 规则类似,但又不完全相同。
1 H3 J/ q+ ^2 N/ U0 l7 |3 _! A2 s+ \8 [) t
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
$ v* O2 p& P+ m l" ^6 l" W/ J
# ~0 J [% S6 @% M0 V3 @; F$ ]& M; L-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
t7 d5 ~) V) v% p) a6 I7 @-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
3 R4 R) Q+ i, e' d* p& B1 @1 f4 n$ ^* A( A9 o& o; f' Y
要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
3 D0 o& z3 Y- {5 d
4 ]: c {( ` \-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
. t5 H. X; F0 W2 f, v! e, R6 T-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
) _( [' G M! G8 e同时针对 tcp 和 udp 协议开启 53 端口。0 u. l* p: [% x
% G9 N2 G; A: e2 c) Y, y
要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
Q" U7 C( a/ o% W0 G0 }% h8 ?' x+ n2 N' H& g- q; @ ~6 r
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT& w0 A) l8 G H p8 r% f4 M
要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:. t$ G& W% m3 s9 l- L/ }. s
5 Z' f# ]) G! u-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
: l( I4 ]' v; R6 Z$ {2 _+ Q/ D对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:1 J- g0 a7 c2 `4 ~4 u* D8 f
3 I5 n5 }& e e8 o
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited# A7 E5 j/ a- P& U4 ], Q2 Z) u
COMMIT, r: d3 t/ l, X
改为:3 w/ }# u7 C8 V
( ` r. u7 C& j; W R7 D-A RH-Firewall-1-INPUT -j LOG2 ~% t, Q% `" p. i# Y. g
-A RH-Firewall-1-INPUT -j DROP
4 \) [( }' T+ ACOMMIT( n; O% {$ n$ z( ?' V
保存并关闭该文件。然后重新启动 ip6tables 防火墙:
# C1 @0 @6 _) w! p0 h& _1 O z: V6 ?7 X
# service ip6tables restart: l k, K, v' @' E2 B$ N
然后重新查看 ip6tables 规则,可以看到如下所示的输出:2 o6 B4 s; v {- X3 G, z, z
8 V0 m6 L. |! }% @" x# ip6tables -vnL --line-numbers
& U; t, Q( C! n0 u5 g9 a输出示例:
8 b5 V+ ^# R. S* }' N9 x# l& S' n% [1 x' Q. z% j4 h, u) j( B
Chain INPUT (policy ACCEPT 0 packets, 0 bytes). L" r% w: ]1 n3 `, O6 r
num pkts bytes target prot opt in out source destination
6 q$ C; y3 O$ R9 o1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0( @0 ^! q* s; H7 K: t
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
6 p4 }) Z# M2 K- V! rnum pkts bytes target prot opt in out source destination4 u: \ V1 I* j; h
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0; U- F9 O( e5 u7 X+ u' U, }+ j
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
8 `0 y: c' i' b1 H/ d. ynum pkts bytes target prot opt in out source destination% N6 s U: M8 U5 Q" s
Chain RH-Firewall-1-INPUT (2 references)
/ E4 @/ u5 b6 E& ^8 hnum pkts bytes target prot opt in out source destination' g" z; a. l) t. u$ \: \
1 6 656 ACCEPT all lo * ::/0 ::/0
/ `" L5 o" l& S* v2 X( M2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0
; i9 ?! M0 x# F3 0 0 ACCEPT esp * * ::/0 ::/0
2 j# Z% S. r3 }) z% u8 |) i4 0 0 ACCEPT ah * * ::/0 ::/0
3 L$ E6 [& ^8 h* D/ Y5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
. b+ @7 O( H+ C3 s) c7 y+ @6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:6310 F M( d' R* M, n
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631 z# [' K }# a* k6 f, x
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000# b$ j+ \$ f' P0 S
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02" a6 J8 @' J" V& e; d, G2 ~+ e
10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
9 j; t% X+ g; J# h5 z11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80" z4 p6 X4 k. V
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
- N0 Y. _+ M5 A+ A5 H# s- M13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
2 ~, H6 k2 u3 F) a' b$ t8 b- J0 w5 `# c14 18 4196 REJECT all * * ::/0 ::/0- g, m K1 X9 h/ b; p( ]
IPv6 私有 IP¶6 V% `" W2 B/ }2 |& P
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?
8 S( _$ l' U) c8 ?8 [: K) \5 k+ f' l
不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。) Q" h' E0 S9 L/ j6 _" d
% \1 Y4 |, x& v! d
自动配置 IPv6 防火墙示例脚本¶+ _2 r u; X6 `1 Q' T3 t
与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。
, ]4 t$ s8 ~8 `+ P$ m1 Q3 s# h7 C
+ k- t+ \) ?; I ?' o#!/bin/bash* @+ r% G" @0 C: E, N
IPT6="/sbin/ip6tables"2 G+ Q+ Z- ]. f: W4 s" N
PUBIF="eth1"
$ B0 }2 t2 P& N S! { Hecho "Starting IPv6 firewall..."
2 j+ K* Z) z9 |" s7 |( R: R) b$IPT6 -F9 c/ H' c8 q5 | M0 Q; e. A. X. g
$IPT6 -X, Y% E5 E$ V- I6 F$ r
$IPT6 -t mangle -F- U' G' O. J8 }$ k- P2 e5 C; k
$IPT6 -t mangle -X
9 U/ c* Y* p! F' f6 j2 m$ a0 W' a r8 q! k j+ Q$ b+ @% ]
#unlimited access to loopback
$ v# @ I7 n$ e6 o$IPT6 -A INPUT -i lo -j ACCEPT
2 C0 L0 w6 r; n- S$ }4 @$IPT6 -A OUTPUT -o lo -j ACCEPT
: r. w: `; H" K9 i! M
$ Y1 ^ P) e3 H3 R* a' l# DROP all incomming traffic
8 u+ ^ S5 Q& q# _" R$IPT6 -P INPUT DROP: Q1 m7 }8 G, ^& w" n
$IPT6 -P OUTPUT DROP
2 f# E8 Q! ~' p* Q$IPT6 -P FORWARD DROP, T; ]+ A; y4 ^" a5 H2 |! u h
0 J- x% g% n$ }7 J
# Allow full outgoing connection but no incomming stuff! T& C, m E, l0 F# y5 e# D& O
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT: h* n- r' V3 _7 M0 a
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT7 J2 ~0 w$ o' n O6 n& }" w( a
, t% w8 W7 ]5 \3 ^; I# allow incoming ICMP ping pong stuff5 b" \7 |! `, b
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT
, Y6 c/ b! U. Q8 r) c$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT5 |) j9 k+ o# Q) H V" U: w- t* r
) C. a% W" y g
############# START 在下面添加上自己的特殊规则 ############7 A% ^/ s: c3 P% h
### open IPv6 port 80
- L: F( ~* N) b$ B. |4 b6 l0 J#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
4 e. l0 @0 N7 I8 x9 X### open IPv6 port 22
& X+ |) ~% n! u1 p#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
+ F* T& C, B# t& ]) u### open IPv6 port 25: q, n' m. _! ^
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT$ M: v; w6 ^( O7 y& o
############ END 自己特殊规则结束 ################/ ^+ M' ?* l4 ~# V( H( d' h
4 q4 O3 n& Q0 D0 |( r/ L; Y3 w
#### no need to edit below ###
. J2 ` G, O; Z/ r* i1 m8 A# log everything else. l3 G1 F; B# d W, f8 t0 K' O
$IPT6 -A INPUT -i $PUBIF -j LOG
* V+ |( V' s3 o/ E: }2 G7 x$ g$IPT6 -A INPUT -i $PUBIF -j DROP |
|