|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
: ~' z# @& A1 t# O6 k5 ~- N- H6 F" z, ?7 T1 i, A
在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:
3 `( L9 @7 t7 ^; {6 u/ Y' {2 S* f ip6tables -nL --line-numbers+ k5 d6 x3 {2 Z" C0 a% o0 |
) T4 u( q! o( j: r4 I3 T: D+ S/ K
使用编辑器编辑 /etc/sysconfig/ip6tables 文件:: I' V# m0 D9 O0 e* H
2 ~1 u4 t) ]% V# vi /etc/sysconfig/ip6tables
) {* \" Q( _. _2 Q& |! t% Q8 z$ _% U可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)
: K8 h- Q* P y9 e: A7 N: b*filter G' q/ `6 v) ^; y. s, Z
:INPUT ACCEPT [0:0]
& m* I, ~0 g6 N+ `% G:FORWARD ACCEPT [0:0]! n9 n4 ?9 Z' [, { b2 s7 D
:OUTPUT ACCEPT [0:0]
+ C# M$ M" N: W2 ^:RH-Firewall-1-INPUT - [0:0]6 X( U! U$ Z- w3 M
-A INPUT -j RH-Firewall-1-INPUT
( Y, C1 W$ O P- c-A FORWARD -j RH-Firewall-1-INPUT
* _2 A1 k2 c( A-A RH-Firewall-1-INPUT -i lo -j ACCEPT% U% B5 T& ]- `& | c, i- B2 P. W) }
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT% m5 L: U! l0 y! K
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT& v+ [4 C5 Y1 R6 y
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
' C) n7 K& Z) h* N/ B-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT' ?; H; ^1 x$ M1 r
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT+ d( }; I% n( c
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT, r6 K7 k8 L' f' u f) E* F
-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT; g5 `* z" k% g9 k# j3 _! C
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
: Z) N5 \" [- @8 U$ j0 q-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT9 z+ D. D( D" w' T" l, E
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited; q8 f& x0 n: _7 N0 m, u( B+ g
COMMIT
( v% N" ?2 i* j. \3 r/ Q v7 V与 IPv4 的 iptables 规则类似,但又不完全相同。5 k6 `4 B8 P7 w6 O! S& B5 U
9 f1 H5 L9 t( e* G( }( L要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
" P2 Q. g! P9 L2 H
( B w) ?4 \. o; F; G# g& E2 l-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
; `% J% G1 ~ G* Q# l-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
0 C7 ]) a* Z I, m! y B
! N6 ~& w2 U% X. G0 t% Y* P要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:. y5 i" N/ i: ?3 ]1 v
$ s$ z" q" W8 g/ y1 t-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
( m1 t. z) r- r( ^-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
0 g( t3 C, N$ ~, m+ G9 b a同时针对 tcp 和 udp 协议开启 53 端口。
: ]5 h; }2 C5 C' l! X# L: V
% }5 O9 \4 K1 H" ~% k要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:
" G7 G1 Z( K6 z9 p9 r5 O3 x7 o p, m9 Y+ c* |3 W* f! } }
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT! y, M# m& f" o; ^
要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:
) ^0 L' }3 @ z6 P0 r
5 L `5 w% V9 z-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
2 V7 m9 p" G" }对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:
, I% X" `2 n3 w/ P8 h& D0 N+ C8 L8 C$ B/ A! N% s+ c" V/ |; P
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
6 |) P% D" r- m: fCOMMIT( L$ s/ m& j2 v8 L6 K+ M
改为:: v9 O! \: g) ^. V( t. C0 l
& q ?; n+ U# B% g-A RH-Firewall-1-INPUT -j LOG
8 A3 @6 F- D. E9 t' a-A RH-Firewall-1-INPUT -j DROP
4 o5 W, Y; c- ~7 D! ICOMMIT
9 L1 c( m/ K0 H7 [保存并关闭该文件。然后重新启动 ip6tables 防火墙:) T j9 d! j9 X9 _+ Q( {
* t# B7 b( J3 l* R8 s2 v' m% o# service ip6tables restart8 t u$ g) e' a# _" [
然后重新查看 ip6tables 规则,可以看到如下所示的输出:. b$ i' J* o4 Y3 [
4 M+ m) R _" u: e& g/ b7 Y. O# ip6tables -vnL --line-numbers
. g' K9 u* W4 p输出示例:. u; [' E" F5 G7 B* y+ h
8 y/ v. L; N9 w* W, I6 R- t6 q) l, gChain INPUT (policy ACCEPT 0 packets, 0 bytes)( x# t! S. p+ |! o$ l
num pkts bytes target prot opt in out source destination
! h: i+ ^+ O; {; d' {7 q1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/05 F- k- o, }. o v1 T
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)& `8 H& d" w. ~% A5 K. S
num pkts bytes target prot opt in out source destination
% R$ Y+ D: X' {7 D" B9 `1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0
3 A/ c$ y, U m1 M CChain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
0 r G: V; W0 c Q$ l2 rnum pkts bytes target prot opt in out source destination
5 {7 I$ [8 M! b( ?' z. d* _" TChain RH-Firewall-1-INPUT (2 references)
5 F1 Z8 J1 \6 @/ o7 K& X" O0 inum pkts bytes target prot opt in out source destination
5 J% r) Q8 X1 k1 6 656 ACCEPT all lo * ::/0 ::/0
O& ]6 p2 K! v- v2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0
" n2 X7 i) P+ x8 N) i, f3 0 0 ACCEPT esp * * ::/0 ::/06 t- ^% o1 Q! I; h. l
4 0 0 ACCEPT ah * * ::/0 ::/0
! S) n' m7 a) R; k5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353% T, B9 J5 h5 a" ]5 t, z) c
6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631
2 N8 c7 m8 P3 c! \1 v* d; p6 p7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631, ~( n: C; e* n8 B4 |/ ~ ^
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:610007 `- B @& _# s" {) o8 k( Y
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
( o; U' }; C6 z& O! `/ q9 _10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
* w9 q6 O, i" h6 i! O" G6 u11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80
/ g6 H1 Y1 V6 M" [. s$ @12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53# s' ?4 D) K6 G+ S& l% h
13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
4 D6 p% r0 {8 M9 k) K+ ]14 18 4196 REJECT all * * ::/0 ::/05 B7 o6 y1 T, d' K# `( h
IPv6 私有 IP¶
/ {$ _3 ]4 _( j& h% d- Q0 W( G) B/ z( xIPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?% H$ b* ?% F9 I" j: k' _0 O
% r X' `0 w& E( [/ h" t
不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。
5 s% r- b' ~5 d! c+ C- [ e/ k0 U. `3 T9 [; M, @
自动配置 IPv6 防火墙示例脚本¶
3 w* L7 V1 m% l与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。8 j% V* F; @# m2 H4 H% B
5 }+ m! T5 U: y7 c
#!/bin/bash
! ^" U( ~$ l3 s$ l9 U$ E7 A% cIPT6="/sbin/ip6tables"1 X, G/ L# N, u; R+ E" n* X1 L2 Y
PUBIF="eth1"4 k. d/ T0 z6 F: q8 S$ g w
echo "Starting IPv6 firewall..."
0 x7 |" R+ }8 s6 b$ d3 j$IPT6 -F
+ g" p4 t5 e! }% B& O6 }$IPT6 -X
3 |7 r& e! k( F6 T* B) ]$ U5 e$IPT6 -t mangle -F x+ |2 _7 y$ j
$IPT6 -t mangle -X
1 ?( L; V1 _' C m1 E
. h7 N0 g8 }5 j, W7 P' T#unlimited access to loopback
- ~9 D/ z/ K2 D+ f, E4 {+ u5 C$IPT6 -A INPUT -i lo -j ACCEPT
- y# U1 V) J, s; c$ V& K$ c$IPT6 -A OUTPUT -o lo -j ACCEPT- V7 j" e0 Q& R
: W3 k4 _( V6 S" X6 G0 x' t5 M
# DROP all incomming traffic3 b, J$ {. l' @ `8 r9 w
$IPT6 -P INPUT DROP, I4 `, E% d% N4 @- |! F
$IPT6 -P OUTPUT DROP4 U2 e7 G6 s& V
$IPT6 -P FORWARD DROP0 B8 p( v) U: d1 e1 ?
# f7 _! ]( h* @* ` M. Z, H: y
# Allow full outgoing connection but no incomming stuff0 `+ k0 k4 d6 n/ _ H% A
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT" k: |% R3 \8 P
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT' n1 ~% _# }" ?* {( d
1 o+ w+ L" p, c0 O4 S8 K. w) }# allow incoming ICMP ping pong stuff9 T: q! I( g. x
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT
5 V5 r; b8 {. |8 {# U7 V# r- j/ }2 t$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT
" D6 ?1 _" y- ^8 E7 [: L* l, {0 d" v3 S
############# START 在下面添加上自己的特殊规则 ############5 b% Y- c% z4 X/ z% E. g; p" z* R
### open IPv6 port 80
6 K7 @2 W1 i- U0 n( n' W3 B9 r/ d#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT5 u: \/ l8 X2 Z( ^$ z, q
### open IPv6 port 22
/ ^/ i% ?4 m4 \- U1 J#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT
0 J4 s0 z8 H o5 h( s0 j### open IPv6 port 25
& N+ L# a; Q N& `1 x#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT
& x; f+ s8 x6 L, X# F! E############ END 自己特殊规则结束 ################& a. w _( J& Z8 x. }. u
0 I' N z2 P, T! A#### no need to edit below ###
8 E* h; t0 f- D" ~2 Z+ k9 e& n/ @. d# log everything else. y' U: z( ]3 @/ g' m; }9 Q
$IPT6 -A INPUT -i $PUBIF -j LOG5 q- @3 g4 z7 Z2 T; Q# O
$IPT6 -A INPUT -i $PUBIF -j DROP |
|