|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
a' w8 G- g o$ _7 E$ j7 r* [0 s, J
& v A; `7 d- a Q5 F在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:
8 g2 B& `' |; `: h ip6tables -nL --line-numbers
6 H. T5 n5 A# h( F' M7 r5 y( Z; O- S0 I5 b: @9 i% G
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
V- q1 K% D$ h9 y! G) n6 C& b
; P* e7 l/ t2 C. o. C( \% {. `# vi /etc/sysconfig/ip6tables
# { p0 `' y1 j0 {" ^可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)
! \7 }% q1 Q' A*filter. a7 [3 C0 @! o! O
:INPUT ACCEPT [0:0]
$ k; d9 B# T. V; x; @+ ]:FORWARD ACCEPT [0:0]% H" d" a: d3 {- q ?
:OUTPUT ACCEPT [0:0]5 C; D+ U9 z9 O# F+ `1 |
:RH-Firewall-1-INPUT - [0:0]1 C) J+ S, l N _
-A INPUT -j RH-Firewall-1-INPUT
8 Q* q/ Y, b* M-A FORWARD -j RH-Firewall-1-INPUT0 q4 f9 n+ U6 y) R" {8 S! k
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
+ ~& Y) {: j3 M. P+ K+ s9 _-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT5 U2 x; s8 a* v& t: Z) P/ ?( n4 Z# i$ R
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
7 B3 h' c9 w3 p$ f# q5 |- V-A RH-Firewall-1-INPUT -p 51 -j ACCEPT$ J4 ^3 S5 `) o! L
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT7 z0 t+ Y! D! ]$ z+ c% }, e! G
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT# M: N( y) J, C/ e
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT/ \& M, ^" D2 b \8 d5 g4 a
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT$ `& _, z# D4 h% \3 q9 _
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
c5 q6 D1 h, T5 x-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
4 @3 T1 C% U0 v( T9 ? Y-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
2 q" C1 }( x) G# H. v( gCOMMIT4 r( x$ b% Q3 O/ A. R7 s2 n
与 IPv4 的 iptables 规则类似,但又不完全相同。" m* V' @! F* u; P+ S9 ?" b" h
" [4 V1 L3 P; b6 |* p7 s
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
" g8 O' ^( G* f, t3 V1 {1 G9 z, r( O) N# D" Q7 t6 q
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
8 d* r1 D" ?1 [* j) Z B-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。6 j# o4 Z# b* V" U. T+ Z
0 v& g' S" M {要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:; ]- V y( ]% C0 P" P/ M
1 w9 E! S! R' i M-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT3 W- _0 y. u$ @7 R
-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT. b. c2 \% J$ g# F' b% [4 M
同时针对 tcp 和 udp 协议开启 53 端口。6 t8 k' {* ~1 t d! F
( S ] M* u6 ?( T' I7 S
要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:) d: D; k/ ?! J, E7 Y3 ^: q! C
& N% [; _% Y \1 z
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT' Y3 K7 L+ Q4 W; ?) C. @
要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
# |' Y5 U- E' I- y$ l7 F9 x8 E# V' Z. _
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT# L5 @7 ~* w8 ~% G
对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:) Q4 L! M1 `/ R5 E# b8 Y
7 }0 g" g5 M8 {-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
3 s9 J: `& i2 h1 [1 { v% vCOMMIT2 C' ]9 n/ R. B6 \! q/ E, R: t
改为:1 P1 M$ s9 @( L& ]
5 N( w- j/ H2 T. B& U- Z& Y* F-A RH-Firewall-1-INPUT -j LOG. D. Q& g! Y7 W4 O& p; ~! m. g" a3 d
-A RH-Firewall-1-INPUT -j DROP
6 B# l1 I, ?8 J- y+ TCOMMIT
; L0 V% i& `# K, q. q保存并关闭该文件。然后重新启动 ip6tables 防火墙:
& W" y* k D2 D% P( m4 o+ ]7 S- C$ [, z/ m6 D
# service ip6tables restart) x* P# p0 p3 S5 j3 h" p% m9 X$ v
然后重新查看 ip6tables 规则,可以看到如下所示的输出:
$ V# b% X# Y, g% t- D
. t1 ~2 {% u$ C6 |9 K' T, h& O( K7 A# ip6tables -vnL --line-numbers
# d5 \# |" q- q q, K" u/ d5 ^5 w输出示例:: S3 D% c9 ^+ U" n4 u
1 F. n) p5 ]* A y* r. M3 n$ c6 ?Chain INPUT (policy ACCEPT 0 packets, 0 bytes)" s4 ]% K7 h- \; ?( v& N8 d% d' _/ V
num pkts bytes target prot opt in out source destination
8 G( |% {# _2 [) r% y+ A1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0! m; _0 G9 u0 z' H
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)* Q+ U% j4 q* U s$ b
num pkts bytes target prot opt in out source destination
, M9 c9 x- d: j Q! N6 ~1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0
2 `3 }: Y* @% ~Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
6 I6 M7 T$ S4 Q8 u: j* C g4 pnum pkts bytes target prot opt in out source destination# w/ Z/ d, Y8 ^
Chain RH-Firewall-1-INPUT (2 references)+ T' C- G. @+ i( T( s: W& x& q
num pkts bytes target prot opt in out source destination
; |% Y W N) P1 C! `1 6 656 ACCEPT all lo * ::/0 ::/0
& w# p$ s0 |, s* s2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0
9 I% T* h, U. v% Q3 0 0 ACCEPT esp * * ::/0 ::/0* b* h* d# @9 v M- y
4 0 0 ACCEPT ah * * ::/0 ::/0
; Z6 @& H. X0 g5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
9 {2 V+ R5 N, a; Y" R: e5 {6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631
4 u& P5 d+ [6 U2 g7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631
6 s$ G3 [0 ^6 O' T- ?. f; u8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000
2 J( ~$ w4 y+ v( }9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
+ D; ~( @' h8 M. X& {) J6 C10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
" V. l) s% U; C+ T6 N2 S0 [' {* r11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80- M z, U$ Y3 X
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53- ?4 n3 q# n5 [
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
5 L2 x* h/ o2 [1 U& `0 z14 18 4196 REJECT all * * ::/0 ::/0
, u8 G$ Y. o' O" TIPv6 私有 IP¶
/ [. b+ U0 E+ l$ P NIPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?
2 G: V4 n2 R4 Z- a. I6 A* F& n; l1 X7 W6 d
不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。
+ Z) b/ K, Y- c w3 S* W* l r
, _5 ?9 g+ t+ @% E0 j自动配置 IPv6 防火墙示例脚本¶
! {( P6 Z0 t7 T b o与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。3 O, u y( F# U
0 V7 O7 [* K0 Y g
#!/bin/bash( A* z' ?9 J3 K0 m( s
IPT6="/sbin/ip6tables"
0 \7 h- i8 L, a rPUBIF="eth1"4 D9 B: d/ s' d1 d
echo "Starting IPv6 firewall..."
w& `: t& F' J. D$IPT6 -F; R- q+ X( d+ ]- d8 o9 L
$IPT6 -X
$ q0 Q$ o U n$IPT6 -t mangle -F* x# H. f( ~: z+ {
$IPT6 -t mangle -X4 ?1 u$ m( k8 I/ ^" ?9 J
3 V: d5 _/ f1 F4 q* q9 q$ d( {
#unlimited access to loopback$ K6 }9 M; A2 |0 A+ `" o
$IPT6 -A INPUT -i lo -j ACCEPT
7 m0 ^& ~, f" d2 D. S$IPT6 -A OUTPUT -o lo -j ACCEPT
7 j+ @" Y; q) g0 n
3 I) A, ~6 \0 v4 O! B' r3 w0 j6 \# DROP all incomming traffic# G8 g5 l. ^$ L: T" a
$IPT6 -P INPUT DROP
8 R) y3 a1 N+ ]& \8 |, B$IPT6 -P OUTPUT DROP
2 V3 o( o2 x3 c8 `4 V" R$IPT6 -P FORWARD DROP
+ g1 ]$ L5 i5 ^
( S. \7 F0 G6 i$ I) _% n% q* B9 J# Allow full outgoing connection but no incomming stuff
) t3 O+ K2 p# b; H! p% `$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT \6 E5 R4 t& g, v- a5 N9 t) f
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT& t. Q3 ~4 M6 W* Y$ q. r! C" w N1 z
$ C* K" U3 G! y3 c/ ^# allow incoming ICMP ping pong stuff
0 i2 z" a6 K' r$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT
N2 K3 T$ i, f( p! l$ Q+ I$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT
7 q1 S5 s* R& Q; _5 P7 [7 w) ~
+ m& }. j4 I% g$ d+ [4 d; v############# START 在下面添加上自己的特殊规则 ############
9 }/ ]( r& Q, V! p3 P2 y# c2 @5 C### open IPv6 port 80
* `* ], ?3 ]9 Q x" j4 B$ u& B5 p1 I* U) o#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
6 F* } B! O# k/ g/ N### open IPv6 port 22
1 V# m9 i* R- w#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
$ w! S& _: O: S" q: D### open IPv6 port 25$ ?' U! M! E8 q9 U) e/ {/ N6 d
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT b) Q. m6 C8 \7 j) Z
############ END 自己特殊规则结束 ################
( ?6 \+ S9 w' M5 v3 Q7 x) a
* L! C" J# @9 V/ W1 c4 ^- \$ o" [#### no need to edit below ###
) k7 r- j! o; z( X2 i# log everything else5 a9 e1 d7 t% R9 r- F2 E! R
$IPT6 -A INPUT -i $PUBIF -j LOG6 J+ o& S) _; B' f. q) f2 [6 Z
$IPT6 -A INPUT -i $PUBIF -j DROP |
|