|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
5 Q% f4 O% E+ |
- b1 f5 E9 M1 G2 `2 z在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:
! T: l2 F3 Z# R) I$ u) W7 C ip6tables -nL --line-numbers
6 u1 x$ J4 k# \. N4 u8 @0 \( `; O, L, Q
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
& h3 A2 t" ?1 d, l$ ]" Q6 ~. }. `; h7 G/ t5 i8 G2 _
# vi /etc/sysconfig/ip6tables3 q4 {- V$ l! L" Z$ f
可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)
5 L9 d; f% D# `9 O* X* e9 o*filter
* m0 g/ ^) H5 }3 j% |:INPUT ACCEPT [0:0]4 @7 Q4 D7 T* z' I: K
:FORWARD ACCEPT [0:0]
# T# J! W4 Q1 U6 V0 Y( w' \:OUTPUT ACCEPT [0:0]) p9 S% z& l: m5 r. E- F5 w
:RH-Firewall-1-INPUT - [0:0]
, ]' F9 g, r4 U: o" G% g-A INPUT -j RH-Firewall-1-INPUT- {; c8 R* t% `1 a" ]. U0 p
-A FORWARD -j RH-Firewall-1-INPUT
3 {, `0 Y1 f# D-A RH-Firewall-1-INPUT -i lo -j ACCEPT. k" @1 N6 ~) P- S8 g* k& z
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
* a$ m0 i1 I. v3 p" @-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
' y M9 c4 Z4 Y9 o' U5 @-A RH-Firewall-1-INPUT -p 51 -j ACCEPT5 u4 I" z; c5 ^) A; M
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
. @2 b8 B9 K4 M! ] c& T-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
1 G* _; [; f& O7 \2 ?5 ~-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT6 k. }+ W6 \- |+ N5 L
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT7 P' v3 ^2 C# x. U ?
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
6 a1 i* y7 Y+ t9 O% i-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
( n7 c) S2 A' l6 i" V8 ?-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
7 L$ E* M* b5 k; [COMMIT
; x5 y7 w* h: Q ^7 \与 IPv4 的 iptables 规则类似,但又不完全相同。
" i; j6 s8 Q E9 V8 ^+ p9 Z( q3 \0 q! L$ U+ b4 r4 V6 ^
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:& @; Q+ O, S* Z. W2 i1 s
7 @- j7 ?. W; n9 ]7 |: d' q
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT. C, g7 U5 [" S) b& U/ W3 l. A
-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。: O C8 Y9 X$ z) y0 R6 H
3 ]% E6 o4 I9 d- R
要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
4 ]# G! a3 r9 X* a8 _8 p
1 a& F- J/ v# l! s-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
4 V2 c% _7 G7 G+ L) ~6 K: X! u-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT" E; {4 a' { q* R% w+ a
同时针对 tcp 和 udp 协议开启 53 端口。
! @+ ?6 }( @3 ]* X! y/ i; J t2 i( b- ?
要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
5 @) O9 ]0 R1 E/ h! ?( N" Y6 m
& \& z. l1 d- Q( g-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT: R) Q# K1 {* j; z$ S/ ~
要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:8 a5 u* V7 l5 W6 Z
# @ B" i5 Z9 i. R* n# W
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
. H" o3 D2 J$ q/ | Z对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
% v" W& `+ A6 h2 }) L7 H$ g5 L' C9 L% g: y+ d9 w
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited: s" M; V+ E/ u* B6 Z3 o3 m3 |
COMMIT& U. j' ^2 ]+ A( I
改为:
8 c! {' H4 {( J7 x- J: X' K9 J, w% L% ]$ Q Z8 d8 b
-A RH-Firewall-1-INPUT -j LOG
- D, A2 s z9 B& m7 e$ o-A RH-Firewall-1-INPUT -j DROP
- B$ s' _' Y. p& D% H! _% D& GCOMMIT
/ T- m% k+ \* v保存并关闭该文件。然后重新启动 ip6tables 防火墙: F6 U. h9 A" R0 \1 H
( [! R6 i0 r/ D; r+ L+ U
# service ip6tables restart) D; j; f# O0 G* u/ r/ I
然后重新查看 ip6tables 规则,可以看到如下所示的输出:' ~& S8 E& l/ v
- n% c: i! e$ N, Y: f- e5 l! P
# ip6tables -vnL --line-numbers! Z" Z" t( {8 k
输出示例:
3 ]+ A; m1 X. [; Q* c0 J
. |, ?' D0 c- _6 G! s! \, o) hChain INPUT (policy ACCEPT 0 packets, 0 bytes)! e5 a# y' q, m) p7 P
num pkts bytes target prot opt in out source destination/ Y' A" I5 ^& |0 [/ }
1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
, ]$ o& X% T! `& k m' CChain FORWARD (policy ACCEPT 0 packets, 0 bytes)" G( |/ ^7 J7 a3 B6 V; {
num pkts bytes target prot opt in out source destination1 N5 M/ a$ U; m0 M5 g( h' x* D
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0& F4 K1 z& `5 D, V- z
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes): e O& _- e) Z0 Q+ W" q
num pkts bytes target prot opt in out source destination
, X2 K/ A9 `$ }' H: W3 [( z PChain RH-Firewall-1-INPUT (2 references)
( T6 C1 U0 }* C) c4 e" T( G% anum pkts bytes target prot opt in out source destination
0 Y5 U T- D8 C! h1 6 656 ACCEPT all lo * ::/0 ::/0) J3 d4 [: j3 V2 m
2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0$ d3 J6 k2 M1 c& E. x& A' B) ?
3 0 0 ACCEPT esp * * ::/0 ::/0# y2 F' I1 N& U# X
4 0 0 ACCEPT ah * * ::/0 ::/05 p! j* |' u; U, v
5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:53538 n/ {9 Z6 A- m1 W; d+ a
6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631 X% a8 v, |. `% U
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631
0 e. i7 {! f; ]8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000/ |' m5 W$ ?( _5 Z
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
$ w1 @! _2 v9 V; t1 W( y2 r3 _+ Y10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
$ y: n1 O O# ^+ ^/ n11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80
- k, h1 Q( b! O12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53! j* i1 l3 t0 H5 T0 f* l, h0 A
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
% C( A0 _5 k4 I. k14 18 4196 REJECT all * * ::/0 ::/0
. ]" Q0 Q( S( A [IPv6 私有 IP¶* Y. |0 K3 F( w7 M6 ~
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?
' t; a4 l; A) P+ K, V% M
& m8 a( W) k- B u不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。* N1 w [- O I5 E! `% w) `( d3 n
% ~4 D8 i9 ^3 P自动配置 IPv6 防火墙示例脚本¶$ ~. Q$ ?! N4 O0 f) T
与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。
# I- s. a: B! _* ?( F* ~8 ?6 e; F: K6 Q; b+ D) Q+ g
#!/bin/bash" E7 s; P! M( T) Q
IPT6="/sbin/ip6tables"
2 k* ^ s8 I; f; I! J. {PUBIF="eth1"; |0 p3 n; V8 U7 u
echo "Starting IPv6 firewall..."
8 a5 v/ E3 G4 x$IPT6 -F# S3 H. w# ?/ A
$IPT6 -X2 y, B% x0 d( @1 }' Y
$IPT6 -t mangle -F+ n' m" U& Z% r
$IPT6 -t mangle -X. Y& Y7 `3 k5 K4 G9 w1 } ?9 f
8 i& T& | Z- H) w9 y9 d7 ?
#unlimited access to loopback, c( b1 C1 F& M/ ?7 ~: l3 k% c" e/ O& r
$IPT6 -A INPUT -i lo -j ACCEPT/ M- { b% H+ m# z# \* {/ n
$IPT6 -A OUTPUT -o lo -j ACCEPT
9 C0 C9 t4 ]4 d3 B N1 F. [4 {7 w0 p" E- T* q+ T5 g- O
# DROP all incomming traffic& ?5 s3 D5 I1 t! x
$IPT6 -P INPUT DROP- i6 y% O: |1 Y( X; S5 r7 ?
$IPT6 -P OUTPUT DROP
0 f5 q& l4 v, v$IPT6 -P FORWARD DROP
# s# \/ A) }8 X$ R
2 u# n9 E, z8 [' h# Allow full outgoing connection but no incomming stuff
4 ]% b% \: u$ T: F$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT$ q7 \2 x! I$ S) Y2 o
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
+ ]8 K/ m! B& X/ }# t8 ]5 v9 u# Z9 e3 }
$ h5 f: i5 [3 i( L; C3 t8 X# allow incoming ICMP ping pong stuff$ l# r' g+ @" C
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT
/ }. H+ g3 r8 C8 R/ p+ E$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT4 h0 E e: Y) j; p+ Q5 C
8 c6 K) l( B$ I
############# START 在下面添加上自己的特殊规则 ############
( C" M2 G. p: y### open IPv6 port 80
9 D% s, ]& r2 S! [5 M#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT6 p$ V7 B- r; M
### open IPv6 port 226 G4 `! {# M/ K$ j( |# I. Q
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
; A, {* e3 O5 S$ I- R$ X5 Z### open IPv6 port 25( C- W/ X& e: ?( F* R/ V
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT; }0 t% B: U7 L/ Y/ B2 M
############ END 自己特殊规则结束 ################ X: [5 g+ V7 r1 e. w$ J9 j# z- ?
6 K4 ?, ?, r$ S% K' }9 T l/ | \#### no need to edit below ###+ r( U5 e* x0 h; o$ N# p( B1 f
# log everything else
; Z& a4 U4 V. k5 d! h6 L3 T$IPT6 -A INPUT -i $PUBIF -j LOG j k" x% I- R) |, }! o6 h1 G& X
$IPT6 -A INPUT -i $PUBIF -j DROP |
|