|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。9 a' c ^% E3 C1 o
+ ^; ~8 x {8 ^& l6 j9 l$ H8 s7 U在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:* {" v8 |+ S9 w+ b& {+ h7 m# z
ip6tables -nL --line-numbers
! H: n# v% k% n. J' v
* i3 x' s, ^0 M使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
# Z' Z# u. J" K& w9 w. V: d5 \( s
! R% P4 G" Z4 n# vi /etc/sysconfig/ip6tables
' o" L y7 _( [1 d3 C可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)
) I7 } U$ q- D7 }*filter* E0 s2 `' w1 f: ]2 S! R* c
:INPUT ACCEPT [0:0]( x3 M# N* H% v5 P4 H$ y2 N
:FORWARD ACCEPT [0:0]& M0 l* o5 k% ~. K
:OUTPUT ACCEPT [0:0]
2 t, b& K; E( E( r* v4 E:RH-Firewall-1-INPUT - [0:0]
9 u1 }% \: _9 J8 Y, G-A INPUT -j RH-Firewall-1-INPUT+ [; k/ @: `; O- x' W
-A FORWARD -j RH-Firewall-1-INPUT
5 x7 A. J: M$ Y2 f" r" F* H- V) B-A RH-Firewall-1-INPUT -i lo -j ACCEPT
! @, O' L. { T$ O$ i-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
' e0 X$ Q8 d- X4 T) ]-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
+ E# h& W& t2 r, D/ i4 k-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
+ M+ y. t; Z6 _4 b-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT' z& u1 q o" b
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT" i0 F! L! I5 s( J$ l+ o
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
. |, C% D' [+ H8 l-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT' l/ Q. u1 l! {9 e( ]4 B7 k
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
# U5 o5 y6 d# s4 M' C-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT) L3 `0 x/ h' m. q U
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited# @6 D7 x) L6 ]- s- I4 b
COMMIT
$ ?8 C) |. Z6 W( Y; v) {2 z+ Z- |与 IPv4 的 iptables 规则类似,但又不完全相同。8 C7 x5 o# ~9 Q/ _ G
i. t9 \: ^. \& Y, I6 @
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
+ f: c1 y9 [& X* C$ O/ `0 Z: f- z3 J0 j. A: M4 D' ^/ m
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT. Q3 X' Z; o& M4 a: p, o
-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
' O$ E5 [; Q9 l0 L, G3 m) i+ S) J) b' ^: V7 e
要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
w$ F3 j% i/ E M) N- _ o2 @3 Y! U& E) T$ B: e
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT# @4 \" E0 ?0 h; S' n/ {" r
-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
9 J) q3 V* q3 ?5 s同时针对 tcp 和 udp 协议开启 53 端口。( e% |0 n+ I$ ~) m* X
) ~7 w2 h0 [& f& b/ X3 `+ [ p
要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:* `3 T% M5 e; r+ d6 b' k7 t1 A q: U
. b: x- J5 N, P0 v8 }% n- X1 R-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
# w2 K2 @- q6 _7 L9 R1 ?要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
6 U7 x/ o! u8 u( c* `* M: V2 c
# a1 l1 E% M7 K. `-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT5 Q8 x) k0 J6 @' b- S- l j3 }8 U
对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
5 j/ q; _2 O$ M8 B2 h
/ A. u+ B( [) } {* X! w, P-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited. \, @6 m; G- w' p
COMMIT
7 Z0 j' N' t5 P( B8 s! N6 w改为:
$ U5 N* [4 z: e, J1 C! s; Z9 `; F( V" O6 z3 o7 m0 p; t X6 s
-A RH-Firewall-1-INPUT -j LOG
# X- N4 @( ]/ i' O-A RH-Firewall-1-INPUT -j DROP( ~7 r- N- W" W; a4 Q/ F
COMMIT+ P/ T- q7 i% x5 W" G5 J
保存并关闭该文件。然后重新启动 ip6tables 防火墙:
8 W& i: c0 B: {" w) E, H
" y2 R( J9 m6 z7 M# service ip6tables restart
% N( [) [! I2 t" z3 g+ {8 ^+ [然后重新查看 ip6tables 规则,可以看到如下所示的输出:& J2 E" P9 c, O1 X
% _' T) Z8 z+ A( j/ V. _# ip6tables -vnL --line-numbers5 A* G/ m, P, o) |
输出示例:
4 w( ^0 Y0 Q; M/ W0 @! o1 A
( X% q! b& S9 i! Y6 r, O. SChain INPUT (policy ACCEPT 0 packets, 0 bytes)
4 ~; `2 O& d( S p1 |num pkts bytes target prot opt in out source destination% x2 t& X: w2 z! V; X
1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
6 ^8 u, C& u3 {4 e" m* b6 i+ d) XChain FORWARD (policy ACCEPT 0 packets, 0 bytes): X) s& D" P' |" Y( O% w
num pkts bytes target prot opt in out source destination' v) C+ X, L- |5 l& |$ K
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0
/ \8 P5 |( W, iChain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
+ |' {4 e+ K4 q& @num pkts bytes target prot opt in out source destination H; k4 ]4 l' z* g* ]" X
Chain RH-Firewall-1-INPUT (2 references)$ n& z$ |2 Q5 K6 J) n
num pkts bytes target prot opt in out source destination/ H7 N+ w: C* ]9 O9 h2 ]0 a$ z
1 6 656 ACCEPT all lo * ::/0 ::/0
+ N8 C0 N2 a2 e* n9 P9 B6 T2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0
1 B. W/ c# F/ M. E9 y3 0 0 ACCEPT esp * * ::/0 ::/0
8 b7 Y$ J# E( N, N6 b A. _4 0 0 ACCEPT ah * * ::/0 ::/0$ c' V9 U( S6 u7 O) v
5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:53535 k m+ F# f! r. O7 c
6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631/ A& V- o& X" m
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631/ Y" q2 @5 V1 Q5 C; b+ F. m' K$ q
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000# |% m" Y* Q( z- N! O, O$ \' J6 R
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
/ a$ p% t& ^( q6 L10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
1 A# v( O& }* V2 r# |! R. s, \7 L11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80* \! N9 \1 c2 r
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
' N; f# F) L' n6 }13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53+ @: m4 A% `, @
14 18 4196 REJECT all * * ::/0 ::/0" y$ d) F9 i# e7 M
IPv6 私有 IP¶9 D. O% W9 u. \+ }! U4 B
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?) c; g8 B* L% t0 ^$ @& R
+ E7 z! l$ G7 ]- m( _9 `) u不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。
9 B6 N4 G }( N7 h' P% h7 M! r4 e' s7 J5 e) h3 X# o$ V9 {6 Z
自动配置 IPv6 防火墙示例脚本¶) A1 R4 s; I% g/ b; V: [# {
与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。+ ` q( d+ B5 W+ g4 z0 C. \& ^6 s3 j7 @
& A) d6 w3 d& w# \% a#!/bin/bash w9 S) T9 Q/ G2 Y% F/ o
IPT6="/sbin/ip6tables"
9 P# g1 Y9 E' h( a% R+ ~PUBIF="eth1"* h6 s! C; V0 S. @7 n# B. _' l
echo "Starting IPv6 firewall..."
/ u' \ M3 T0 S1 q& h2 O$IPT6 -F
9 Y* c0 P6 }" [1 `& T2 r$ m; c) D$IPT6 -X: T M" o) F2 {( R. W& e7 u
$IPT6 -t mangle -F6 _% V" w4 c6 w1 L4 c# \& n
$IPT6 -t mangle -X
0 a: W f/ w t( n- v( P
7 e* p: t- u1 r0 o5 a/ I: b- F#unlimited access to loopback" m: Z l( N' [% m
$IPT6 -A INPUT -i lo -j ACCEPT* }9 N2 N, T9 t
$IPT6 -A OUTPUT -o lo -j ACCEPT$ @/ ^+ _ s# b: b* U& _; o& n2 h
; v W! a/ A" } x- a8 R3 [
# DROP all incomming traffic
Q8 O' M. F1 M$IPT6 -P INPUT DROP
u) ]& B7 E0 U$ T' {$IPT6 -P OUTPUT DROP
/ S% b( p# C: j) I$IPT6 -P FORWARD DROP6 q2 m" x# s5 U H" X3 F) T; f6 g
A# Z$ O2 e/ `- ?' a0 {
# Allow full outgoing connection but no incomming stuff' M$ T# i9 ?2 @& X$ q
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT- Z' ]" S0 U- u9 g/ U- Y4 j' ~
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT$ ^# q( y- ^+ E1 D5 p+ ^$ c, T
, q% [! o C3 e
# allow incoming ICMP ping pong stuff7 Z' x( s- P+ O
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT
7 I/ F( N8 c$ p. k' a$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT
9 ~5 x& E: k0 {7 |8 c0 k6 b! \. f, V% ]( c( g: \# i
############# START 在下面添加上自己的特殊规则 ############' i( k! J% F! {7 v4 u: M! t$ u
### open IPv6 port 80 + _' b/ l4 r, c' e- [; P2 {
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT9 g7 P7 l/ c R$ l* n8 b* D) A9 u
### open IPv6 port 22 N3 m) }* G1 t4 q
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT! d5 U( c4 n: E' N. h
### open IPv6 port 25+ ]/ ~/ a$ n1 r% s# {
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT3 d$ M9 e' p4 u0 O$ U% D* K
############ END 自己特殊规则结束 ################
. u$ j$ L& N& H c, y8 ] u `
& V6 |3 Z" Q* N" u& h! H& k( e#### no need to edit below ###
! m% E, U! e" H+ R4 q# log everything else# F9 c b1 V! K [5 Y
$IPT6 -A INPUT -i $PUBIF -j LOG
+ N. R4 e" }2 B7 h# j- f, M5 S' t$IPT6 -A INPUT -i $PUBIF -j DROP |
|