|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
: H, J/ J4 S# ~
; }2 H' d" g7 U; G在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:
8 G. e3 a$ r2 H2 w9 ]( Q" s- W ip6tables -nL --line-numbers
& j, g, {+ J# y: z# r1 Y, J2 u% F8 y$ |6 }1 ^
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:: q& m/ K( j/ A5 c
( u/ w( U9 P% N* ?0 o7 e& @
# vi /etc/sysconfig/ip6tables3 y' d" t5 [ e4 m5 l
可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)1 l& @% @+ G8 I
*filter
; }- `/ d1 x( n1 }6 Q:INPUT ACCEPT [0:0]
+ |; |$ _+ q0 C/ U# V:FORWARD ACCEPT [0:0]
. z$ t( C& @& K& [' {:OUTPUT ACCEPT [0:0]
6 A8 P) u# L) q; z6 ]:RH-Firewall-1-INPUT - [0:0]
( x+ i2 B8 B/ F6 _- c-A INPUT -j RH-Firewall-1-INPUT
7 n0 S4 P9 g$ d6 v& l, T& n4 n-A FORWARD -j RH-Firewall-1-INPUT
& K+ U0 t: K, c3 s$ k. @) A' h-A RH-Firewall-1-INPUT -i lo -j ACCEPT
* Z, M8 u4 ^: x$ y& h9 \-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT2 \" x8 d/ H$ J, Y
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
q; Z3 `7 x" {; ~" s9 V-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
3 S9 Q2 _ `( B9 n3 ?7 Z2 Q2 Q-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
6 O1 k+ f; n( K9 K$ @3 n0 h-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT% ?6 C( f, d0 o) S, K2 n7 t) q1 b9 q
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
' w$ n2 J& @ W, D+ `-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
5 z9 B2 m2 _' g# t: Q0 Q1 T) m+ A( G-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT3 Q- y+ f( x4 L% K' w0 p4 x- @
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
) f1 c: C1 j% T' c-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
, ^. b% G: @' }COMMIT$ X0 J- J5 Q' i4 f/ T" C; ^$ n
与 IPv4 的 iptables 规则类似,但又不完全相同。. A+ B* q5 h# ]0 J' \ v! I2 v, [
6 a9 W0 |7 a2 b% \' o
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:0 J% W+ [! R) A1 C7 V
2 B/ V) G, D9 V. z6 J% w-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT! m. D' u% e& v$ x
-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。( W3 }8 K( N" }' G) E8 w) Q& B; Y5 w6 e
# D2 `. j6 ]$ s7 N! Y2 H8 |要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
5 ?9 s# u' u& R- w: J! `; n- ]3 C/ |: r% M! P0 d
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
2 c! A+ P, N( Z" i5 l9 I-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
" t. S7 d0 U+ q& S- }4 R$ ?同时针对 tcp 和 udp 协议开启 53 端口。
9 u8 r4 Y% Q1 P; [. c1 \/ {' z% U& c9 P1 T! Z6 e$ k# z8 f
要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
0 r6 B( y+ x9 t7 @/ L* t, h! Z. e% K( l: _+ {1 l3 D- E4 m3 m
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
v5 k, S0 [; O1 s要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
. t% k# M& t. @6 V
# F6 a V4 ?/ N/ D+ Y3 ? l/ l& A1 |-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
5 U" F5 E: @5 B对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:; ^1 K; S! k# O4 J k3 M. U$ _
0 F7 @" _) V7 D7 U T. ~) x-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited/ b9 X5 Z! I. U4 b; f* O
COMMIT
2 N# J4 @5 ]( q# x0 X改为:2 n3 F1 T! n |2 [$ b. E6 X
& o6 U# ~, G' v& X* {
-A RH-Firewall-1-INPUT -j LOG T7 n: u0 [; ]- b L k
-A RH-Firewall-1-INPUT -j DROP
- c4 b$ q7 k6 M7 s( S0 RCOMMIT3 k+ X7 I- M# ]9 [. F) y3 |
保存并关闭该文件。然后重新启动 ip6tables 防火墙:6 p8 g# Z+ @- v. J1 M0 |; R( @
3 a/ X) R, L/ Z; p% `# service ip6tables restart
5 r$ x4 Z1 C) Y. S+ k$ p然后重新查看 ip6tables 规则,可以看到如下所示的输出:
* q; q. A( z1 k) L U! }6 M* h9 ]9 `+ @% u4 t a* F5 }
# ip6tables -vnL --line-numbers2 D* i B; q2 ?7 T" |4 N& H! |, n, H
输出示例:
' F7 O+ K- @$ k* N- \
2 \. _. I" L) Y6 }Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
8 w# `) K: A; l& W# K/ `+ @num pkts bytes target prot opt in out source destination
3 d! f5 N, Y) L- q1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0! U) ~( a. x( O
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes). t: B& a2 j$ D& r4 N
num pkts bytes target prot opt in out source destination, U$ j% e; T3 ^5 }/ e" F
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0
& C/ Z' T9 M) x. f N5 ]( KChain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
5 {) d/ A& R2 t1 wnum pkts bytes target prot opt in out source destination- T4 B! s' N2 K8 L4 Y% {
Chain RH-Firewall-1-INPUT (2 references)
+ f1 G, w' L# R6 gnum pkts bytes target prot opt in out source destination
3 n+ E* _( K2 |1 m- j1 l1 6 656 ACCEPT all lo * ::/0 ::/0
) a" H5 Y3 n- U/ l$ p2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0
+ F: ^- S- l+ U s+ ]0 x+ n3 0 0 ACCEPT esp * * ::/0 ::/06 Z9 F; B- E$ h2 M" F5 f; m2 T
4 0 0 ACCEPT ah * * ::/0 ::/0
# x$ c8 y& B/ [5 V! Z1 U1 ~* K1 g) y5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:53534 h% i1 J! n! b/ s+ V
6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:6310 N; v/ B1 Y! E! m' Z
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:6316 C+ g) g t" i, R- r; m4 g+ ~, q
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000
. ~) |) j; I) B; Y- b9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x024 R/ j& Z* p0 b N7 x
10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:222 @6 C, f2 M l" r# a0 P" T$ X
11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:803 |2 ], ^" G5 Y9 f1 R! {
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53: c+ g. S3 [- L/ q9 R1 ~
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53' X' Y2 s5 [/ T: b
14 18 4196 REJECT all * * ::/0 ::/0 `& f# E ^7 P. K5 f* _" D, @
IPv6 私有 IP¶) i8 k2 [$ i+ o$ S {0 r7 b3 L
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?7 e; P1 ?6 t+ e3 `4 \5 K
; J& S: f2 }4 |$ J( J) H" f不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。
' e8 b2 _7 J6 ?" ~- G) z+ U$ i2 m: T2 e! z
自动配置 IPv6 防火墙示例脚本¶
& j" E1 i, ?$ M0 Y与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。
- c* D7 K3 a; M3 T6 S) v" d+ C
" N9 Z! k9 y& a- p2 ?% M: [$ H#!/bin/bash; V; r: v+ M" f9 Z
IPT6="/sbin/ip6tables"- C% |! d: r* z6 h7 t' B
PUBIF="eth1"1 q. O w: O" {% D$ y/ T
echo "Starting IPv6 firewall..."6 {. O) `3 c# L
$IPT6 -F
/ Q' T0 ?* }/ q) J" W) d$IPT6 -X2 e* x/ C, ~- I- p! u, `0 f( E
$IPT6 -t mangle -F
2 r0 Q4 t6 t. f$IPT6 -t mangle -X
9 ~7 S! }. P4 @4 M8 M. z& Q! G. w5 J5 O2 c3 n+ s+ d
#unlimited access to loopback
* }* S1 C5 d' J6 u) U" e$IPT6 -A INPUT -i lo -j ACCEPT
, L9 G& t! I& u: J B1 F$IPT6 -A OUTPUT -o lo -j ACCEPT5 c2 h/ }% ]5 u; j N! }) o
% X5 b; O! f3 A& l# E8 `8 ?! @
# DROP all incomming traffic
- g+ U0 S2 _5 X! F6 X$IPT6 -P INPUT DROP
* L! _* m) a6 m/ E; w$IPT6 -P OUTPUT DROP' G, x6 C; @ o8 Y7 l
$IPT6 -P FORWARD DROP7 d& h! J; V6 V" N3 I7 A; ^7 P* K1 s% K
# Y3 Y Z" h6 W
# Allow full outgoing connection but no incomming stuff
s& K m: E$ @4 }$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT$ K/ C! [4 u( C9 p5 k2 P. |
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
5 X! z% o. z$ J, A! p) e/ y- l/ _" s8 H1 a5 r$ x8 F
# allow incoming ICMP ping pong stuff) I2 N% W' G% ]6 P) c+ ?) h
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT
% |1 R9 d3 ^" w% K, R$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT5 R9 H2 \& H4 ~2 p0 m, {' |! y. ?8 ]
' c/ i2 L. j" P6 D& d% D% s# i############# START 在下面添加上自己的特殊规则 ############9 v7 C1 f1 i& W7 I
### open IPv6 port 80
. d8 y9 j+ r. `0 j#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
5 O3 P+ g* N/ e) h$ H; U### open IPv6 port 227 h( C! L6 R2 @7 }
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT( H- ?1 |8 x5 j w1 `- v+ `- J. W
### open IPv6 port 25$ a0 x; z+ e. H) ~" W5 n
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT
0 ?, R+ X$ C& `7 Z# ` d############ END 自己特殊规则结束 ################% _; F+ u% o/ `! f
% o* I+ l- C! W& W#### no need to edit below ###' c% p+ D+ v9 ]. F$ R$ p- u4 Q
# log everything else
1 Z! \4 q. m5 r- y$IPT6 -A INPUT -i $PUBIF -j LOG
+ n, d7 D' E: B5 \$IPT6 -A INPUT -i $PUBIF -j DROP |
|