|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。/ [' [* D/ D2 _4 P8 e
2 G2 x" V- O) A5 H# ]) k在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:
# w; ~% c! g5 h/ n0 u3 e8 P# ?! O& C ip6tables -nL --line-numbers* n7 A8 `8 B9 p4 Q! ]1 f* s
3 Z+ b% A/ z( S2 u) D: i使用编辑器编辑 /etc/sysconfig/ip6tables 文件:2 H& C4 _ O6 f9 O; D% H( ]4 J5 a
5 V, v* w. E4 j/ V! o9 P
# vi /etc/sysconfig/ip6tables- Q. W( {- o+ V- n3 x% S
可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)0 s8 I/ n$ r# X
*filter
y( H' E1 L2 E U2 E, I: G& V l:INPUT ACCEPT [0:0]
9 N. W0 k5 l L, p: E:FORWARD ACCEPT [0:0]$ u$ o" R% }, m& z
:OUTPUT ACCEPT [0:0]& r- Y8 L" [1 n- Z
:RH-Firewall-1-INPUT - [0:0]6 @ D/ p9 [( P. I" j
-A INPUT -j RH-Firewall-1-INPUT
! w& L B* D/ V ?3 `-A FORWARD -j RH-Firewall-1-INPUT
* I \) Z# ?& b. q. u' Q-A RH-Firewall-1-INPUT -i lo -j ACCEPT
: W2 M# {3 a2 O& U+ S3 b-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
6 j( D6 C( R3 f, I-A RH-Firewall-1-INPUT -p 50 -j ACCEPT/ z# ]: q) @+ {% S- ^
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
5 K% ]; S0 z: C" W( M-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
# N/ l- x+ U8 |+ y7 N& C, N/ d-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
; D0 ?& ]: u7 F* l-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT1 @& y, L5 v# S+ l! _8 M/ Z
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
, v: u" Z: s @$ \" d6 u1 y+ E-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
* M( O0 k3 L! B" o* |) x-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
/ V0 e7 V# X) d" f2 S3 o-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited6 \5 r ?- o7 T/ F! R I8 `
COMMIT& ^( l8 Z) R9 q1 l' z" ~
与 IPv4 的 iptables 规则类似,但又不完全相同。
% A' w4 T* O. t# q; B
+ t3 d' U: Z( m8 n要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
+ X+ z; \! }. c4 e" c
7 e, P, t& _, x0 T; k-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT9 ^# W- G) y" r$ [# U
-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。6 d8 C& X6 r9 i" _6 J. I7 G
- K& e+ T' S6 a1 \要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
: b% u8 |- l v# M, ?- I. I0 `) @0 l$ ^- R0 \
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
1 n/ e- @! V0 \-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT7 b, y, L9 d- I( |2 X m7 h
同时针对 tcp 和 udp 协议开启 53 端口。
& U7 B3 V) Q$ }; o8 R& y+ ~( c5 ^1 K2 C5 C
要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
; b/ s6 K# v- G! M
2 e" S. G' L' o0 I0 c# F-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT: x1 d$ l; \% v; o5 T
要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:2 f' U+ c! R5 c
! G0 d6 F! x% r% C! ?- }. V
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
4 d( Z, @, G) T6 C r J) B# m3 x对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
, r& j; u3 _7 F+ j' K. h, Z; z, T+ ~$ F* r4 A
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited+ f7 T! [% B* x6 G3 j: i
COMMIT. k3 x t5 q/ J% P) X' L
改为:
0 J/ Q1 U* F/ T: ^/ [% f, v2 z/ w1 [" G: y. F( j2 }
-A RH-Firewall-1-INPUT -j LOG2 j( ^/ L% Y# ^
-A RH-Firewall-1-INPUT -j DROP. M9 V& H& `/ X3 o b+ c6 P7 z' N
COMMIT
+ s( A0 c: _ A保存并关闭该文件。然后重新启动 ip6tables 防火墙:) X2 r; L$ X. y; G u0 i6 N$ v
2 c' x. B6 I; d; X( ~* j8 S0 {# service ip6tables restart
) v2 Z% ?: a' m1 ?1 b然后重新查看 ip6tables 规则,可以看到如下所示的输出:5 Q& O1 A# T V) t3 o
' `) q, [ [/ w8 S- B
# ip6tables -vnL --line-numbers
$ O- ]/ s$ a) f输出示例:! `, v+ G* q' G# `' O
4 ~( \0 h- C/ `4 y5 z/ MChain INPUT (policy ACCEPT 0 packets, 0 bytes)/ E ]0 [% I# _
num pkts bytes target prot opt in out source destination" a, l0 s$ `& A, g8 r/ n
1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
/ y2 ?) B& Z4 B- ZChain FORWARD (policy ACCEPT 0 packets, 0 bytes)
$ D( N: i5 }$ j% Snum pkts bytes target prot opt in out source destination( X1 R+ l3 J: r
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0. O( j0 {" T/ W: M5 Y
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
$ n9 i6 }9 Y4 P- unum pkts bytes target prot opt in out source destination
8 A9 O: u6 a& H g1 rChain RH-Firewall-1-INPUT (2 references)
9 Z) {* Q- R2 ?* [num pkts bytes target prot opt in out source destination
' }" p: \' K5 M$ V1 a$ i1 6 656 ACCEPT all lo * ::/0 ::/0/ t2 }% i9 _% U0 I: F, ^' n
2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0$ V. |+ p4 H- R' I. D
3 0 0 ACCEPT esp * * ::/0 ::/0' z/ \2 H2 y5 D: e
4 0 0 ACCEPT ah * * ::/0 ::/0+ H5 m. U: j+ D
5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
+ V, y5 _( L" }6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:6318 Q- S, t6 l3 f) B8 U5 x
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:6315 _ T- @' b: {2 r r7 _
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000
, L* e" V. ]; X4 Q. {5 a2 C& \3 B/ N9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
1 l% z# d! ]8 ?$ T6 g1 i8 o9 j. E10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22 _8 M" J0 C8 L
11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:800 @9 z/ F% J7 Q6 n- q
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
* C3 V; Q& b5 z13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
. j9 I( }# c8 ?. `1 P; J0 P14 18 4196 REJECT all * * ::/0 ::/0
4 M; h" b+ Z; \0 V9 J& f5 G$ |IPv6 私有 IP¶5 r9 \( l7 h% Z; `& e6 }% n
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?
5 j* ^7 Z6 B- ]# ]9 z+ \5 a0 _1 |5 P! y, c* w. t
不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。' g- k M8 I0 b9 k
8 h5 Z# Q' n4 a自动配置 IPv6 防火墙示例脚本¶0 l5 j: |1 N/ G
与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。% |, P1 p" r H
4 v1 A; A- q' i$ r6 a#!/bin/bash
" C% U8 f6 Z* `, K0 S1 GIPT6="/sbin/ip6tables") T( _/ ^; B' Z q
PUBIF="eth1"
( H* D$ l$ M9 \8 E# S8 i+ @* Vecho "Starting IPv6 firewall..."
. w. ]. w) L: \, t! a$IPT6 -F
; w# L* T- [- L: F4 |' C8 h$IPT6 -X
5 Q, s& ~ x, r: i$IPT6 -t mangle -F
" j2 t0 m8 Y" H$ l$IPT6 -t mangle -X1 R( m% p+ z0 a& v8 }
. e' m9 {8 X8 [
#unlimited access to loopback z" ^% M8 A) T! o
$IPT6 -A INPUT -i lo -j ACCEPT
, b& J1 g+ F' _$IPT6 -A OUTPUT -o lo -j ACCEPT
4 e- M. w" _. }
% o( a& ]9 ?( ]# U# DROP all incomming traffic
p* O: O5 }: n: {$ N# C, F" u$IPT6 -P INPUT DROP, A0 N# _3 }$ a* L
$IPT6 -P OUTPUT DROP! Z, ^# f2 K" C& j$ _/ M; Y
$IPT6 -P FORWARD DROP, B) ]; {" o5 Y$ x) u, f
6 W. Z! |8 d0 m% O- `4 v9 `
# Allow full outgoing connection but no incomming stuff. S3 R3 }# e$ G/ S3 }& R6 |( @
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
f( t1 A; ?$ l' _' e' L$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT$ P2 ~' l0 n3 _; O- H9 u
% g9 m: [6 X0 t; u/ i, _- u' b# allow incoming ICMP ping pong stuff
1 z- G( y: q+ {$ x+ ^$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT
. H# B& k1 T. U9 n+ `3 X9 E$ r$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT+ A: ]+ r2 Q& m- v
( i6 J7 _- P7 r# B5 Q1 o
############# START 在下面添加上自己的特殊规则 ############& _$ ~. I5 \; t% q$ S1 H8 `5 q
### open IPv6 port 80 9 j% K! E2 s: X* Y
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
* M0 d7 {, M* E9 S### open IPv6 port 220 J% V4 r# k- x, l! z
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
; }+ ^5 |% g) H3 K$ ^3 Q### open IPv6 port 25 Z' Y( V7 O4 J% ]4 l- X- z
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT' V9 n4 [9 A% f: y0 o7 h
############ END 自己特殊规则结束 ################* I! p# `6 R9 Y5 m3 S1 T
8 E/ v0 x8 H7 y$ [7 E#### no need to edit below ###0 X( d+ y; G Y* w1 b8 h
# log everything else3 Z) v4 Z( B* \. ?# ]; G$ _+ g6 r6 t) H
$IPT6 -A INPUT -i $PUBIF -j LOG! p, C9 W& X/ t' d( V9 u' B) b
$IPT6 -A INPUT -i $PUBIF -j DROP |
|