|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
5 K l* q* g: r& M1 t4 o7 s! H( D9 `. r: ^; J& {4 O- e4 n m
在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:* C3 r' Q6 L3 Q0 ]
ip6tables -nL --line-numbers
5 K* c1 S) d% c( B9 l6 A1 l" F+ | t# [# u2 B9 @9 ]1 {
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:( e7 m3 R1 j9 L# o
4 C3 n& `& A; ]& O0 G2 }# vi /etc/sysconfig/ip6tables
6 `5 [7 S& L1 U可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)
- N: s8 Y! r; H: G- u4 |7 d*filter. W S; s7 j' i c F1 l0 ^
:INPUT ACCEPT [0:0]* P4 k/ f5 ^" N+ u4 g3 i
:FORWARD ACCEPT [0:0]4 r+ g! }4 z2 Y! `: N1 g
:OUTPUT ACCEPT [0:0]$ d* w7 v. b/ G0 ~ I
:RH-Firewall-1-INPUT - [0:0]7 f" L# a6 K& p% y( ^& x
-A INPUT -j RH-Firewall-1-INPUT o* a' ^/ _" I! }2 @( N+ o7 w7 L
-A FORWARD -j RH-Firewall-1-INPUT U! C4 p5 v; p# J# t* F
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
6 b( }" R' C% ~' z _-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT, L Y, V- B; l" [( t- B8 O1 Q& q4 d
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
& i) K6 O$ ]9 T. @- Y-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
5 Q2 K0 {2 Z* F* p Q/ b8 g-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT" O# ^ c- m( n3 D) {" ]4 m
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT) @4 H9 s+ e& U6 ~
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
" T! f: P2 Y3 I* G* A$ ]* j-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT8 D1 o/ [* L( `9 {( y
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT8 g- j, w; l& D# L
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT- i& U0 B8 `: g8 K+ v1 d" r
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited. J* g/ u( v, c5 Q
COMMIT
0 y7 N# q; }5 b与 IPv4 的 iptables 规则类似,但又不完全相同。' [! H3 h& ~4 {8 k& W
) ^* X( c1 c8 O' {% u要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
# o2 {2 x m8 Z1 f* h7 B0 d V1 q# G* g( R; Q I5 @0 \
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
. e2 L" g r7 E8 I3 V-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
' G- W, R Z' L( Y" s
X5 v5 r% v# Q+ ?: e; M要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
2 O0 I+ ]% k( T9 K0 O/ K, h. J
: p/ t* M3 d! C2 N# k-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT; q5 E- j& Q0 k; b
-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT+ V) `, n! r$ Z9 h% y9 n
同时针对 tcp 和 udp 协议开启 53 端口。
* K: o# p. `" W c: @, o( D0 P
5 Q% Y% P( [& V5 D7 E3 p要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
- B" J! j# u/ L* p0 t* V6 [$ g( f9 N# M2 h7 x3 d0 R* s% s" v
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
" ?- F8 ]1 h4 F; U要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
6 p7 `) a/ e( ^% Q/ u7 d) B. P% s+ q3 v. \; |$ W
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT& H+ k6 J2 n3 a) R+ V
对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:$ V2 Z4 @( h9 G1 c% x! H. s5 s% M( e
0 |+ [. {4 y$ X" j: F, \* B n-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
|$ F ^) K* dCOMMIT5 A# U# I" \* g4 q' p, S
改为:
7 E" D, p% A; ? L4 F% J8 v& Q& F- |+ J& C0 A
-A RH-Firewall-1-INPUT -j LOG
# r, ?, a& z/ y9 X8 r7 Z: h-A RH-Firewall-1-INPUT -j DROP. x; @- Z4 I3 i$ o$ a1 j
COMMIT. k' |- e8 V' X, l% t# Z
保存并关闭该文件。然后重新启动 ip6tables 防火墙:5 |+ A( \: u' o" }( f
& N6 z8 H' s- R
# service ip6tables restart
: l5 k, m) N/ ^, I/ g然后重新查看 ip6tables 规则,可以看到如下所示的输出:; K, s& r/ A* I/ m* u. ~2 G- h
S) Y- C2 M8 a; u7 C$ _) p8 L
# ip6tables -vnL --line-numbers( S' @- J0 h0 t: p6 U6 w
输出示例:+ E3 R* D8 A s6 v/ w3 ?
0 _5 R5 y! `+ K; H" F5 _+ ~9 f: Q7 |
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)+ l L; t0 }) d. H
num pkts bytes target prot opt in out source destination
+ u) I) P+ V$ O) X1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
% u f* {( l/ ]: H m- _7 K* \Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)" ~$ ^5 R# `! d
num pkts bytes target prot opt in out source destination. G7 |: v* i, K% Q
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0' q: a& P4 m1 H- X
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)4 s: a. _& g7 e" U: c
num pkts bytes target prot opt in out source destination0 q: e* M" E3 e E+ D: Z
Chain RH-Firewall-1-INPUT (2 references)$ B# I% z- E; [8 A2 R
num pkts bytes target prot opt in out source destination
+ K+ L* X/ }( p; x M1 {) A/ i1 6 656 ACCEPT all lo * ::/0 ::/0
$ X) V" t' Y: k2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0) `. A6 h4 X. n; w X
3 0 0 ACCEPT esp * * ::/0 ::/0
, ^5 j% P! R; P- K* |3 R( }- Z4 0 0 ACCEPT ah * * ::/0 ::/0
' p( u# z! [7 C) |8 b5 K0 o3 x5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
* A5 \, Z. U* M# U# W% r r4 p6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631
5 b- l k; g: a, R7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631/ |! a$ f F3 n6 k% y K6 o
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000) @6 q2 F5 U) Z- F; D' q/ u/ I0 _
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
6 n+ O" g& i# {- ~: x4 H10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:227 M) `! N7 ?5 j% |
11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80
% J. \: }. K& M" c12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
/ c* S" S2 ]9 m& ~/ V I8 @13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:536 o4 z; W1 `/ r" ~8 \3 V
14 18 4196 REJECT all * * ::/0 ::/04 \+ [3 Q7 |; n; B
IPv6 私有 IP¶9 ~/ M& q/ G9 e* c7 [/ e
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?# d. p6 t# ?, k6 x( ?3 K# U
, V3 |* d9 V: d/ ]$ L
不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。
# B% K# J7 x: u- Y& H5 Z
0 b Y# u: K$ ^ y自动配置 IPv6 防火墙示例脚本¶
: o6 _" _! k& q' L' D' x与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。) D, `8 @9 i% C7 w7 j! x
2 E3 s6 I4 S( [$ _) ]% Z0 H
#!/bin/bash5 |+ f/ X! v. I/ Y! Z( s
IPT6="/sbin/ip6tables"! `* P6 j( w# r, [8 `" I/ x1 Y
PUBIF="eth1"
3 Y& r! |# i' ~) u8 Z7 vecho "Starting IPv6 firewall..."
* P% H( J$ y% f0 L2 ^% J7 [$IPT6 -F
: {6 k* s" M4 L5 @& r$IPT6 -X3 K+ @$ Y% X6 O
$IPT6 -t mangle -F* i2 }) j9 D; E! A0 k& H
$IPT6 -t mangle -X2 V% X: ?5 s6 t% W0 X; U
M) i; j0 d' J* U6 ~
#unlimited access to loopback7 c8 _; z$ U# ]; W2 y' @4 d, O$ Y
$IPT6 -A INPUT -i lo -j ACCEPT8 p, l3 l7 x$ O! u
$IPT6 -A OUTPUT -o lo -j ACCEPT
8 G5 h% j3 w! ^
( @5 I# [# o: L8 K# DROP all incomming traffic
& _; q+ L! D$ b0 D/ U0 @. V3 n, Q2 G$IPT6 -P INPUT DROP! w. i0 n; l, h' y
$IPT6 -P OUTPUT DROP/ s7 e& L$ B/ u7 Z; ~3 N5 z+ m: Y( \
$IPT6 -P FORWARD DROP0 j( _/ ]5 E8 _5 L% ?: i# Q. u/ M
8 Y) C4 g& g( O# Allow full outgoing connection but no incomming stuff+ G- K+ x( M+ h/ A, T# h: e- I& C$ f$ w
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
5 i1 l% ~8 G4 _7 z# C$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT" U5 S( ]5 S9 f7 P; b# ^; [$ l
; R" x( Q; L+ {/ Q+ L
# allow incoming ICMP ping pong stuff
( s9 l! z3 ^: U' Q# t2 g$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT
* l: ^7 ]6 G2 ]) F$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT3 M% L/ D- F$ b! u" T% R' H
9 }8 c. f4 W, X G############# START 在下面添加上自己的特殊规则 ############
* ^& T' A) T0 m8 S) L( @- q. }' T### open IPv6 port 80
; C* R) b4 V% ]1 {#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT% o' U% u# R% ~
### open IPv6 port 22
: a1 Y N V0 R' ^8 l1 g6 Y#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
7 L. t6 L" E) n; C6 a### open IPv6 port 250 _) o3 ?0 \* u7 j- X- Y
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT
0 V5 Q6 z" ~# n/ e# j############ END 自己特殊规则结束 ################! m" O# x. W Q6 d; T( i. H" z
7 b1 o; N/ _- c9 Y, p2 L/ V$ t
#### no need to edit below ###- f9 S5 a, A( l
# log everything else# x+ t% H9 Z1 t( `
$IPT6 -A INPUT -i $PUBIF -j LOG- y7 e g0 B1 k: g% D
$IPT6 -A INPUT -i $PUBIF -j DROP |
|