|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
9 o4 |) c5 F9 L; N7 T$ ^- z- q0 F4 s
在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:
/ v. g8 P" m' R9 N ip6tables -nL --line-numbers- e" r9 s7 e4 @1 K M5 ]/ T: R7 r) Y
; n4 U# B* f0 J' _# p- g1 o- Q
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
! H9 q! k7 V* D2 y( u( E) P* N6 E* q& D, {+ E
# vi /etc/sysconfig/ip6tables
- \5 W' J; }7 Z9 V: _可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)
' M! }4 R7 I G& L5 ~; [*filter5 O. j' R5 @# g& j: h8 G! A2 _
:INPUT ACCEPT [0:0]
' E: q, b0 T ^. X4 g:FORWARD ACCEPT [0:0]7 M) o/ d7 |8 L
:OUTPUT ACCEPT [0:0]
: Q3 i. `; l9 q9 z:RH-Firewall-1-INPUT - [0:0]1 Q/ {5 G6 b) |, V6 ?
-A INPUT -j RH-Firewall-1-INPUT
9 v2 ~, Z1 O1 T-A FORWARD -j RH-Firewall-1-INPUT
6 Y+ A; y! F" q7 @2 x-A RH-Firewall-1-INPUT -i lo -j ACCEPT% t/ z. V, M& h) Q3 G* ~
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT) E7 L% ]$ I( h( I! B
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT5 B* }/ T: M" u
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT1 E3 {: U( w$ H7 a( p
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
) n; C' j- M) P8 C6 {% N-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
) M- w- L: g8 Y8 L3 Q8 o) q7 d-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT: T, t! X5 Q" a+ o( s% X
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT0 v( w# |% E5 N9 ?: v& J
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
+ X. ~0 J1 x1 L) ~-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
7 o# N5 Y& o) V& T/ x3 l-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
& f/ q$ f/ Y% g, j" RCOMMIT
% l p+ I. @& {8 v- j6 `. J与 IPv4 的 iptables 规则类似,但又不完全相同。3 K3 a' z9 w ^6 X- m
, x9 I, s" S2 N4 V3 A; \要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
, n# F* h3 i) B5 U
0 m% J; `4 U* [& E" {* y, c8 F7 U8 e; T-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
7 C) g+ w% W z* A* q. {% J-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。" N% N, K) | V, v# d" R/ E/ ~* C# X
7 f( C2 c9 O! t: E/ P; E要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
6 G" C5 l1 G: Z/ q3 l: C3 K) e' D6 Q9 Z. s) Z
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
4 `3 ]: o* D$ L9 J; M- r+ h-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
& j, b5 p: Z [& Y同时针对 tcp 和 udp 协议开启 53 端口。# _! ^# P$ q; ?8 u0 {! f
6 m. O k- W# y0 I% h1 B# X要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
) ? H1 m- q3 E( i, r5 z8 Z4 p
- A% m+ D7 m2 S/ [5 ~; n7 e-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
( L7 p1 w4 H$ V3 j3 y1 L, ~! X要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
7 {" f" ]1 S6 E' ^: S/ b5 C" i# \! l. d) i c# L0 j+ v- @7 f2 u9 n
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT; D- C" E1 ?9 z- ?: ?5 i- F
对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:3 i$ h1 N& b0 X2 s: N8 b' v6 r3 Y
( L; u1 V( q1 O8 R) p
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited; S( z' T! J9 S" M; k: W/ Z
COMMIT
0 T9 u4 m; {# k! M改为:
0 X, b! o T" l9 {% |( B% M8 O% O( r
-A RH-Firewall-1-INPUT -j LOG
1 x1 z, G4 j+ N-A RH-Firewall-1-INPUT -j DROP
/ r$ n' }5 d$ {- |; ECOMMIT' X9 `- d# [$ i$ |
保存并关闭该文件。然后重新启动 ip6tables 防火墙:1 K6 A* E& W9 Y' @6 c% Y! W. m" k
% Z( A& C9 m. o" i. `
# service ip6tables restart
3 T( {6 }+ u. `8 M) L然后重新查看 ip6tables 规则,可以看到如下所示的输出:) b0 f6 n+ ~- J8 R6 g
( n( q% t; s* E' X) l7 P
# ip6tables -vnL --line-numbers
: x) b, h6 G: d) k, ?0 F& Q输出示例:" f0 f$ E( a3 f7 p% k
! }5 }# B* e- R# x
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)+ n, l' P6 s3 T, b6 {4 }! \
num pkts bytes target prot opt in out source destination
# Y1 d7 @1 T3 g$ K2 g+ t, _1 p! g1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/05 O/ v4 I4 B, b. C U9 l
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)( s& \& n8 Q! M: P% S$ _7 g4 j
num pkts bytes target prot opt in out source destination" q D* j0 n+ ^! M8 w9 n
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0
2 ]2 c, r7 E3 Z3 L4 N1 PChain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
) a& d" ~3 v' p D" Snum pkts bytes target prot opt in out source destination7 }! h8 G: g2 O/ A* s) l
Chain RH-Firewall-1-INPUT (2 references)
6 W/ K! m( m6 F. \+ v+ `6 u7 Knum pkts bytes target prot opt in out source destination
- W: x$ k. e) b& \* b3 z1 6 656 ACCEPT all lo * ::/0 ::/0
, }2 @1 G' }2 H/ W+ Z# i2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0
# v8 s: Y; O5 b' x3 B6 E5 |3 0 0 ACCEPT esp * * ::/0 ::/0) n1 r, p' F$ q% U i7 ?8 F( g/ u
4 0 0 ACCEPT ah * * ::/0 ::/0/ t" L6 O7 H* j5 ~$ g# p
5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
) h9 c7 W4 Y, P0 h, M, c1 ?6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631, ]$ j$ j6 [: p d- d+ ~2 B+ @
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:6312 \& P+ ]- |8 Q
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000
% u6 h" _0 f: l4 l+ t* S9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
+ d8 P1 F1 [2 R. J10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
; {: d) v5 t; Z5 u5 l v* F6 G11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:809 z1 c1 V% l7 M/ L% w2 Z
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53+ W: Y2 O- W: l; p1 E
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
; d, U3 Y! P1 o% f6 \) A4 p14 18 4196 REJECT all * * ::/0 ::/0
. h% ~7 w/ i+ d6 YIPv6 私有 IP¶3 z* O' x. V' u9 \" U* b1 a
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?
% E7 n5 \5 Q! j. S/ Z2 a( `& B, d& @/ j: o* e
不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。& F; ?+ Z* t' e, N' ?
' Z- e$ R) q3 d+ o5 I; V' I自动配置 IPv6 防火墙示例脚本¶
+ x3 }! `$ S' k! @+ J" E* m与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。) Y* p- u( B0 Q' E$ Q' a5 V* P! \
`: N7 ]' e$ i5 [3 A5 b k7 |" ?#!/bin/bash
" ]* O3 K/ F2 q* DIPT6="/sbin/ip6tables"
# P/ O5 ~3 {2 g I, {4 Q$ rPUBIF="eth1"
+ K! O$ U: p* recho "Starting IPv6 firewall...": b7 D/ ~4 }: c' d5 W* Q0 g
$IPT6 -F
% P5 w) n. u- k4 y! d0 e4 |3 D6 a$IPT6 -X5 G2 e$ n) e. k# ]: @
$IPT6 -t mangle -F
7 |7 Y! a% _/ x0 m" v! `! O8 |$IPT6 -t mangle -X7 B9 }. z6 L* ]% [; K5 ?9 C
K) I1 C. Q! e
#unlimited access to loopback
% G; a* t: e2 ?$IPT6 -A INPUT -i lo -j ACCEPT/ M7 C9 g6 R/ v# r+ d2 z6 _
$IPT6 -A OUTPUT -o lo -j ACCEPT
, N5 T+ b$ q' X) a8 I) K, m9 @# J$ b+ Y4 _
# DROP all incomming traffic& R- b! I* e( Q) A
$IPT6 -P INPUT DROP# B# P) J0 S, f- `
$IPT6 -P OUTPUT DROP5 |$ y/ H: u- j) @# p( [
$IPT6 -P FORWARD DROP
# F5 y6 i- d+ p" F+ t. M. M0 }( T4 p3 Y
# Allow full outgoing connection but no incomming stuff
/ T5 o9 }7 Q, p$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
% @2 f; M, n; f1 q9 n$ o/ b$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
0 S& t. P! ?& r" v8 P5 V' K2 \$ c' G1 H o$ A$ o% _, ~) c/ b5 a
# allow incoming ICMP ping pong stuff
- }( E3 x, Y% U. G$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT
: V/ E# p3 z: f. x! Q$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT
, E' }, A; g' W, D l6 L2 y+ h
j0 o7 k) f. u2 M, U############# START 在下面添加上自己的特殊规则 ############1 s5 K/ n8 m# g: Q7 B/ ^
### open IPv6 port 80 % s" J# R0 J5 E' N* q9 }1 p, }
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
& R5 D1 f$ k. }0 O9 I9 T### open IPv6 port 22
& d- N3 o' ^* T. w#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
: S1 j! H% u+ U### open IPv6 port 251 Q1 d: K% D% R* Z* k3 R
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT
. e6 j0 t4 v4 e) n############ END 自己特殊规则结束 ################/ o; G( j9 m* B
# \, C( e, G2 w8 h; I2 F
#### no need to edit below ###
5 Z \$ s% x+ p# log everything else+ h3 s1 L2 k/ m" B9 }7 ^' A
$IPT6 -A INPUT -i $PUBIF -j LOG
# o ?, F+ w& Q0 u$IPT6 -A INPUT -i $PUBIF -j DROP |
|