|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
3 W$ @& W* v( j4 k! q( j+ }9 n) Q+ ^+ Q) H+ v5 u
在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:# j4 D* u# Z( H! ~
ip6tables -nL --line-numbers
8 {5 L- s3 G5 |9 N# d
1 q# Y% S4 d' t( @; ^0 S" Y; F+ a使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
Q6 ?- V: G& K5 _
3 Q' ]5 s6 w& e* X4 e E4 c# vi /etc/sysconfig/ip6tables
3 Z! [" W) h0 ?可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)
. Z" Y$ }. [5 c+ a& q*filter D0 S( b1 f, T$ W3 ~# i) g
:INPUT ACCEPT [0:0]
2 w% j3 {$ `2 m! H: o8 a7 k# X:FORWARD ACCEPT [0:0]+ e6 _- r9 _* `& E. ]& P, g
:OUTPUT ACCEPT [0:0] B4 J. Q' \6 i6 q* }. u
:RH-Firewall-1-INPUT - [0:0]
4 D4 Y5 u7 [9 B5 K( X3 C+ V- o-A INPUT -j RH-Firewall-1-INPUT
! T% h' o! S8 l-A FORWARD -j RH-Firewall-1-INPUT" v" m) z; P2 m
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
- _1 R1 q( V2 @" A: L" ?. V-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
8 q7 {5 i/ X: O; w-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
g; l$ ?9 [, v( [3 s3 n" r-A RH-Firewall-1-INPUT -p 51 -j ACCEPT7 a! o0 L3 _$ B* k) ]' Z- j
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT3 {9 S, \' T! k1 b
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
+ J* i1 f. u$ I9 n7 \-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT& K/ d: }! V+ a
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
U8 k' ^+ o1 p-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
v7 X2 T3 W% p t: j) `-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
/ s u- U6 u+ X( s- u! n# R7 P6 n-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited- `. C, E3 Z% z# |3 m/ }+ B0 Z% E
COMMIT1 C1 m, x4 m& |" X& P0 a* ?
与 IPv4 的 iptables 规则类似,但又不完全相同。0 I, y( ^. w# u
* m# t8 h3 | q! N4 i
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
( q7 U Y1 b) t; Y6 M+ \7 P V1 I
3 }0 x4 y! K8 i' O+ O-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
$ n& \( j$ m, a7 _! W& J1 E-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。) q2 M. Q0 {0 c
0 E c" E8 M& r要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则: f$ w' e/ ]: j
- R+ t# ?& o% J5 f" G- b
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
6 H% G" _# A6 a-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT7 `! B: o) V0 ~5 }9 K4 E" o/ D& v# }
同时针对 tcp 和 udp 协议开启 53 端口。
8 d/ f5 `; Q/ Y' \2 k: E( Y& a
# u2 p' c* B& C' K! k! w* G1 h要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:7 T, C) g! X" d+ f( v
* Y. q! X, ^1 ~' D# W' V! ?0 Y1 u" _8 r-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
; R/ ]* W3 ~% Z7 X6 r3 r5 q要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
4 M; h* W, W* A) h3 J+ E) l Z) b6 c9 W/ |
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
) ~( |$ L5 ?) l, T D对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:3 w4 i& W) j$ v+ X
/ j2 ^ {5 R8 }' ~) `% h; v$ F: {
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
( U0 S" a+ r6 v9 GCOMMIT3 T% x2 C9 w1 P+ r. n) n0 ?/ G
改为:9 J, `# J' z1 e9 j6 s9 }
3 I3 w9 Y3 j# M# x, @( r% ^
-A RH-Firewall-1-INPUT -j LOG
1 x/ r* s' g2 [' `* p6 q-A RH-Firewall-1-INPUT -j DROP# q) e6 M7 J! j$ W
COMMIT. G" ]; A. m9 t" C4 ~! O* c
保存并关闭该文件。然后重新启动 ip6tables 防火墙:
6 x1 g6 E9 k( N5 g- O. u6 m8 K" H- l5 O2 v% t$ z" E
# service ip6tables restart6 _) q- C7 d7 ~# C& l* L; ^/ ]9 u2 y
然后重新查看 ip6tables 规则,可以看到如下所示的输出:8 W* H$ A; Z' s( a
9 y; t3 l0 H5 Y5 J# ip6tables -vnL --line-numbers
7 A1 z3 t& l4 b; i输出示例:
* F4 m" ]% N. d$ N( c. q: D4 X' @& b
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
+ z E7 |3 j) c$ V' U$ rnum pkts bytes target prot opt in out source destination7 X% s9 T, g+ l6 M6 o* f
1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
]* ]- e! p/ H& ^0 t QChain FORWARD (policy ACCEPT 0 packets, 0 bytes)3 S" ]. i( N2 y1 {
num pkts bytes target prot opt in out source destination
. I8 J' s4 [7 a* [- T1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/05 [' i5 i/ X, ?& ?% P: J2 B
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
) h$ F5 c3 t+ [7 O( P3 `num pkts bytes target prot opt in out source destination: ]5 C1 c: D. m* A! Q
Chain RH-Firewall-1-INPUT (2 references) k9 ^- B k6 V" R$ S1 ^
num pkts bytes target prot opt in out source destination0 X, B) {- G" I- w5 [
1 6 656 ACCEPT all lo * ::/0 ::/0
; q$ f% K# g1 h A p) _2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0& _" k4 u) c( X0 |4 O+ r6 q
3 0 0 ACCEPT esp * * ::/0 ::/0) H; V! ~7 I' `% k+ ]9 X0 _
4 0 0 ACCEPT ah * * ::/0 ::/00 ~8 p$ u% H/ z3 C' r; Q( a; u2 M* {
5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
( a$ H' s+ y- F+ Y. k7 D S1 g* Q6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631+ b; a2 u r K- I/ \& M
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631
3 R2 Q8 S) I+ W8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000( L) @# n5 h1 Y3 W
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
5 @3 @. k3 e- r! |10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
- n y& Z5 m4 F, i2 T% ^11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80* k- B. C5 d5 |
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
- R7 N: \9 z. k2 Q3 d' I/ D- N13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
8 p% |6 c4 T& `" i4 B14 18 4196 REJECT all * * ::/0 ::/0$ q$ L1 _& X7 e6 B- j
IPv6 私有 IP¶& i1 ^9 }. q% z0 h) }; C
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?
% d8 V( i3 E* H3 U4 v3 I
& N" [. s& S' t不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。/ v1 \! s6 @1 h+ c: {
" U: N T1 z6 h# I
自动配置 IPv6 防火墙示例脚本¶
6 K4 g# ?/ F7 V9 D4 z- H) s与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。
& n* F7 ?3 }. T9 Z* g) O5 ]- G+ }% C* V" P
#!/bin/bash
+ M8 R: T" I0 H! N/ h' S' VIPT6="/sbin/ip6tables"& S e& \ S- U+ z
PUBIF="eth1"
5 M1 [8 e5 m" V/ @. @echo "Starting IPv6 firewall..."
t+ U" q9 w; l$IPT6 -F
) {9 J$ ?* W3 q" V5 V$IPT6 -X
5 r: q7 s5 p7 D! m$IPT6 -t mangle -F
) G7 p( X U( ~% D4 s$IPT6 -t mangle -X8 U+ U( D9 U2 B, m: A! R
0 t! {' o( I' g4 ?/ ^4 F
#unlimited access to loopback; E7 A/ _9 ?3 g# n6 a+ h/ S
$IPT6 -A INPUT -i lo -j ACCEPT
3 A" w* G/ [. g4 ^3 F+ R2 a$IPT6 -A OUTPUT -o lo -j ACCEPT
6 y% K: `+ f. H/ D+ N% p& k$ _+ u% P5 w
# DROP all incomming traffic
7 }4 q% f' f; q4 R7 W2 a- i: v$IPT6 -P INPUT DROP" T! t& Z) N! }' a
$IPT6 -P OUTPUT DROP
& o+ d, w/ ]% G9 k$IPT6 -P FORWARD DROP4 X( G5 K9 a, ?5 _2 F: v$ c
8 ?. P- _7 Q0 K$ h0 @# Allow full outgoing connection but no incomming stuff |0 _4 D8 ~ H: [
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT' S8 O; _+ ~6 y
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT2 L0 @$ j7 S2 C& i. V5 H* ` e. m# @
# s7 z' T8 Y: v) |% V7 E- N' b
# allow incoming ICMP ping pong stuff
7 i) ~5 ^2 r9 S$ t1 [" N4 m) m' o- k$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT
3 @6 s$ {& H" O" V2 i) }( k5 [$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT2 o& C- Y/ b6 M+ a4 G1 f* w
9 N8 _& C9 b2 _. f& s* D: Q$ K9 }0 J
############# START 在下面添加上自己的特殊规则 ############
+ n4 G0 @. P8 l& |0 M### open IPv6 port 80
% I( E- t+ A: s" c. R#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT; l0 F- [5 N# w
### open IPv6 port 22/ G1 T8 W' C/ g# u7 k" z
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
0 q" c* {+ g, h5 q) L### open IPv6 port 25; w3 C2 V4 ~, P9 S
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT
A: f% b8 Y! T8 j) ?5 |5 ?############ END 自己特殊规则结束 ################. s4 K' D' w/ Y9 t( N4 L. n" C. t
- d: S5 [5 H% r0 c! \2 I9 x0 V#### no need to edit below ###' M" ? ? u, d5 x
# log everything else
& i* E' Q: ]/ \; ~: M$IPT6 -A INPUT -i $PUBIF -j LOG8 u: t) R. g4 ~. S
$IPT6 -A INPUT -i $PUBIF -j DROP |
|