|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。' d$ T/ c) k9 P u
5 o7 _2 I8 V2 }! d1 _
在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:( s7 s f' U0 O M7 j% T
ip6tables -nL --line-numbers
. t/ ]; }; O0 _5 N
" z2 I4 t' I: r0 o4 Q使用编辑器编辑 /etc/sysconfig/ip6tables 文件:. j( }# x/ S/ W8 t+ V
& F: H, u: [ |- k
# vi /etc/sysconfig/ip6tables6 q2 F( S* `( m, @5 D: g
可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)8 t# b; M" R: u# H
*filter
6 f: i) ]- u8 F) [7 ]5 E:INPUT ACCEPT [0:0]
& f7 S. c* r" H7 N* `7 Q1 l:FORWARD ACCEPT [0:0]6 G' u- d2 z7 v& r( k7 n |! a
:OUTPUT ACCEPT [0:0]1 j' Y9 j& Q, |; P" x9 O( H) e
:RH-Firewall-1-INPUT - [0:0]/ y7 N+ p% v0 `7 T2 ^: x
-A INPUT -j RH-Firewall-1-INPUT2 g$ v- [- P! t0 D6 i1 V3 O1 |: d2 ~
-A FORWARD -j RH-Firewall-1-INPUT
: e- w0 U- k+ i8 y' x6 t-A RH-Firewall-1-INPUT -i lo -j ACCEPT
6 ~# j8 O2 x) M! |-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT) y o8 R/ |" I) M+ u$ k
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT, ~( k# c2 ? m" T/ h) D6 O
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT1 e: k, H; D9 s+ w5 c
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT- {' O! s3 b; _" [' B, [
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT. A+ x Q |. g* u8 Q9 T( Z8 l/ F
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
4 m, U( X+ m$ }-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
7 T5 F# m1 f' |! u+ e% A7 O$ U-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT4 _) v# n1 Y* o8 }5 x
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT$ `" O0 ^! G) C* P0 s9 C A: p
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
, ^7 U- ^ Y. GCOMMIT
+ x$ W2 W- H9 B" v: i- e2 R与 IPv4 的 iptables 规则类似,但又不完全相同。+ ^2 G: ?6 ?9 {, T- L! s
9 v9 Y6 d! U( F7 {; D, G
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:$ t4 w5 G9 z7 B3 O
6 c8 V! r5 m; n( u6 x5 W0 J
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
: H1 g* e: q! x5 ]3 q7 i% b/ a- R( m-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
3 y. p# p* g% I/ O6 q6 a/ _+ W
6 V5 C: _$ B! B2 m要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
+ d) h; z X% s; W w- a$ S! R3 b6 g! j
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
, F- {0 f- o! O; n* K-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
- b# w; ~$ H3 q9 `同时针对 tcp 和 udp 协议开启 53 端口。
$ \6 g6 D: w* k5 D! Q% X3 K* t2 s' @- s# }+ @( o' l' Y
要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
# I# r& W8 T& ~) x+ v, E' z+ t" U& h+ a# G
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT0 x% |5 X Q8 u4 `0 s
要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
$ m" j2 I |; v2 R) E9 u3 e
5 ~8 D" e4 M5 t' S) S4 L6 h5 B7 m-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
' w; u2 G1 {6 x. m* T/ m对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行: J8 g4 |% b8 r7 {+ c
" O: P' Q. j" s-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited* U$ g. D6 B' J- X
COMMIT
4 ]* T( h& b7 [' }# p$ e- x2 z# l改为:
1 D1 r+ _: y4 h8 }; m% e
- b5 }) K7 P/ H s8 K4 ?2 ^-A RH-Firewall-1-INPUT -j LOG
, t" N. }0 x( w J' C0 A-A RH-Firewall-1-INPUT -j DROP
* @7 Q: ]. B( N7 ~1 r4 ECOMMIT q- w2 O- C1 F% [' Q) q! U2 E9 \
保存并关闭该文件。然后重新启动 ip6tables 防火墙:; w6 A- x5 g. R- q
. m% p/ Y, L/ B0 {$ m" C# service ip6tables restart0 i a' Q3 D8 ]: a: H |. d
然后重新查看 ip6tables 规则,可以看到如下所示的输出:( ~2 R& n0 g7 I! U- {! h
9 c8 t) ]; S) N+ `# ip6tables -vnL --line-numbers
9 ~# E! c1 U- w& _9 V' w y0 ]输出示例:
( R( C7 p5 U% B! C- I: e: q% D* p9 v. a9 z0 E2 \- ?+ @ `
Chain INPUT (policy ACCEPT 0 packets, 0 bytes). |/ T2 o3 G. i$ \( f d6 H
num pkts bytes target prot opt in out source destination
8 i1 P) w" T1 g1 t9 w1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0% t' C9 { X2 X: |( E. U W- {; F. R
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)0 F- a% [' l; i+ C$ S
num pkts bytes target prot opt in out source destination
! Q' u# }6 M) ?# N2 R1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/03 a, A8 ^0 R1 t# u" H5 i: h
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
3 D1 o7 Q3 L# x5 N+ Snum pkts bytes target prot opt in out source destination
: u# H7 X5 {+ ~5 p2 ]" _Chain RH-Firewall-1-INPUT (2 references)2 P$ ]( u+ L6 j5 S* Y
num pkts bytes target prot opt in out source destination
$ X( ]! d6 ]# Z) ~& u, I1 6 656 ACCEPT all lo * ::/0 ::/05 I7 Q* q( E* y/ S% Y' N
2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0$ L, X( {0 Q! r& y" Q A% C0 |+ @
3 0 0 ACCEPT esp * * ::/0 ::/0
' t! X, Z# ] W3 v4 0 0 ACCEPT ah * * ::/0 ::/0
# p3 S" E/ `1 E1 T# a5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
+ O; b! W \1 y/ |1 |6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:6312 q5 E6 a' r7 I/ X9 z* W8 C
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631
% e! P6 m; `1 x. W* Z, v8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:610004 [' Y+ z6 a0 P. D$ m
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
% s6 i+ C4 u) g% u3 Z9 X C10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
; c' i+ ]- i% o5 J11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:805 b! z* O1 T& y
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53# A8 {" L! a6 g% {
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:530 t& C0 |% y7 L" v) ~
14 18 4196 REJECT all * * ::/0 ::/0
$ ?3 Y X7 d& q! W, Z- E0 M- lIPv6 私有 IP¶ w+ A! F+ C9 y+ n' h9 _
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?
$ g$ g. z$ H5 ~% G8 H+ X# q; p2 m5 v7 o( C
不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。
& n+ O2 q$ J$ u& E) Y
! X: n& ]- o4 l" `& w: }自动配置 IPv6 防火墙示例脚本¶6 P. d1 v! u" F( S
与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。1 |6 X) w1 w9 U3 a. i3 P& b0 G$ u. b
; Q& G1 z: Y. E5 |. j# {5 k8 r#!/bin/bash0 q( w$ e% W' n N3 o1 { U' A0 a3 n
IPT6="/sbin/ip6tables"1 A: B% ]! Z% q$ O$ U. N+ r& O
PUBIF="eth1"
3 o( L: y+ f# G; w$ c4 Necho "Starting IPv6 firewall...". _' @9 K, U4 Y# k" s; I. c
$IPT6 -F
4 X3 P! l# f9 N# {9 d6 |# R: |' |0 h$IPT6 -X
q6 k) @+ N, h$ Q; E$IPT6 -t mangle -F: M% V/ f0 d( U! T7 O. A3 B N: m
$IPT6 -t mangle -X
: D$ I% X: Q0 D G1 N" m* ]" s; Y) J5 [
#unlimited access to loopback2 w: S" ]9 s' u5 X( [
$IPT6 -A INPUT -i lo -j ACCEPT( F5 H7 P) s1 n0 j- G
$IPT6 -A OUTPUT -o lo -j ACCEPT8 b, Y7 a( A _ ?8 f& E# s
6 M. E- z! j l3 E" | R% u) P# DROP all incomming traffic
; h q& `/ m2 m# ]6 w9 [& G$IPT6 -P INPUT DROP7 u/ }4 o6 @/ k6 l
$IPT6 -P OUTPUT DROP
- Y1 @. v' u, j3 ^- a, Q$IPT6 -P FORWARD DROP* u0 @0 _6 ~7 \6 L0 \) z
( w) _+ z9 a0 Y" }9 j S# Allow full outgoing connection but no incomming stuff
" J$ e, I' I: O3 k1 t$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT% ^: O1 |$ S0 R4 h& w
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT* p, I! E' i* l& j2 a% l
# {. r4 }! n, d& {% \5 R4 s7 {, y
# allow incoming ICMP ping pong stuff0 d' D4 e! |% ?, ~: [& F% X. F/ o
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT
& y' z* K$ a: L" Q7 S# O A& }$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT
5 b; e/ i' m8 D( T- R: I3 Z( o+ p
( N( P: c1 _, v, J. w- H/ n############# START 在下面添加上自己的特殊规则 ############8 q0 [) {3 q7 Y# b. \6 l- Q8 c
### open IPv6 port 80 . {9 M( n$ ?6 f
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
7 T, a w" u6 [* x### open IPv6 port 22
. }& y. s3 e' |7 X" q7 ]" j#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT5 w1 m9 S+ I L. D4 i c! U
### open IPv6 port 25
" K! ?4 @: [5 K#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT9 F$ J6 Q; x U0 ?
############ END 自己特殊规则结束 ################
: |) h* S0 k- D# U& E$ q
+ u i! D) k6 o. O#### no need to edit below ###
U' A7 T8 k: B- m. l# log everything else
! A6 T! P+ d# b) D& i Q% r* |$IPT6 -A INPUT -i $PUBIF -j LOG! L- b4 z/ z; p
$IPT6 -A INPUT -i $PUBIF -j DROP |
|