|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
0 N* e0 E X( Q3 E( S9 A. I3 [" p
v' T9 T2 B! {# K# h4 S1 V" U在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:- O6 c* {8 X1 l6 K* e2 Q+ n
ip6tables -nL --line-numbers
/ Q" D: S2 h, ~/ ]- b/ y. i7 E6 `
1 F6 w' O C" f使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
; p% z/ O4 G q9 i0 a5 j3 L( ]8 {. D: E
7 F8 | O# i% h. a9 B# vi /etc/sysconfig/ip6tables" A& B$ Q- |9 f4 [, P7 x
可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)& E6 J" q. S5 y
*filter
0 K: s6 X! f; }. I:INPUT ACCEPT [0:0]! ?- Q- U) T7 Q, \. \
:FORWARD ACCEPT [0:0]( I9 \9 n8 u& X# q% {0 U/ P
:OUTPUT ACCEPT [0:0]
, d8 `: \; A6 D( {0 {5 C:RH-Firewall-1-INPUT - [0:0]
& w$ T+ O( Z J-A INPUT -j RH-Firewall-1-INPUT3 _: b* i# G+ v( V
-A FORWARD -j RH-Firewall-1-INPUT. e7 C9 Q3 [4 M0 z2 ~& ]. u& s' V6 _* B
-A RH-Firewall-1-INPUT -i lo -j ACCEPT9 }4 w/ [- O1 X5 `2 }4 C( s( ?2 f, u
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
" b+ S- \9 ^* U6 O* f-A RH-Firewall-1-INPUT -p 50 -j ACCEPT8 Y, ^% r9 T* ^& d+ Y
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
" V5 X1 F) ^6 [: s/ x; ?-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
?8 I3 Z! a, U- D* ]1 I$ M: g-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
0 A3 o9 _, z' }$ o6 z# L7 V/ @-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT6 {+ o/ D" `# @) p/ M
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT. l3 h- U, s- `, C( M
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT! Z5 f5 d h) d# T. i6 `: L& i5 [
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT9 F! |1 ]2 H2 D- c6 I( u) m. E
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited1 o* D# h! }+ M6 Q# }9 Y5 n/ d
COMMIT1 n2 s* z- U1 x5 F) s( G
与 IPv4 的 iptables 规则类似,但又不完全相同。- z6 h; g) X9 U5 x
8 r7 S9 s$ e2 J1 l. n9 m要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:4 f$ X( E9 z4 {, E: d S
$ U7 I5 i; i9 V+ Z( U-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT P6 d2 W1 }) B3 K7 M. Q
-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
9 _1 y6 z/ a7 S f# l# B
# s( G! h$ F8 s$ Y0 n要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
: L6 Y9 G, A9 L. E
( ?! K) J( Z$ L1 m2 B8 L-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT1 C' V8 ^" t0 P9 m% v3 t' A3 A
-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT" w7 g# S$ C7 P& l
同时针对 tcp 和 udp 协议开启 53 端口。; c7 F/ d+ [8 O& h6 i8 Z3 C; A' H
0 \) W9 ]& {5 ^ }. I' ~要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则: M: p. r/ t4 k0 ^
7 {% _ K/ {6 L
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT, `. Q5 J5 ]+ ?# U( f
要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:, T a' _# Z* n% B
0 r- `% z: Q5 t2 c
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT1 z7 J' n' {2 p4 @ S5 C9 r2 I. k& ]
对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
8 Y/ L% l, }; @% o: U. B F* ~+ D7 i8 a! Q% m
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
/ h+ C' V" E& k) NCOMMIT
: v2 q, [9 ~; ]改为:5 @" E9 W! E$ {7 k7 R- T0 R
~8 h6 T' Z0 D7 o t6 J-A RH-Firewall-1-INPUT -j LOG
# ` r: I W: c-A RH-Firewall-1-INPUT -j DROP
# E6 H8 H" n) H/ GCOMMIT
8 q, _( ?4 k5 T# j% S8 |保存并关闭该文件。然后重新启动 ip6tables 防火墙: B$ H! M9 _$ B( p
- [# m3 T1 y5 a# service ip6tables restart
( ~* z4 N) X& C0 w8 H6 d$ B然后重新查看 ip6tables 规则,可以看到如下所示的输出:! N4 V! L5 d! K. b
" }' N! z6 L2 [
# ip6tables -vnL --line-numbers
* t2 |6 e7 x" r$ k1 Y6 n输出示例:
9 V. M5 D9 G* S5 t
$ L7 j/ B0 o6 X8 }Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
7 t e+ d ?# a$ ?$ Snum pkts bytes target prot opt in out source destination0 y. t) h. @9 j2 }( f; k
1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
1 _% X/ G! ^: d: I1 dChain FORWARD (policy ACCEPT 0 packets, 0 bytes)3 O" u, @0 L2 e
num pkts bytes target prot opt in out source destination
1 g) T* Z9 P& j; O: E* H) _1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0) r! m7 j1 ^# ^' |" C: g
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
- B+ e g$ X' P. v9 p) Pnum pkts bytes target prot opt in out source destination
5 a0 t; ~" `* {1 O+ OChain RH-Firewall-1-INPUT (2 references) n. K) E; k; Q( v% P3 c: d
num pkts bytes target prot opt in out source destination
" c7 F. L7 J$ {3 ~ z h: _1 6 656 ACCEPT all lo * ::/0 ::/0
4 k# k) s$ ~, x2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0
9 M4 h1 E% M! v. ~( N3 0 0 ACCEPT esp * * ::/0 ::/0, G9 e' [5 f- n
4 0 0 ACCEPT ah * * ::/0 ::/0
8 B8 g7 B5 h' t" s6 ~5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353( W$ Q( u) `9 e$ V- n6 F; l
6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631
% ] y* \' L; `; y3 T6 Q% [7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631
) Q K* j- o; B! q$ d: B8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000
& A* W" w- }" C; v9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
. E+ ^9 X9 F8 t: b7 z10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22( F9 Q( s3 T" f. F5 m- @# j
11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80
. `4 b$ ?; W' K" K/ i12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53+ B0 V) J+ Y7 f4 T6 R
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
- P- x( z% |: u5 s$ b& c$ a) W14 18 4196 REJECT all * * ::/0 ::/08 x! a9 [! Y( D* G8 e A P" @
IPv6 私有 IP¶
1 s0 L" e) H% o% c% O6 oIPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?+ E2 v3 e! @! _8 W( `% T7 K
# U, v& {. A+ p. E; S" h
不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。% f, Q1 h- t7 D6 T# o7 C0 H
( e3 }! ]( _8 s- C* L; ]自动配置 IPv6 防火墙示例脚本¶
3 g$ q4 ^3 s- P4 B与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。- J8 `( N% n6 p* b
2 D* O' s; }4 b, M! t8 z
#!/bin/bash
3 I5 O" a, |7 F# YIPT6="/sbin/ip6tables"
4 u1 Y3 G5 j+ B3 u9 OPUBIF="eth1"8 @7 B& U1 H2 n5 h9 {
echo "Starting IPv6 firewall..."
3 L) k! ~' j6 c k4 B$IPT6 -F$ {4 N e& O& Z1 \/ L
$IPT6 -X; E' a) r- @: K3 r" r
$IPT6 -t mangle -F" {4 ^1 p, j2 b" v6 b- @( L: N
$IPT6 -t mangle -X1 b, K, i; `# [+ D. ~
" @; t7 y( ~& j" w#unlimited access to loopback( `9 |% Z( ~4 u) _" G6 ~
$IPT6 -A INPUT -i lo -j ACCEPT
( f: g C1 |( U$IPT6 -A OUTPUT -o lo -j ACCEPT4 d S+ K8 |$ T z) E
$ l! n5 j4 \/ G; w7 u2 R# V
# DROP all incomming traffic5 F) n' h# {+ m4 c3 G
$IPT6 -P INPUT DROP
9 @' I p7 s- ?$IPT6 -P OUTPUT DROP
7 P( t- R p" d# z$IPT6 -P FORWARD DROP
8 ?5 R. h2 B' n! J& T! M+ y0 {" y7 D0 t5 |9 {% J6 C# g6 w
# Allow full outgoing connection but no incomming stuff$ `: O/ o% X7 j S; x) F
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT' G9 I/ g0 K7 R
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT* a+ l- c% p. r; w& X: P3 e
: ~1 o( ~0 }2 H# l5 v+ @2 T# allow incoming ICMP ping pong stuff5 o2 o) x0 x) }; e% @+ G! q; U
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT- D( l3 u6 |6 E6 S' k
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT
( X. V9 J3 M$ d% s) F+ w
! c. o& r" H7 w- y############# START 在下面添加上自己的特殊规则 ############
( v3 V& i( l5 X# v# A2 M1 \2 Q) R### open IPv6 port 80 8 \) |& A9 S9 B3 C: f4 u6 G) k
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT7 I, Q" [% J; r+ d- b
### open IPv6 port 223 O }3 C$ \2 K
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
( M2 B3 X; h1 w### open IPv6 port 257 ]" e/ _1 ~' j
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT9 Z; v7 j4 p( S/ V+ T8 \" T9 j, U
############ END 自己特殊规则结束 ################& ]% {6 F5 @3 F4 w5 F
0 C8 \4 P G7 T9 e. o7 @" c#### no need to edit below ###8 f$ j% g' q( i! W, j7 p: r
# log everything else
; j' \: C U8 w/ K- ~$IPT6 -A INPUT -i $PUBIF -j LOG! B5 a5 o3 Z4 }9 C7 y Z, g1 Z( g
$IPT6 -A INPUT -i $PUBIF -j DROP |
|