|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
9 K2 ?" E3 }( C6 H
5 ?4 H2 \+ t& o在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:% Y! t* r8 i w: B" T
ip6tables -nL --line-numbers B/ Z6 s( O2 Y# n, t: `
- g K1 ?% m' [0 g- _ w# @8 J; L使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
7 M6 M: j& F" h3 Q( e( h0 N6 Y% o+ k3 }2 p9 b. q E. U5 T
# vi /etc/sysconfig/ip6tables
& F0 H0 T- i- q. ~$ z0 A' P可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)9 z ^5 |. {/ c" l" g8 m: x
*filter! [$ `5 g4 r0 @) L9 F; F4 U6 U7 D
:INPUT ACCEPT [0:0]0 A3 l3 y1 c; W" F5 a# s" A' I. U
:FORWARD ACCEPT [0:0]0 q# h: n1 u2 O0 V" e0 f
:OUTPUT ACCEPT [0:0]
, N. \8 H" b3 Z L$ b9 a1 \2 `% p! Q:RH-Firewall-1-INPUT - [0:0]
! r7 a0 d! k% b1 x: o-A INPUT -j RH-Firewall-1-INPUT
1 l4 N3 G, ^; w8 E( ]-A FORWARD -j RH-Firewall-1-INPUT
5 j9 u2 ]$ v. y7 v; G, X2 I-A RH-Firewall-1-INPUT -i lo -j ACCEPT
( V6 S& B: {1 {1 C- V2 I3 k-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
/ r9 |) B, o5 c2 U, m- s- X-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
+ n8 D, @2 o/ C1 x: ~ v1 M0 H-A RH-Firewall-1-INPUT -p 51 -j ACCEPT0 @4 Q' B9 u" x' X
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT! ?% C( Q! \- K( L
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT5 t' f' J1 W9 @8 R$ e
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT( g3 `: v: ^" [# g0 X
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
: d3 b: t/ D$ _7 j4 S( }0 B-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
/ r8 f6 m1 ]' |-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT7 l4 f% b- m9 Q
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
1 L4 @ L- p6 d8 r6 uCOMMIT
$ p0 q. K7 |& r. a6 h0 Z与 IPv4 的 iptables 规则类似,但又不完全相同。
' T X* \* k. W. Q! c
" U3 w$ Q9 p: v. @% K要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:5 \$ F2 F c0 J5 i$ G( w
7 [ g: y* h4 C! G-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT A I' z3 K1 S! Z n4 B- H; m( s
-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。" u# X; }6 X6 J5 h2 Z) V, I
" Z$ b4 Y8 A8 {( \要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:1 z& c/ }, ?- M% G# @- F, ]
6 C7 S S7 _% r9 I F-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
$ w1 n \+ U$ T+ L# r6 ~-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT ^* V/ u. A; i
同时针对 tcp 和 udp 协议开启 53 端口。& `# r5 i3 A$ [4 u
6 Y6 u# v5 c8 c B% M
要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
4 B ?# @) _, L Q8 b/ D1 C" |
( h+ h. Y5 ` Y4 d-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT+ T) W8 b/ s6 @6 z
要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
: o$ L" l% `4 {/ }7 Y
# J) s5 N) t" P1 f-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
J, c* e+ H# F4 j. Z对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
; R% p4 e R+ u
. J* \* f/ g5 |* ] x-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited _: l( A: d+ a% g* p# f5 r
COMMIT8 z9 K1 D& f: B- v) q: z' m: a9 s: V% g
改为:
8 U9 A" m3 D. p8 s {' N) L
3 g, `( k5 h8 d# \5 R A$ a& \-A RH-Firewall-1-INPUT -j LOG
4 i% X" E6 d G+ s: ^7 F-A RH-Firewall-1-INPUT -j DROP% Z( H3 J; m( d
COMMIT4 E, ~- q" s- }' Q+ g* r8 S
保存并关闭该文件。然后重新启动 ip6tables 防火墙:
; @3 d6 C$ M$ `4 x* X: g7 j9 P* ^ y* ?; h- x' u
# service ip6tables restart' Z& \/ {* f; Z5 l- u+ i2 s" d2 u& P
然后重新查看 ip6tables 规则,可以看到如下所示的输出:6 h+ ]' ~. `+ ~# w& P
' z" {9 C# X8 v4 a z: p# ip6tables -vnL --line-numbers
% E( t U5 C% R8 c9 M% b! S输出示例:
7 |2 `# [2 C& r" E* d6 }% f% Z) e6 L+ D% a" e, d* A
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
. h" q- \" N" R3 fnum pkts bytes target prot opt in out source destination! I3 ~! M! z: e z6 U7 d
1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
: t) G2 Y i) V0 \Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
" c( K6 D1 h8 v p# ?2 T- Jnum pkts bytes target prot opt in out source destination
, G0 p. \$ [9 F. r+ L9 q1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0
/ [- y2 C) m% LChain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
, J4 C( g' x* E7 G Gnum pkts bytes target prot opt in out source destination0 X" A$ l( d/ [4 b0 j
Chain RH-Firewall-1-INPUT (2 references)
7 a6 Q y% X. t: ~% T9 W' Pnum pkts bytes target prot opt in out source destination
' z; K. M# B( q' N( `1 6 656 ACCEPT all lo * ::/0 ::/0
) E& d0 y3 Z1 U/ x' W0 {8 m2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/01 [1 I) N# |; q: a$ @( H
3 0 0 ACCEPT esp * * ::/0 ::/0
: a m9 u0 a2 ], T; k( Q8 ?$ `& E# B4 0 0 ACCEPT ah * * ::/0 ::/0
8 g2 x8 N7 I6 q- ?5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353% z3 W0 K6 \/ s# {% d2 d! X
6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631
8 v, `7 M! A3 o" B7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631' ~* o' C; L2 |, b
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000
: J: s: p$ P( ]& d" _9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
( Y7 Q# l; T& V" k" _- c10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:229 @" i& y! S& _
11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80$ G. \& D ?7 M9 E. Y) |$ N# `
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53 {5 e+ ]- I4 c$ W7 H
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
8 E1 I2 R, n$ q# h0 u14 18 4196 REJECT all * * ::/0 ::/0$ H: J" E1 J! |6 R2 {9 m4 L
IPv6 私有 IP¶ c' D6 j3 U* U3 o5 r* q
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?* J: Q, K; X. t/ J. S+ x% |; E
3 ?9 l5 [1 G2 a; p$ u不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。$ n! R9 b9 Y$ I" Y
) {. c6 \- D1 c. s1 A1 }自动配置 IPv6 防火墙示例脚本¶2 Q+ m1 G% h) B }8 u4 G$ F
与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。4 Z) J# \: ?5 |$ {. @8 [
: l3 ]) `( B8 F& F3 P" O#!/bin/bash
5 k* e9 a$ C; \7 EIPT6="/sbin/ip6tables"4 R) q' l/ \ g, o6 z
PUBIF="eth1") V, B/ _7 w. X6 `3 P/ S1 d
echo "Starting IPv6 firewall..."4 X- r$ `$ q# {2 L, @: d3 Y
$IPT6 -F" E6 D* m% {, ]" P* @# R0 F9 a
$IPT6 -X
6 S3 k3 u1 R8 k0 p$IPT6 -t mangle -F
, J! f$ A5 ]& i' T k" Q$IPT6 -t mangle -X
5 P/ w& Y( n- l+ W5 b; `9 }; G0 D6 {: Z& T$ g {1 Q
#unlimited access to loopback B' H4 C f7 U
$IPT6 -A INPUT -i lo -j ACCEPT
& N; R/ g5 f8 u7 Q$IPT6 -A OUTPUT -o lo -j ACCEPT
) \0 D& s4 ]* _% K1 F1 v; \. `$ L1 L, x+ f4 i
# DROP all incomming traffic
# N- `( Q- x& K0 V$ l I$IPT6 -P INPUT DROP1 o4 w$ c! @+ [) M; T% D
$IPT6 -P OUTPUT DROP9 q' D* D$ }7 y" I$ u4 J
$IPT6 -P FORWARD DROP* m' g- u0 _3 X; r8 q% V- ]9 t
# o6 c ?4 Z0 T0 |% M! w. d. v
# Allow full outgoing connection but no incomming stuff
% z x h9 F$ m$ V) E5 S$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
! i, {- b$ [; S" J3 b# Y9 n$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
6 t) e- ]1 r& G0 r2 m
* `0 g- g6 p1 G) k# `3 B6 V& z5 D# allow incoming ICMP ping pong stuff
3 r8 s4 y% O) X' j& {- x9 j' \$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT& ]8 B0 Z0 @4 S" d! i% j
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT" i! }/ q3 W7 L& T+ A% }6 a: u) r
- C6 T+ w8 ~. ^* f############# START 在下面添加上自己的特殊规则 ############
; w4 J0 A4 x$ d. I2 q### open IPv6 port 80
5 D. \5 H/ l- {9 x: w#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT2 f2 [0 P2 u5 y2 b/ q. O# [
### open IPv6 port 22$ Z# M* N6 _) O# _$ V! c
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
% K3 w5 ?4 Q# b3 {3 x( a8 i### open IPv6 port 25+ U' n" b/ p3 _3 K7 q' v# w. b
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT, X6 l2 q4 o0 h& N0 x7 v* }0 Y
############ END 自己特殊规则结束 ################ Y6 o1 L g) k6 E, K9 | ^+ `
* l1 E9 j7 G- h5 X+ M#### no need to edit below ###/ v% l6 G! m+ b- H8 Y8 }) Q- n' X
# log everything else
: U$ { l/ B7 _$IPT6 -A INPUT -i $PUBIF -j LOG
7 h( e) a, D1 E4 [) `: K6 R$IPT6 -A INPUT -i $PUBIF -j DROP |
|