|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
0 Z0 |! U2 w! H8 w
6 ~- a# J) q b+ E E. W i- j在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:' K# [' w+ |- [: e
ip6tables -nL --line-numbers
# j8 b7 B1 c1 r
7 r0 M* y* p! L1 D" }" l3 u8 M+ d使用编辑器编辑 /etc/sysconfig/ip6tables 文件:% @. w9 V# p8 A2 G- a' y
B |) m2 ^+ Q6 Q1 f: Y
# vi /etc/sysconfig/ip6tables
6 N# J, `4 p8 o- B1 q# g可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)
+ r& y B/ p1 H6 f*filter- b# j) I, H9 r# Y0 J7 S: I e
:INPUT ACCEPT [0:0]& [, ]4 K8 P+ _! K1 Z3 w$ ^, A
:FORWARD ACCEPT [0:0]4 U) x, X S! L/ H8 M* q
:OUTPUT ACCEPT [0:0]! h3 O& l: e' ^. `$ N
:RH-Firewall-1-INPUT - [0:0]
! b5 g! h8 x5 \/ s1 H$ P-A INPUT -j RH-Firewall-1-INPUT
' Y! g$ x! R9 ~! P: `* J8 ?-A FORWARD -j RH-Firewall-1-INPUT& S7 l+ E$ J: w. B R' l9 c, K1 a
-A RH-Firewall-1-INPUT -i lo -j ACCEPT" m, t4 S% }! Q
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT' C) W3 f/ X( Y
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT, K% _9 K) o: X" l
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT9 i7 s3 X% \& ]. X. @! B" S
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
. P0 R* A6 y# D1 F-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
. T8 A# Y8 S+ w) ?-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
]1 J0 v f& Z* b-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
7 k, I) t, e* k- o-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT, ^" U Q7 a! N0 q9 D
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
) C- e$ ^4 N- p1 d$ O N7 Z( g-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited" {! I3 x, L. u- b5 W
COMMIT- N* t& x) f. K. v) j, O5 L
与 IPv4 的 iptables 规则类似,但又不完全相同。
5 |/ G( i! M6 \8 x
4 I" u9 l% Y' p: N. L要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
+ g! @2 m! n3 j9 N+ J1 W a0 x3 b5 [# X
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
" J( h0 U5 J# i1 } r-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。5 w0 Q7 }, r5 K8 V0 j$ l7 N/ K
6 y, E% {' E6 a( D3 j$ W要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:0 E/ W5 |; h7 ~
1 z9 Y( V/ C4 h. F
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
6 m8 H0 s% y' A8 G-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT2 B; f' }; D- t* |7 ^9 n# H& y* x
同时针对 tcp 和 udp 协议开启 53 端口。 Y/ A8 W6 c6 _# j7 u8 Z7 i* H2 r7 A
2 Y5 h- b2 ?0 W/ p7 [, o要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:" W: a" y4 x* U1 Q; P0 {1 H
# f$ b( Q1 s3 m6 s# H. v7 g c" V& i/ U-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
9 Q/ v3 i2 \2 ~8 _0 g要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:8 ]+ A2 E! K5 J, {' d
# |5 Q4 {! e# A% s6 i-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
* I1 b, k8 q9 c3 z1 q+ \% Q$ @对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
3 q% C' Y8 I( J6 a6 W+ D$ H
" n# S& s) W7 Z% R7 S( \1 X-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited3 D" _$ t3 V5 G! I
COMMIT
4 ?7 z( I$ |3 Z. B改为:9 u" f! Q2 F# l& o( }' V
6 z: }2 E. H! N% u {, z4 \$ `/ X: N7 g-A RH-Firewall-1-INPUT -j LOG
/ n) h* ^9 x5 d- L-A RH-Firewall-1-INPUT -j DROP( s6 S1 S" k) L) u+ E8 v
COMMIT
1 p4 w, U6 o' n保存并关闭该文件。然后重新启动 ip6tables 防火墙: p$ y' }- m& V. F5 R
5 G# F. i3 }# m! l
# service ip6tables restart; M3 Q( V t$ C. U! C7 N6 h1 A
然后重新查看 ip6tables 规则,可以看到如下所示的输出:4 H8 ^7 ~2 F* d" K) |" f# q
: g4 M( }$ h' ]8 x# ip6tables -vnL --line-numbers; k* y% r9 E+ {3 \+ k3 y" n6 |
输出示例:
+ O/ y7 U% ^1 t+ _- x- V
0 M* t& {, R; ~$ bChain INPUT (policy ACCEPT 0 packets, 0 bytes)+ D4 ]+ @% Q9 p$ H
num pkts bytes target prot opt in out source destination9 S) G4 C/ A1 W0 S8 m
1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/03 @' t2 }, ]- D8 c9 \* J6 Z
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)% T2 ~5 h! u |+ t& i
num pkts bytes target prot opt in out source destination
! l% H/ E. E( e0 p* Q2 Z1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0
& E8 I9 r% @, m2 Z" i' RChain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)' [; }- v1 w4 ]5 `$ T
num pkts bytes target prot opt in out source destination
( k7 d+ V2 ?, IChain RH-Firewall-1-INPUT (2 references)$ U$ O, Y5 }/ d" b* T
num pkts bytes target prot opt in out source destination" U. K# Q; w: M
1 6 656 ACCEPT all lo * ::/0 ::/07 m0 s# p# d2 j! D$ q
2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0+ F1 z9 d) O: U# D
3 0 0 ACCEPT esp * * ::/0 ::/0
$ c; I6 u# @6 u# ~4 0 0 ACCEPT ah * * ::/0 ::/08 g8 c1 j" T+ Q! q& j8 N q
5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
# D% [/ l- S! U9 P- A- b1 z1 s# s6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631: D) Q _; {9 J# w
7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631% u. Y# _2 @- j' P0 x+ {
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000
' h3 c1 ^- y) r8 j* {- ]0 b3 B$ A/ S* ?9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02! ~& P. k1 Z7 V5 h1 q% M
10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
2 c( m9 W7 w( d* _. o O11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80
/ J J, p( X3 Z$ \12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
( K% }. O5 J) H# z9 v0 s" I) Y13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
& i q& Q% `/ s6 E14 18 4196 REJECT all * * ::/0 ::/00 _/ H0 Y0 Z! r' [: s
IPv6 私有 IP¶& ~ U$ q" o' Z& f
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?, M" z6 l$ m& F! C8 a
. V$ c& P0 h F1 `- P# l
不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。
8 W& V; w4 U; F- W7 t; d2 Q. r
8 F. b* `' F8 Z自动配置 IPv6 防火墙示例脚本¶: F% P) ]/ K6 t
与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。; Q, g7 z' R+ s( [' U: `) ^" y# @
4 v$ T9 k% \/ _' m: R5 Z
#!/bin/bash
2 l A6 X7 o7 i0 b* {& ZIPT6="/sbin/ip6tables"
+ R0 T6 f% y [& s, P8 HPUBIF="eth1"* K ~6 m! o8 z& @* Q6 y1 N% S
echo "Starting IPv6 firewall..."
. o4 t9 Z4 ]6 g n7 Y% h; w$IPT6 -F
# Q- F) Q$ g: H7 @" {* R+ Q' R$IPT6 -X' b. r# A4 s" u: J- Z; K
$IPT6 -t mangle -F3 B! r2 ~ U7 ]" O0 H, v
$IPT6 -t mangle -X- a) t2 l% U$ F
6 A$ o# N& g( e0 Z, ]+ H#unlimited access to loopback& \$ T [/ y2 r' [
$IPT6 -A INPUT -i lo -j ACCEPT0 f( |1 g4 h# |6 _9 K! L: ~
$IPT6 -A OUTPUT -o lo -j ACCEPT- x1 B8 N7 x6 s3 V1 `! O
5 o0 s! S3 ?, [+ M3 [( C# P/ y
# DROP all incomming traffic4 B, l" M; y$ Y# z( K, z2 K
$IPT6 -P INPUT DROP
{' h& F4 T$ Q% B! y4 \3 Y" Z$IPT6 -P OUTPUT DROP- f* x7 d1 X. M1 V, s8 W2 P* G; R4 n
$IPT6 -P FORWARD DROP& _5 |2 a- N* V& p3 F
! `7 v- G N$ a4 y
# Allow full outgoing connection but no incomming stuff
0 [2 ]& L) K' [) G- m$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
6 u0 t% D* E) _ W$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT) h; L0 `7 p8 C6 a# b: _
+ ^- h) Y) L7 {! R
# allow incoming ICMP ping pong stuff+ w6 [8 ?. o" w* P7 D, d
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT/ f9 ~6 K0 `- N7 b7 L
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT8 [- H; d% s2 K9 D
* z4 }& }9 ~; `9 Q% E
############# START 在下面添加上自己的特殊规则 ############
; i5 ]0 T" k; C* f### open IPv6 port 80 / v \) V! V. l) a3 V3 a7 c# V
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
9 l' @) y8 G- E- H+ b### open IPv6 port 22
6 H; t9 c5 i6 h+ P+ _# ]#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
& k9 }6 d# Z* z### open IPv6 port 25
5 E2 b' J. S& x2 X# ]% Y' S2 v- }#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT4 s: c" U" m Y& G/ R
############ END 自己特殊规则结束 ################
u3 f' T& N+ o; ]
7 t7 W7 Q J; ]#### no need to edit below ###+ w& ?) |1 ?( m R
# log everything else- w0 X5 `% d* N( ]0 E S% c
$IPT6 -A INPUT -i $PUBIF -j LOG
; Q9 K; ~; Q+ G! U) V* @$IPT6 -A INPUT -i $PUBIF -j DROP |
|