|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
u1 H: z! D9 \2 r
* b, J& ?! C0 o. x3 i; b/ ?在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:/ z' Q: N9 a% v
ip6tables -nL --line-numbers+ ]) C/ `$ R) o* ^
4 t9 v: U, C. e) j0 A: D% E6 ]使用编辑器编辑 /etc/sysconfig/ip6tables 文件:' r7 u1 Y& V" G+ w b- P9 y
( I7 Z% R! Y. o$ V
# vi /etc/sysconfig/ip6tables/ f. m- h- v9 S1 t: z6 g
可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)) C7 a( n/ p+ N! }. U: F
*filter
}" ~0 t1 W% ?, h:INPUT ACCEPT [0:0]5 {; B% C6 r! ^8 |+ [ |- I" `9 U5 {
:FORWARD ACCEPT [0:0]3 t3 P! T, c0 P% y7 }' {5 H
:OUTPUT ACCEPT [0:0]% ]( X5 U t& V
:RH-Firewall-1-INPUT - [0:0]% v8 k* \' N7 J/ J( s2 ~
-A INPUT -j RH-Firewall-1-INPUT. _/ f3 O0 K4 n5 e" i
-A FORWARD -j RH-Firewall-1-INPUT2 z- o) R3 m7 x) X" S& b: P9 o
-A RH-Firewall-1-INPUT -i lo -j ACCEPT4 C! U( ]/ q, s
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT1 T/ o& v* n2 D* B E' |8 m
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
$ _( B/ j) s- A& I2 P/ V-A RH-Firewall-1-INPUT -p 51 -j ACCEPT) r: K* e" o% P% v8 E0 Z
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT# t: p& O# O+ z9 m
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
- ]; N1 d, s- l5 r2 r# Q0 S-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
! K- C$ @" K) @% g& {* O3 h-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
0 E) N1 y( B/ I3 {1 {# }- a-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT0 g, j1 K' o$ f8 }% @2 R
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT' B& o9 M5 R. o- S* w
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited0 C+ C" O2 G* p4 J1 c9 \: g
COMMIT
1 r; `; v3 c4 O: u D! m与 IPv4 的 iptables 规则类似,但又不完全相同。' P4 U' {5 K K ^6 k3 Z8 ]
1 i- R4 C4 V4 b7 ^
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:$ _8 p5 B! j+ N& H4 X# M! \- V
% z% F s3 U, `) e- n7 D6 B-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT: c6 ^# H' O6 w% y Q* c# `* b
-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。+ X+ s7 z3 e$ h1 F4 u1 t1 Q
6 L# H1 z: g0 c7 t) F0 S
要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
8 S2 R$ K4 b+ e9 G6 @2 m3 v; w, c4 }- Q& K+ l
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
6 B1 o; u( i& O8 E6 b-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
- S# L d8 l4 \' N同时针对 tcp 和 udp 协议开启 53 端口。
/ [8 R/ r) ^( ]% s5 X- p& A0 c4 h$ A/ `4 O6 ^
要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:1 G3 r4 T6 f. V5 Y. |
& A r# W+ K# X# ^( X% s Y7 T) z" [
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT3 o0 z/ C# H0 l4 Z
要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
0 K' [8 Y: X, r* V; x% G1 ^% W* r' K! N$ ~: f# Q- n+ D5 l
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
0 n: k) d2 S0 p# R% h对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:" W' |. N! z0 B: O5 T
$ E' Y: { t8 X0 P7 U f% g1 ?5 L
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
# i: M8 H% z' C. G# zCOMMIT
1 e4 z( u7 b! _( [4 R- n改为:' C( O% ?0 X1 @
6 Q# d2 Q/ ]( c. V& W-A RH-Firewall-1-INPUT -j LOG
( s, |% @1 K0 y7 w-A RH-Firewall-1-INPUT -j DROP( k* q) H8 ^2 G7 I
COMMIT
! O2 |/ O8 a6 T# ^保存并关闭该文件。然后重新启动 ip6tables 防火墙:' X4 a5 \! l1 ^/ N# s* H
7 k6 ^. g8 X, }4 i5 G$ [ A# service ip6tables restart
* W- S$ ]7 U9 ?/ o7 H$ m然后重新查看 ip6tables 规则,可以看到如下所示的输出:
]0 X$ l' q0 E
* u# R1 n) U% {% x+ H; O; K9 i6 \# ip6tables -vnL --line-numbers8 Z) J& |: {$ n8 ?. R
输出示例:% W# u* N0 W# u$ B: A- U" U& x, P
) c/ z; k7 s6 ~& F2 w [: VChain INPUT (policy ACCEPT 0 packets, 0 bytes). b; p2 J& x8 T$ ? T
num pkts bytes target prot opt in out source destination0 C. d0 X8 r V
1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0, T. u: O& W0 d* C+ K0 A
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
! l( ]9 T( n/ w2 znum pkts bytes target prot opt in out source destination0 |+ L% }* \, E2 m; _" x5 Q
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0
/ \! C( }( f4 J3 a4 @. _2 zChain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
* L4 n. g: ^& P p2 y2 Nnum pkts bytes target prot opt in out source destination5 A0 q2 e- Z2 d L" S
Chain RH-Firewall-1-INPUT (2 references)0 a0 R w9 m, E# Z: f i4 C. Y' K
num pkts bytes target prot opt in out source destination
. |- f: p' j# M6 M' l4 A1 6 656 ACCEPT all lo * ::/0 ::/0
1 z; s% ^7 M7 b1 g, s6 P2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0. J6 { i3 J, h9 G
3 0 0 ACCEPT esp * * ::/0 ::/0
0 T G- B# g" a0 E4 0 0 ACCEPT ah * * ::/0 ::/0+ @8 @0 J' X; g) [
5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
q: N0 s7 o4 r! N6 {6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631
$ |$ {# J1 F5 M9 e6 a: Y% y7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631; S1 N( c8 k& q# A6 i* W/ C$ \
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000$ Q2 F% e1 Z1 n3 B2 T# d. Q" F
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
5 g) y% W8 {, Y( `10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
( m* c. _4 ?- \* h _) M* j( P# l11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80: Y1 J) {; K6 g. s
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
. x# @* |2 U, i' t% `/ Y% I$ H13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53; |, B/ E h/ O( Y+ m
14 18 4196 REJECT all * * ::/0 ::/0
, f$ L( H8 `8 h* _# R2 i) JIPv6 私有 IP¶
$ P! j" T2 Y1 g, u' X. vIPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢? A) D; L4 h9 ?: C
6 M3 x$ c6 l! ]! \ M. B不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。2 t5 J* E3 I# Y) ?; d
- o& J; X2 R- O( }0 [: n1 @' k( ]
自动配置 IPv6 防火墙示例脚本¶
" K; g a: E/ ]/ i7 w# R/ m! M与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。- s: U# `" z$ U6 M/ }3 M
, t8 l3 a+ K/ c0 _6 a& f7 J, j#!/bin/bash* F- d. b8 {. p* p; j
IPT6="/sbin/ip6tables"7 m v, K( Q7 X- ^4 O
PUBIF="eth1"
) t# l$ p0 q5 @4 ?4 `% C3 gecho "Starting IPv6 firewall..."6 o' n6 C$ @) G; d7 b. O, O
$IPT6 -F# K$ T& `" q0 {; ^) k/ p0 H7 n8 I
$IPT6 -X
" N* _& \. D, L* [! G& r' e/ u$IPT6 -t mangle -F
1 J) i4 z- m4 b' ^0 t1 ]2 R# E) X! |$IPT6 -t mangle -X- v3 x- l' V; C& k2 x- D9 e7 Y# S/ f
4 f7 [5 g$ F2 `, q4 K# @#unlimited access to loopback
8 c3 e) u) X5 }+ q& C; a9 S. Q- u+ ~- D$IPT6 -A INPUT -i lo -j ACCEPT6 d6 ~4 b/ e7 C( T' V( M
$IPT6 -A OUTPUT -o lo -j ACCEPT
. g7 n& O: O) q4 n5 K
1 M1 V; `# g7 b* _: B6 o# DROP all incomming traffic
+ M4 i0 H3 @8 @$ c' |$IPT6 -P INPUT DROP* a' d- m* f" Z/ \' r% O
$IPT6 -P OUTPUT DROP+ @# L# H$ E. Q' _/ k
$IPT6 -P FORWARD DROP
/ ?; x$ a6 u% {$ Z9 u, f, ]; T h: [7 y- ?0 ?6 D2 [ _
# Allow full outgoing connection but no incomming stuff
2 v# N- r* R( [* w4 G, ~+ q& m8 R$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
# U! E& M( A2 T$ J( e/ L1 @$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
. i% y6 a B* {1 T- |0 y% A6 p% ~4 y* ?3 Q. O" y# Z, Q
# allow incoming ICMP ping pong stuff
7 W* G% d5 L8 f3 j" u9 i. j. I$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT* `3 c6 ?6 u! ]: a: y# A
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT
0 h+ [$ M* O; |% W; t
' j% L' N& o+ h; ^- y$ d8 @############# START 在下面添加上自己的特殊规则 ############; s u5 c4 `7 q! X; Q
### open IPv6 port 80 : j4 V# s- }0 ?" X- f
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
- `8 p! p( {# b. t### open IPv6 port 22
6 i9 n' `; Y% r# c9 D#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT" L5 F1 ^; [" f, E1 ?/ W
### open IPv6 port 25
. d% n* j! Z" n% U7 R7 h8 y' _: S#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT
0 [( B# u+ g5 U( P############ END 自己特殊规则结束 ################8 d3 ^" e8 V, {
6 O5 R/ h! ^. `$ J5 |#### no need to edit below ###
* O# o: A, K" s# log everything else
' W9 n$ _) J: z9 t$IPT6 -A INPUT -i $PUBIF -j LOG
5 d4 V4 I/ q0 @, @$IPT6 -A INPUT -i $PUBIF -j DROP |
|