|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
+ W$ M6 V; w3 j8 ^# }% B* i* Q" L- X# ^
在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:( V' d7 A. b2 ]" i7 D
ip6tables -nL --line-numbers9 F% O0 h6 \0 X2 o5 e* c8 m3 L4 W; C! T
: s3 m8 `: h# z8 r
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
5 u7 v2 j2 y; V) r# Y3 e. H4 W( C) l% v: {7 p' t
# vi /etc/sysconfig/ip6tables7 F# d: e8 N) B, `! b
可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)
) e3 F3 T# t2 U0 t, O* }8 }*filter
3 K$ \* I1 p3 [6 O3 J6 B:INPUT ACCEPT [0:0]# ^$ O% V! j% r3 G4 I
:FORWARD ACCEPT [0:0]
: \, Z$ }4 E& A) @, U! @:OUTPUT ACCEPT [0:0]
+ D& e3 P% ^) y2 d:RH-Firewall-1-INPUT - [0:0]- U, Z U D* w! s# A
-A INPUT -j RH-Firewall-1-INPUT
: t; O0 ]2 r Z; V+ H3 J5 Q/ G-A FORWARD -j RH-Firewall-1-INPUT9 p( |4 Q; C$ M) R1 [6 C" f l7 B
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
% Z8 g' P7 K% D* f4 e-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
* p, x1 Q* N4 o1 j-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
2 ~9 E" s- Q7 `. d3 n0 ]) i-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
6 f% i+ |1 V i-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
% x0 Z% u- G/ e! g3 R-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT" W/ f V6 g( _* N0 ^
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT$ \0 Q& b! A- @% Z* G
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
3 }( O* t2 V( y; J% T-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
( w) _8 z5 P: ` T. B; x$ Q. r-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
! G2 X9 E, ^% y7 g1 p-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
' I7 ?9 n8 X" O! |$ `3 [COMMIT
! _% x, L8 ^* H$ {与 IPv4 的 iptables 规则类似,但又不完全相同。% B4 z1 H N N- `6 S, A
% P( A5 m3 U; d: c0 }3 S要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:1 m; f+ F# |: I. r+ ~0 D3 \1 Q
/ [$ ^- T9 X4 w3 t8 P6 \
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
* P* ?/ }; |' p-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
* N5 }5 O/ i4 R3 l$ x3 {- G1 u
5 f; T! G+ i, |- ?5 V$ l4 t6 c4 g' B要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
7 p+ P3 @; T0 E" p5 M3 J
3 b# e$ O% b1 D-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT/ Z( u* Y \/ ]
-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT) Y( g0 |* ^! t* Q$ c: y
同时针对 tcp 和 udp 协议开启 53 端口。8 M: u3 m1 c; ]3 x
0 b U7 R1 l) U5 X. u4 V4 e要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:% S1 v" j' z/ ]; O% M. I F9 h( }
( X$ G4 d) Z- Y, l! i+ a
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT4 j8 a4 C& }8 q& m& b
要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:- o7 ^7 G h" m) n. \
: o* h6 A( P0 n9 Y, X-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
+ J7 l, i# R+ W2 y( r对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:. C5 x4 t4 p& L, F% G6 R% M
+ X/ s0 G' d" s$ ^4 t* K1 O/ _' Z9 k
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
, y! B# k( F: g) s+ y! X( ^' gCOMMIT
, m3 S' r( a! W1 A9 Z3 y6 G改为:4 h. L3 T* D3 k f$ W
7 S; D) {7 y ~) w8 ?+ i4 Y8 ~) o
-A RH-Firewall-1-INPUT -j LOG
& b- x# g( `! g" z* n3 b# V-A RH-Firewall-1-INPUT -j DROP
0 h) N3 i& h" j8 OCOMMIT
) p, S( A5 U- u2 J' J$ u保存并关闭该文件。然后重新启动 ip6tables 防火墙:
) o* ?" y: }' b9 l% ~
: h/ [1 u6 Q# m3 g; k9 t% p, a1 K# service ip6tables restart0 o8 X) o% V: O, h, c8 I: |; Q
然后重新查看 ip6tables 规则,可以看到如下所示的输出:
* m5 t& o: d- N8 @: h9 V& K, z" y0 t6 C' x4 |/ I6 {
# ip6tables -vnL --line-numbers. s5 d5 C. `2 K6 \6 r, }% D
输出示例:. D: {; n7 @8 h: O1 I; Y# V! p s
5 Y7 T ~' I8 k2 w; D- X$ e" J) N
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
: S( A& H/ c) o# s8 `num pkts bytes target prot opt in out source destination
2 u Y( F/ ?9 k9 D3 v9 V1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/07 B: j0 @: c3 ~, _, n1 i9 V' W
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)7 N% a7 w# O4 D# N, _1 T
num pkts bytes target prot opt in out source destination
$ L9 w' H. ^2 |: W4 F1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/02 n7 n& F! n: W: R [% e1 L# N5 C
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)% P8 X0 E% f) e3 V' ^
num pkts bytes target prot opt in out source destination9 x' { b0 |+ p+ D4 Z3 _
Chain RH-Firewall-1-INPUT (2 references) j$ v: u2 z+ P+ J
num pkts bytes target prot opt in out source destination& R8 t. O5 t% e
1 6 656 ACCEPT all lo * ::/0 ::/0! N8 ]" b( f- W$ z3 w
2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0
; ~% i. [ a- O2 d% Y+ u! q& r3 0 0 ACCEPT esp * * ::/0 ::/0
2 p: V; b; a* Y! W( q! X4 0 0 ACCEPT ah * * ::/0 ::/0
( a% o$ t" e! L) W4 {1 z$ y5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353# |' i* |# s- }1 v$ {
6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631
0 r% h2 d, Z8 ]7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631
, p2 c7 A& x0 V" E8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000( V: Y8 f- o8 s5 e! P: h E* ?
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
' z0 S5 d* C. J* o: ~10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22: F+ a4 i" o$ q* S. A
11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80
+ _2 b. H+ @9 Z0 s% z12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53& d, j t% c+ e3 n, F. @: n. d
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
2 n! o3 f0 Q8 L. _! U6 R. D2 V14 18 4196 REJECT all * * ::/0 ::/0
, R* R. z9 v% s. N/ qIPv6 私有 IP¶% o4 \2 S: l7 z$ Y [
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?
* x6 u6 }4 P& J+ e' a! C8 L
8 ]: u; ?; i1 k6 [% i6 g, n不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。, V% X2 M! J8 K6 T' ~
- a* z+ m/ R$ [! o自动配置 IPv6 防火墙示例脚本¶
: f8 R ^% z( ] f0 e与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。
3 Z( ^ f# M0 H, D- x8 {1 `. v, ^1 D0 @
#!/bin/bash
0 d0 A1 n2 y# j& f& y/ S; `0 @+ tIPT6="/sbin/ip6tables"1 ]- s2 A {2 M
PUBIF="eth1"4 p9 G8 O% }. D4 K) T$ J3 U% b, b
echo "Starting IPv6 firewall..."
) x$ g9 X9 G6 ^( K5 j$IPT6 -F
/ V) X8 P O# t- {* i0 V$IPT6 -X1 L2 B$ V7 p2 u; e6 p. U* D
$IPT6 -t mangle -F. S J& E& |! q% b5 f9 T% L
$IPT6 -t mangle -X8 B0 ?4 n" v# C+ z* U/ {( Y/ w) V
& E6 o; ~6 D7 e6 k \#unlimited access to loopback, j5 S" Y% T" Q
$IPT6 -A INPUT -i lo -j ACCEPT
0 z6 Q$ O6 {1 X7 R7 I$IPT6 -A OUTPUT -o lo -j ACCEPT. E# z+ Y7 {8 k! S, ]
' j- K& n: D5 }9 P) A9 A h
# DROP all incomming traffic( k S) w: E% o0 A" e
$IPT6 -P INPUT DROP3 b; ^2 G2 p9 M6 e1 @
$IPT6 -P OUTPUT DROP
# r! A$ K# h3 m1 |( k$IPT6 -P FORWARD DROP
: d3 b/ C9 _' o* F+ u7 w1 B B7 K5 {' h' j0 {# G4 p6 i
# Allow full outgoing connection but no incomming stuff' m( m& ?1 n' A
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
" p0 ~, C0 v4 \% R, l" E5 P$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT. l8 |- B* F4 I/ c5 g
$ A5 Q6 G# W" M& ~
# allow incoming ICMP ping pong stuff# l2 v+ u9 U7 R3 E, J0 p3 b, {* t& Y
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT
8 H3 m& G' S% k" k" T) W$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT
) y. B, A5 \( E
; e% |: s' E# H4 f* f############# START 在下面添加上自己的特殊规则 ############
3 c; Q1 R. _" B: ^2 G### open IPv6 port 80
/ R% d. I3 C' @( N2 b! N, z) D, ~#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
, h1 e+ ]% `# s! V2 l### open IPv6 port 22" Q: G$ y% S, u% V z, V/ b
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT ]# ^ [# `% X) Q; Z, h2 l
### open IPv6 port 25
) R/ a# n& ~# j( ?#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT+ O' f( L6 w6 a- T; j' l/ W0 N) Y
############ END 自己特殊规则结束 ################
a9 u4 a. g& b
' I K( p1 H8 _% U#### no need to edit below ###
# X* l$ g# D1 T* |9 B# S# log everything else
. B4 u4 q/ E) G$ C- a) }& l$IPT6 -A INPUT -i $PUBIF -j LOG
% Y" P; \. E* L# [3 M' ^$IPT6 -A INPUT -i $PUBIF -j DROP |
|