|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
& |5 f/ N: I5 C+ p) @" N# V# {# V! ?! [2 W
在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:( G# j$ K( A* |/ f6 K
ip6tables -nL --line-numbers
) ?8 G0 ~! E E, F8 d$ K3 a5 `* m% Q; V7 ~2 h* y
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:: V9 w- C- a7 m: m, _
* X: H* S- j8 t7 N
# vi /etc/sysconfig/ip6tables
. x# u: b0 D$ }可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)
) s! s8 E; \% x0 V% R* z V*filter
" N( U" l% o2 h ~, e! R:INPUT ACCEPT [0:0]
`- i+ j/ I( M$ j% Y7 N6 e& c:FORWARD ACCEPT [0:0]( B/ w# ~+ s* s, w' x& U% [
:OUTPUT ACCEPT [0:0]
. J' V( \2 {5 }:RH-Firewall-1-INPUT - [0:0]
; W& |9 I5 |5 w& g-A INPUT -j RH-Firewall-1-INPUT
1 [4 J# Z7 ?5 W2 b3 H# t, y-A FORWARD -j RH-Firewall-1-INPUT" I( P2 j% i6 U3 g
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
1 H3 d3 {5 r8 w" ?3 Y z- m-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
% b2 `8 B6 U4 ^* S ?) t, }8 c-A RH-Firewall-1-INPUT -p 50 -j ACCEPT9 M2 ^0 x; F) X& g! V5 R
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT8 o9 R {6 V! J6 r, P" B
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
9 _! i4 U% v% b4 `4 |-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT4 T) S: B! y$ m I. L
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT" V2 P, d) I" _6 F2 g; g
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT, J/ C- D- X5 a& t% o
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
9 G8 r" x- Z: \( q. K- s" E-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT( G$ z' H, m* W, ^: t U
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
, Q4 ~/ {: y" VCOMMIT \0 t$ D9 v* Z5 J
与 IPv4 的 iptables 规则类似,但又不完全相同。& i$ q9 T4 J: u1 Q5 o& U) a6 G
+ B+ {2 j1 t0 X& ^: f, Y要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
: P7 n$ l Y* m/ p0 P" a" ~7 t7 i6 k, k0 C, Y% c0 }
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT+ S- q& R7 w: p+ m6 f3 r r# y
-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
) K, ^7 G# n" s$ d# ?2 K
. ~0 |/ H$ E" l! {要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:4 S! w1 D8 G: p9 N2 ?/ n7 G& I7 m: r
" T" b5 q0 r% P$ D- C# ?7 S5 G: G-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
. T- J1 D* W% v% M% s+ j8 }. e! f-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
1 d4 O- b1 }6 \; M5 `同时针对 tcp 和 udp 协议开启 53 端口。" e, g E/ x; e" W0 B6 X
* i, Y0 @ r- ?3 ?, B/ I8 c7 c要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:8 `0 E; q. q' i4 }( V: s
D1 |5 ?& R/ t4 R f; V) k-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT A; o/ R4 ^: F) Z: Q$ B- `
要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:# I1 h- z8 c) I% m- c8 K4 ~ J6 r0 k
* |% s$ g6 s' A: }' }0 i/ Q-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT: ]& z( q& V' p n
对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:# U9 S+ ?" I1 T9 p" m3 ?& X
; R, ?5 A& k2 @
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
, l9 v ^4 A0 c, y- F+ u/ pCOMMIT
2 b. s, b( M3 ~' d5 k# U改为:: _2 n+ H" n5 K* Z& e
. J3 C e+ S2 I. O-A RH-Firewall-1-INPUT -j LOG
- M3 g! k% F( b" M-A RH-Firewall-1-INPUT -j DROP( c* k( X# z' e- U( U
COMMIT. U. A! x7 R" S; e- Q' ~
保存并关闭该文件。然后重新启动 ip6tables 防火墙:+ M* I' B0 n3 C' }7 T/ C
1 H% |2 j2 n! e9 E$ Q' [% O' t# service ip6tables restart( ]( ?* E$ K: D/ _) _7 y
然后重新查看 ip6tables 规则,可以看到如下所示的输出:
+ x- N# g G2 C, G+ @* B' |' g2 G) j1 u* I" R" Y8 v/ l
# ip6tables -vnL --line-numbers
, o) P, U1 a# p* B9 _ q输出示例:# y) q8 U2 j$ |6 R) [. B
; c5 G/ o8 f' b1 kChain INPUT (policy ACCEPT 0 packets, 0 bytes)
' G$ F$ u1 F A, a) Mnum pkts bytes target prot opt in out source destination
- l" s8 K: \ ^ [2 F1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
- `# d& Z' d4 p- e# V& @Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
m% |2 N& q1 b$ Y% f, Rnum pkts bytes target prot opt in out source destination& B* T% R! @8 T/ o. l# C
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0
6 H8 C: X$ ?3 _4 G8 EChain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
$ p6 s. x" m7 s' x1 Xnum pkts bytes target prot opt in out source destination
" G4 |3 \1 v7 N- r5 SChain RH-Firewall-1-INPUT (2 references): n6 u* A* d0 d/ y* ?8 ~3 k
num pkts bytes target prot opt in out source destination: |. `6 Y. Y. p+ t
1 6 656 ACCEPT all lo * ::/0 ::/0' o9 {6 b/ ?. z3 X% |$ j1 T" i* H
2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/07 @% i2 Q% }3 N. J* t1 \
3 0 0 ACCEPT esp * * ::/0 ::/07 V2 Y6 S. U7 Y5 @5 B
4 0 0 ACCEPT ah * * ::/0 ::/0
+ m! U% o! @2 C2 k" C1 A9 l- o' I5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
- `4 {8 N" D3 L' \, F: K6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631
* O/ T7 L! K) Y0 k" E1 X' X5 s7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631
) n1 |; C7 y, J& v3 }! b$ m$ _8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000
0 e7 I# Q3 v; a. {7 w9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x025 n/ n# B- {2 _3 M0 P
10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22% c* Y% q, I4 F9 a2 q! a
11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80* j# ]9 D* o9 h# V
12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53, N5 l5 J* f& }* X+ W1 ]- V
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53, D! C; j$ x+ x
14 18 4196 REJECT all * * ::/0 ::/0
, p. U }( Q) R% zIPv6 私有 IP¶
% `6 W# Y- r$ Q( W+ UIPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?8 l* d1 e y3 h4 j9 z2 @5 t/ M
' v- ~' q5 A& G& P1 y- V7 {. C不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。
) \4 |7 j0 K2 j' Z0 u% D5 o" ^3 I6 u/ q6 g0 G; `; o+ n p
自动配置 IPv6 防火墙示例脚本¶( v& m0 f5 M3 d9 w w
与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。# A+ n0 _4 i+ {4 Q
4 y1 U( O% [; b( j#!/bin/bash
}' w. y% Y' |) T0 eIPT6="/sbin/ip6tables"; M! B+ o0 {- R$ |/ L* \% u3 n
PUBIF="eth1"
3 ~! p, B, u' zecho "Starting IPv6 firewall..."
" P& w0 M% h. w, V1 u' t$IPT6 -F% X; J1 P( V1 w& H7 ?$ w7 q P
$IPT6 -X, D n* P4 e4 L. W7 G/ H; t2 U' W
$IPT6 -t mangle -F
) Q! l* l4 ~+ p3 d: A3 f) ^0 d$IPT6 -t mangle -X
) b! v: q9 j* ~6 D1 g1 @ U. l
% R$ @. S/ q% A5 R7 U: T( `3 q5 N#unlimited access to loopback
8 y. K6 W8 k0 d, V9 r$IPT6 -A INPUT -i lo -j ACCEPT1 `1 M" N# k# G% b( ]
$IPT6 -A OUTPUT -o lo -j ACCEPT& o: ~! Q9 O' W h
, _' f# G/ E) S7 M# \, o
# DROP all incomming traffic
3 {. C* x' A k- P: y% f$IPT6 -P INPUT DROP$ U* e0 v- x6 O- h4 E
$IPT6 -P OUTPUT DROP
8 k( a5 E8 D6 Y) _0 C+ o$IPT6 -P FORWARD DROP
) Y- H. a/ Z9 ?
% l5 b: V5 U- k u2 a) h4 q9 H# Allow full outgoing connection but no incomming stuff
; O" q9 m; u; G. O6 f {" S+ z" q$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
* x+ G2 W! \$ T" M$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT) l" n5 M4 Q4 C9 U) X
% F6 G; X$ ]! j. C" X" D
# allow incoming ICMP ping pong stuff
6 h4 J- v. h7 [ n5 Y/ j$ g0 _$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT
) Y% D/ x: K" d R) M$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT
' B I1 _9 Q$ V4 b- A' ?( q( a
9 v* q+ N, z# ~############# START 在下面添加上自己的特殊规则 ############# O/ v$ Z1 \& u* ^5 K0 i
### open IPv6 port 80 - b6 i& C1 ~3 H* Y
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT8 s! G- n+ H; u
### open IPv6 port 22- A2 I- y4 z) n8 M9 w+ u6 s) e
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
r" P3 @0 x3 S' Y/ V### open IPv6 port 25
! l; E* g3 S) D, \#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT) ^4 d( F/ z1 U. d
############ END 自己特殊规则结束 ################
" K/ Z1 h; w7 b& Z; F$ H
0 A2 [7 o, e- T7 q8 p( G- X#### no need to edit below ###
6 S) x8 L! K7 [$ @8 X' j. O- W9 r# log everything else1 r. N+ f, L- a9 d. R) Z* h# Y; y
$IPT6 -A INPUT -i $PUBIF -j LOG
# [/ v; Y, F" m( k* E4 o: @: h3 g$IPT6 -A INPUT -i $PUBIF -j DROP |
|