|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
8 e. u2 ^7 A% G1 `
; n$ }. ?! Z, @& d1 A# r. z在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:5 U S% ~" o; S0 h9 W4 F8 h
ip6tables -nL --line-numbers" {8 _- y3 G! P+ ^9 e; @
/ i* H5 p& O. U" v, k; |/ @8 K使用编辑器编辑 /etc/sysconfig/ip6tables 文件:: C# o9 x# y, b# i
+ W! |4 \4 E/ Q* P/ A1 n) _6 o
# vi /etc/sysconfig/ip6tables& m3 \- U) Y& @, m4 B/ _# o
可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)
: n" S/ f( [- ], a! K" [9 V*filter4 [ T. z; `3 a3 b8 y: A
:INPUT ACCEPT [0:0]
; m0 @. l/ H/ V0 ~:FORWARD ACCEPT [0:0]! i3 q' b, `' H. V
:OUTPUT ACCEPT [0:0]
3 w, M% D" \" z:RH-Firewall-1-INPUT - [0:0]7 `2 s3 r9 ?( p' j( J! j) t; S/ n1 E
-A INPUT -j RH-Firewall-1-INPUT) H# l7 v8 O) g- }
-A FORWARD -j RH-Firewall-1-INPUT) x. h! F) m+ @$ r9 |0 z
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
3 f5 b1 e! i- h' Q, P-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT, I2 z' |) k$ F ?- C( w9 f
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
" r) f n1 z3 ~" q. q-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
7 V$ M, U& O# ?" J! o-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT. R: d" H( `' O' l0 @
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
9 S. O E$ E7 t9 h. G# h5 N9 `-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT* x: Y6 s9 m% P c! p
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT! H0 p) J. t! X: B
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT6 Q' k" }6 B) ?8 \
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
' f4 l [# A! W. _7 s-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited8 @8 R' `/ {. ~7 [) n; }" ~
COMMIT
/ n) `% o1 K/ d+ Q/ Q- D与 IPv4 的 iptables 规则类似,但又不完全相同。
3 q! M% Z( l; m+ M* u: V4 j8 V+ n
4 G* `$ w. y7 q. ^! T H要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:$ n2 n' K* q1 G! X3 O
8 O3 H8 C8 g( t- N
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT- \ w% O8 i: c# v/ C
-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。; n% s) l1 D6 u1 K+ c5 s
# ~; H! P& L& \8 n6 Y要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
6 S4 w) N* u, s, `8 g+ g4 T5 P2 B/ c! v* }0 F
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
7 M |5 ? |5 I z* G: A8 L" u-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT$ f$ h x6 L f% T' Y: A2 _& \
同时针对 tcp 和 udp 协议开启 53 端口。
, q0 J# ]: u. T+ M% B [ @) }; S9 o' Y5 ^3 P& [/ m9 x9 S
要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
3 o6 R5 d2 U2 t" Z# d) t- Q! K7 J9 u* D3 b* u1 j8 {, s
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
. R% F6 N' C7 B7 G. d1 t) e/ \' G要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:7 N' W% [3 ?. R7 u, H+ |
1 ]' E/ _5 V6 z1 ^! X; q0 C0 s" J-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT) y/ x7 G/ [7 U# ~ J
对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
2 u2 b, s' ?' G9 L# B, |) \' J r& @; t) \) I
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
- p4 Q2 y. J3 I/ |: lCOMMIT
. @/ q: v; g8 W8 z3 x) P! Y6 H8 T" j改为:
" c5 u+ G! q3 A
8 Z5 ^: r" |# d! N4 y* d# ?+ c0 E-A RH-Firewall-1-INPUT -j LOG, k6 ^) z) o1 A! r' ~# r3 t
-A RH-Firewall-1-INPUT -j DROP
+ r f9 G$ m# l0 Z+ SCOMMIT5 w0 k" u. @8 ]1 g5 d a7 i* c% ~
保存并关闭该文件。然后重新启动 ip6tables 防火墙:. M" D$ @1 R+ `" s5 r- O/ z
' h$ h# S/ g7 k' [2 E# service ip6tables restart
* |# c }8 }. k) c然后重新查看 ip6tables 规则,可以看到如下所示的输出:
% M6 T# [5 m4 {- x+ h* E9 m
) t% C( u: W3 n- x5 i5 m# ip6tables -vnL --line-numbers
3 j* K) I8 W! J0 S输出示例:) c5 r4 y# g" k
; m i3 e5 u" V, g7 ~
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)" x$ P3 n, w$ r, U/ N
num pkts bytes target prot opt in out source destination
0 J6 i2 t9 i' D& l( [/ y9 o1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0+ N5 Q* {( I- J% R4 r
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)" ^2 G# a4 N+ z% ~2 x
num pkts bytes target prot opt in out source destination6 j/ L/ T7 D: |! M9 {3 }0 c' g! M! S
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/07 @5 c% A3 f" b; g& t+ P
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)! ]# {2 @( n) a' z6 t
num pkts bytes target prot opt in out source destination
; S' k( d1 q5 f) ^; SChain RH-Firewall-1-INPUT (2 references)( |7 R- }) T; w
num pkts bytes target prot opt in out source destination
# ^% A: o$ p( O Q1 6 656 ACCEPT all lo * ::/0 ::/0
! P4 Q! q+ E! U( ^2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0; ], w1 f& c+ S% U a
3 0 0 ACCEPT esp * * ::/0 ::/0
2 F9 ]! M2 l0 r2 ^7 g8 U H4 0 0 ACCEPT ah * * ::/0 ::/0
! @: d0 J8 n9 `$ b7 b( y# |' U5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:53535 |8 h( X2 o# A% R7 j p
6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:6316 @4 u9 v( q* h3 K% I
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631
j- K1 j& Q" M5 i1 F8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000
6 F0 F" }4 q: N1 F9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02/ ?& I/ o1 s% p( W$ T& _2 c
10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:225 [/ `0 o, G% j
11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80, f8 v- p! l1 a$ A# ^
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53& u& F! T/ f. [% k' v, V
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
" `+ B& b0 B( z% N/ D14 18 4196 REJECT all * * ::/0 ::/05 c K% [ o2 a# r2 C
IPv6 私有 IP¶
' E. g4 S, ?4 I% e$ fIPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?
N+ S+ a: _; {3 q# I5 d
& p {4 W, x; A不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。! K5 u$ ?7 |! u8 `
; u4 h" i: C9 v4 J( b* m自动配置 IPv6 防火墙示例脚本¶
' D& t# J5 @) t' B# W3 R2 d/ l% F2 [与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。; z: S3 p, x3 {0 b8 D
* y1 C5 O7 Y) M, l+ u9 Q( ^5 E
#!/bin/bash
2 k; o3 i' V9 U5 e- X# kIPT6="/sbin/ip6tables"
! I4 K3 `7 C- M$ Q4 JPUBIF="eth1"
3 b) E) W6 E/ T9 [2 v* x& r: r2 _+ \echo "Starting IPv6 firewall..."
8 ^" A9 |( ~3 D2 C, I. t$IPT6 -F
4 q8 r) W- i% J( |0 B6 P$IPT6 -X
* C; O# X- ^8 w* b+ ]7 |$IPT6 -t mangle -F
( k: N# {4 i) V0 }$IPT6 -t mangle -X# C+ y. I) V8 x5 O& W; o! i
8 ?; j- A" X8 p: H#unlimited access to loopback$ E3 x7 R: r8 n V B6 F
$IPT6 -A INPUT -i lo -j ACCEPT+ k0 z. l6 h% q" `, F3 w
$IPT6 -A OUTPUT -o lo -j ACCEPT+ v+ \% Q. o5 Z5 m
: e& H6 n% j% v/ [+ [) M- S8 h1 C+ c$ z# DROP all incomming traffic, f+ Z8 D/ A- j# H
$IPT6 -P INPUT DROP
, H; c" u0 V3 I# v$IPT6 -P OUTPUT DROP/ [+ D# n# F K) k' |3 t& Z8 |
$IPT6 -P FORWARD DROP
! A4 a2 r+ F& v- K9 i. F# Y
8 Q z* \: J3 j* ~# Allow full outgoing connection but no incomming stuff! h0 W0 S! z9 g: Z
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
3 j Q- u3 s% g$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
& i. O, j5 y* m# n' \4 j/ d/ U/ j& a9 b0 l: K
# allow incoming ICMP ping pong stuff" {4 \- y: S6 b& A5 B3 m [
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT
8 \4 g: Y5 |& t. v9 l4 x$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT A$ \" X( p+ H5 e# {
6 k* I- s `5 f; \/ A
############# START 在下面添加上自己的特殊规则 ############8 ^$ x% y1 x9 [$ Q9 G
### open IPv6 port 80
; r9 c* F: E& M# d#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
0 a" d' C1 p7 M. c4 g+ A### open IPv6 port 22! I& v) J s3 @1 z1 d2 H% R
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
6 V* l" t2 q* c### open IPv6 port 25% m% p% Y2 Z& g$ `2 b
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT
3 u9 L6 Z0 s5 v: i) w( F; J7 A############ END 自己特殊规则结束 ################
! \. S) D/ ~5 g A! q
L+ I j2 s! r8 f#### no need to edit below ###" g& W7 m$ K4 k/ W2 }7 e
# log everything else
: C$ J7 f) ]- d2 g1 `9 k$IPT6 -A INPUT -i $PUBIF -j LOG
8 ]$ Q; @) l7 e& E9 S7 Z7 O$IPT6 -A INPUT -i $PUBIF -j DROP |
|