|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
; ^2 n/ S8 X! d+ R2 K( _; B& D, z
在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:4 i# |! G( s* g) t" c4 _5 W; Q
ip6tables -nL --line-numbers
8 D0 S$ S }2 f6 a F9 V* L% M3 C5 X! l( i7 T& P. s
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:- u% S/ _5 b' b8 |" G4 c
3 ]7 i W0 \% k$ ]& R5 F, c
# vi /etc/sysconfig/ip6tables
: ^! b+ v# b7 D. z可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)% J. m& [1 ]+ J, z4 B( w
*filter; r, f6 w4 R/ Z" f
:INPUT ACCEPT [0:0]
K7 ^4 P) ~6 C: B:FORWARD ACCEPT [0:0]$ o8 W5 Y% O+ `9 @& ~9 `
:OUTPUT ACCEPT [0:0]
" I# n5 @# G5 u( V:RH-Firewall-1-INPUT - [0:0]
, q/ K. v% g% L-A INPUT -j RH-Firewall-1-INPUT7 `" L6 F+ H& g! \6 s
-A FORWARD -j RH-Firewall-1-INPUT/ c* h4 t! E& U* T! z9 v0 ~& R6 u1 M
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
" r4 t8 }6 x/ z% Z" Y) o) M-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
J0 U6 |& Z4 @3 I T4 V-A RH-Firewall-1-INPUT -p 50 -j ACCEPT& L$ D" |! T; R% K6 x6 S
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
8 Z( g9 ?/ S" T' |+ t-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT) S$ H6 f# O$ X4 V" `+ Y9 `
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
8 \6 a h$ Z3 a x8 k-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT1 g$ v. S0 j9 t' N! }
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT U3 k* f2 G) f% d6 `2 q7 d1 p
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
& E$ _- E4 W$ @. g/ G' \% f! }-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT o0 M& {0 t _( P3 M- Z! H5 r
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited# p7 y. L7 [% ^2 x8 [, O: I: T
COMMIT
4 h* Z! O+ Q7 F( c$ t) H与 IPv4 的 iptables 规则类似,但又不完全相同。
2 K5 {2 F4 t* V4 |/ g" N4 _' A4 V1 K0 I& }* [" n% O+ }$ M j
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
/ h k7 f& O' ~0 U4 s
# s, q- o2 s- x5 G6 _; _* k-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
7 X. P D G' B6 \/ a( z-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
: ~6 l# \5 E. s8 ?6 _% Y
" u3 R# e1 w2 C+ S/ Z2 N% h. v要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:& t( y3 ~1 E' G2 s) g, ?
: R% _6 O8 I# v
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
' d/ m" _& M( j2 r-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
, E `9 v% ?1 q/ w9 ?; |同时针对 tcp 和 udp 协议开启 53 端口。
, ^+ @' x5 a6 V0 j( t3 Q: }" `$ k( K- F4 g4 |! S" b
要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:" d o3 f+ R& b m3 j' h# H i
! j- `( g$ |" b-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
* O. m6 j7 K0 r( r要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:2 o$ q2 X- |- n! x+ w& H
8 p g: k! \% y3 O- j# t$ J3 Q$ C% ^' R; C
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT" \; \0 `& d! {2 F
对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:( z+ H4 p& C* j: K
5 h4 ~" \8 ?& C0 r0 L, b
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited0 B* k) X' D0 i2 t. l
COMMIT
/ l& D9 x0 _% X- z3 s- B3 v# U6 Y改为:( `+ b2 \ R# ]7 c
6 r5 H- m+ x7 A* T: p$ L! f5 Q# |6 |
-A RH-Firewall-1-INPUT -j LOG5 k9 _1 ^* n# _4 W# d
-A RH-Firewall-1-INPUT -j DROP
1 _% b9 e0 Z, }* E7 {8 e MCOMMIT. |2 b* M3 Y& y% h0 a
保存并关闭该文件。然后重新启动 ip6tables 防火墙:
2 B/ O4 D. x. y, |! k0 N. L) X6 V$ u) v! C; W J1 q7 c1 Q
# service ip6tables restart
% a" v# I ?% J' U( M) O) H然后重新查看 ip6tables 规则,可以看到如下所示的输出:
( |4 x, }7 n; I) {) s% q: @9 z* Q& p2 M. Q5 `
# ip6tables -vnL --line-numbers6 |% d" }8 v$ t8 m e8 d
输出示例:( S& g+ A: R' T5 ~) y3 {; ]' G0 K
- \+ n$ D: V6 C1 q) CChain INPUT (policy ACCEPT 0 packets, 0 bytes)3 ?# f& I4 N; J, G1 D
num pkts bytes target prot opt in out source destination3 T8 T0 Q' I! M" L8 G
1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0' Z. Z( t2 n2 t
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)! v5 ^& ?) a; `
num pkts bytes target prot opt in out source destination
9 Y0 ^( R7 z6 j ?% o7 e1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0 B, _$ I- {, ^% [
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
5 ]0 N" D7 ^ U' D. m) y! Tnum pkts bytes target prot opt in out source destination
3 l) P t9 G5 y* ZChain RH-Firewall-1-INPUT (2 references)
9 X, N0 z: j: b& j; `% vnum pkts bytes target prot opt in out source destination
) g9 r" V, }# Q% X6 @" \1 6 656 ACCEPT all lo * ::/0 ::/0: `0 h* O- j5 i% Q j9 n
2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/06 w3 r( T6 W% G6 ~2 v: O2 J
3 0 0 ACCEPT esp * * ::/0 ::/0
6 I5 E6 [( M7 Z) y) h3 y4 0 0 ACCEPT ah * * ::/0 ::/0$ `. { h4 X3 a6 e: D' H
5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
- |/ J% J7 {( |- C8 Q) b+ R4 C6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631
7 Z+ f& i$ J+ t% {- L7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:6311 g, r' {2 V' Y! M- c R, v: |
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:610005 k3 d' z4 `5 K' }/ j; Z
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x028 X' i) R' m ]1 w
10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
2 E. ~" [! [ `+ H1 ?* c& Z' `11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:809 m. h3 a4 X* [9 ?0 B
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:539 ?- t& u: F* F! X' X7 x3 Z# p& y4 A
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
7 g' B: M; E$ d+ B# B; h14 18 4196 REJECT all * * ::/0 ::/0
4 D. H$ F8 ~( |' d* i, ~+ vIPv6 私有 IP¶$ B( ~$ \9 c8 ]7 l( }
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?+ s% @* h4 M; m% G% @# P$ L0 |
4 a/ c- i7 g$ L2 i5 Z不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。
( H; ^6 y( f* k
1 h8 Y8 Y) K; ~# e% x- l. j$ g自动配置 IPv6 防火墙示例脚本¶
% K- P" H E! G+ L0 ^1 }" h) y与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。
4 n: J9 k0 G" u/ S5 n0 L4 ` S% n: X6 C. U
#!/bin/bash
2 _3 Z. x( z2 E$ F+ sIPT6="/sbin/ip6tables"
" l% D6 U& {" J) ?# H, x) |PUBIF="eth1"
" ?6 y, ?5 N" ]4 z# G# G- w& {* ~echo "Starting IPv6 firewall..."
4 j5 b V+ ?, u$IPT6 -F" P, c* j+ v+ X4 w) i
$IPT6 -X
. a+ O9 _6 V- ~' y$IPT6 -t mangle -F
" c; d! i1 L, y) H$IPT6 -t mangle -X
4 c' ~. e& X+ S* A1 O
, w1 \& J2 z, M0 x6 ]7 s ] b#unlimited access to loopback0 U3 E6 I; s* r- Y
$IPT6 -A INPUT -i lo -j ACCEPT
% t& q, a5 P% M# b* H0 m$IPT6 -A OUTPUT -o lo -j ACCEPT4 I- w9 v4 \) N) l7 H4 ?% l- W" ~
9 [0 n$ t( H5 M
# DROP all incomming traffic
' ?- q. n/ F: y5 O$IPT6 -P INPUT DROP/ E+ `* q4 ~5 G
$IPT6 -P OUTPUT DROP- O- U" ^+ {5 x; v. }1 g
$IPT6 -P FORWARD DROP
1 N" b. N D/ e" F& @$ T* S! `, e% e( d0 C) T
# Allow full outgoing connection but no incomming stuff
' {0 ]& Q; }# \ C( c$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT/ t. T9 ?# t( K( B$ k
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT5 A' |6 E) ~+ q; w& P, ], u, F
: K" w- N7 l2 X3 S" [4 X
# allow incoming ICMP ping pong stuff
: L% G/ }" Q% O8 n) K5 N$ x$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT) j; @: c4 f* E
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT, B# ]& x3 D! p, K
$ l$ K+ L5 s2 c s, @1 _# @+ a############# START 在下面添加上自己的特殊规则 ############1 l/ F5 d" O1 ~$ B( u
### open IPv6 port 80 ) @3 t6 e* K1 ~; J1 h
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT- o; t2 F. t2 I) H8 }, [ a
### open IPv6 port 22
8 N" B! ~5 T7 R#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT e" L P9 V: @' R" }% J2 T' t3 { g
### open IPv6 port 25" t3 `$ w' h% X. {6 F% V
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT7 S% `" b) ~% o
############ END 自己特殊规则结束 ################1 d& f0 q/ C' W5 n/ f- |# c
4 u. D- F( A4 d9 M/ B! s#### no need to edit below ###+ L: W) H* ]0 g& X# p% U; H
# log everything else4 {# M1 b1 L) V! @9 o# a* x
$IPT6 -A INPUT -i $PUBIF -j LOG6 `4 d5 D/ D1 U9 Y! T
$IPT6 -A INPUT -i $PUBIF -j DROP |
|