|
|
Ip6tables 是 Linux 核心中用于设置、维护和检测 IPv6 包的过滤规则的程序。使用中请注意 IPv4 版的是 iptables,而 IPv6 版的是 ip6tables。
* x9 t* w9 F4 A9 X: j2 S g/ c3 h" {% ^. }1 x
在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置:
3 M$ @* e( m8 ^' j2 ^$ \0 l. d ip6tables -nL --line-numbers* d1 V6 ^, J' p
7 S x0 P! J X0 f6 h使用编辑器编辑 /etc/sysconfig/ip6tables 文件:
3 O( a5 w( [1 k: x
9 i. m8 l7 O0 O2 ^7 r0 n/ p# vi /etc/sysconfig/ip6tables
, S8 w) \$ ^. D2 t- |! S! v可能会看到下面的默认 ip6tables 规则:(不同ip6table版本RH-Firewall-1-INPUT可能不通用请用INPUT替换)
0 P. v+ A5 |0 P* Q+ ?*filter
m+ U! \* r h% j! ^1 R( I2 `:INPUT ACCEPT [0:0]3 K/ |" }" _, a; ~# Y% R# N) ]9 o
:FORWARD ACCEPT [0:0]! c9 h& Z* a/ E( Y2 \3 |1 J5 h
:OUTPUT ACCEPT [0:0], |3 q* Z- G+ {: S# p
:RH-Firewall-1-INPUT - [0:0]: `( b+ E0 G! D& j! w
-A INPUT -j RH-Firewall-1-INPUT P8 E+ G7 O/ O0 G1 c
-A FORWARD -j RH-Firewall-1-INPUT
0 H* }5 E! l: i-A RH-Firewall-1-INPUT -i lo -j ACCEPT' G* p" O: f/ G4 H6 C; @
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT( q! E: c/ n! t6 u. o
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
. _1 Y1 \% O1 A# `-A RH-Firewall-1-INPUT -p 51 -j ACCEPT( y/ x. c5 [5 M8 w4 y O6 ?3 [7 K- J! @
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
) l1 J; a: h. w$ _2 e3 [+ |-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT; i7 p: R' K9 Z( A+ y
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
d8 V/ w; {2 S$ J! O2 r# M0 g-A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT/ m$ _; D+ Y9 J; e |2 r5 c
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
8 }0 b4 a3 t% g) C L5 C6 H-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
5 l0 P& V6 E2 @9 @ R-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited: ^: |( a+ H: ~* _
COMMIT
5 [' l/ [6 A. f' P5 t6 Y x1 M与 IPv4 的 iptables 规则类似,但又不完全相同。
( R/ f6 X% ~+ G6 W# g# F3 M! @ {1 R8 n8 F& M% Y A
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:
+ Y6 G6 g2 l7 M2 F
& x7 q8 U( q' n, F-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT' x: I& D; q6 T$ y7 \ w: I4 t0 m! Q
-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。
Y I, z8 |6 K" q" B7 q6 y4 E2 ]$ t. P5 B
要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:
8 Z- o$ Z1 ~% b4 r9 q
4 R+ p1 {+ e3 ^-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
- h! X* z8 l+ j& n# e-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
5 W. J3 x+ K2 b% |2 H; b同时针对 tcp 和 udp 协议开启 53 端口。
# `1 U# K+ R" W& U4 s1 y
& e( w; D! c! N6 D& R* t要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:' n+ s3 H0 c7 ~8 Y- \
8 c: P2 a" u' J5 X, V% B-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT5 b; W' i3 b# C" t3 r1 x8 z' }' m
要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:+ j# u; E, [6 [; `. A
' h3 z5 x( M# M9 @# _-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
, W( D2 F$ N8 O! \/ n) O0 B1 Q对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行:' p _' p% M$ H: U5 N/ U1 l/ l
1 Q, G- [0 ^3 M/ k1 L6 v. m' K3 A-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
% G: m. Q9 |9 P- NCOMMIT
8 Q4 G) u2 `7 ]* A% P# C9 \改为:, x& z8 h+ R, ]7 x
* a0 E: y( t7 p
-A RH-Firewall-1-INPUT -j LOG
. m- v) K1 R- o3 Y. w-A RH-Firewall-1-INPUT -j DROP. i0 J9 z9 I' k, H& ?2 I
COMMIT
5 W8 b+ X4 S! u5 c保存并关闭该文件。然后重新启动 ip6tables 防火墙:
. j |" j& x; Z+ M ]2 J
. C; s4 |( }$ @1 k3 V$ z# service ip6tables restart
2 p* q' h. j9 z6 A- X: i然后重新查看 ip6tables 规则,可以看到如下所示的输出:
+ L: n. a) V# u0 e0 H
$ q! _* H" w/ g- C2 u+ D& A/ v4 U# ip6tables -vnL --line-numbers
% R; D! I' p/ [. v8 B输出示例:4 [3 f# y) u' S* s
/ t, y5 h) g) j3 Q+ L$ Y1 ]' [0 L
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
! d4 B8 [2 {1 J3 M3 N; a- n7 i( }# {num pkts bytes target prot opt in out source destination
' B9 y7 }0 l9 Q7 t5 R" y$ J2 }8 r3 D1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0
$ B2 l# `" F+ m% j1 C" j1 FChain FORWARD (policy ACCEPT 0 packets, 0 bytes)* H$ ~! a+ p* K/ W/ }$ \5 g
num pkts bytes target prot opt in out source destination |9 Q6 ^/ |3 `
1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0# y5 `7 y$ p* n% ?
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)) p0 |8 s4 ^% s) q) Q7 n; s: o8 T# ]
num pkts bytes target prot opt in out source destination
* {! d- B* C, z% I$ R% W, vChain RH-Firewall-1-INPUT (2 references)4 {+ a) o1 r% ], p ^7 H( P
num pkts bytes target prot opt in out source destination
' C @# m: R! W% I1 6 656 ACCEPT all lo * ::/0 ::/0
8 N% X" L2 W( i, v2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0
0 i8 v9 e- L; L0 I/ F4 r/ i3 0 0 ACCEPT esp * * ::/0 ::/0
! F1 x4 @7 }6 N: S H% _2 R W4 0 0 ACCEPT ah * * ::/0 ::/0
C; ^; F2 R- m$ F; T( E, L5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
# A) `3 G/ \) _" {. q6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631
$ V" O5 b* z8 s5 N- l7 N% P7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631+ J3 E b- e5 o: _
8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:610000 {2 j6 b" s: F5 q
9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
7 e& \& G$ n5 r3 x3 ~7 o2 j0 h10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
1 [' X# M, P9 ~11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80
( }# ^6 d2 s o6 w/ u0 w0 y( y) J) L12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
9 @9 m) [, i6 E$ B, ?6 H13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
& K. ]. {5 G% V14 18 4196 REJECT all * * ::/0 ::/0
4 S% n9 ?1 c2 k( \+ VIPv6 私有 IP¶: {/ e$ A9 B4 ~0 E) F: Q( M
IPv4 通常默认即可保护内部局域网私有 IP 上的主机(RFC 1918)。但是 IPv6 的地址非常丰富,不再需要使用类似 NAT 等协议的私有网络。这样一来,所有的内部主机都可以拥有公网 IP 而直接连接到互联网,也就同时暴露于互联网上的各种威胁之中了。那么,如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢?
3 {" H; Q' @, a9 ]* u6 c/ ^& ]/ { P; Q; o! p: i
不过,可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。, ]% ` F/ r7 s, K
; Y3 d/ N- e" m D' W9 @- C- D6 V自动配置 IPv6 防火墙示例脚本¶
9 T. ? G; a. h9 T1 R" o4 A! c与处理 IPv4 防火墙类似,我们除了可以通过直接编辑 ip6tables 的保存文件来配置防火墙之外,还可以使用类似下面的脚本来自动执行配置过程。0 O3 S0 g* |" a' p
; }0 q! Y7 z* b, ]#!/bin/bash* l' B; d8 j+ Z7 g% ^+ D
IPT6="/sbin/ip6tables"! G9 b4 v3 N8 H, c6 R
PUBIF="eth1"- b- M, ^- H1 |( z% g
echo "Starting IPv6 firewall..."
4 ~5 J; f5 O1 Y. n9 o2 |$IPT6 -F$ x3 v; u2 I$ b# K- q
$IPT6 -X, s; N8 u4 t9 B o1 G: I9 d
$IPT6 -t mangle -F
l, u+ b& Q" m& T7 v$IPT6 -t mangle -X" _- F+ e z( ?( ?/ p H* B6 L
. f5 ]; y4 J- t: _% @- C0 \) \' b#unlimited access to loopback
/ f2 M! x1 V: y6 p5 r& }$IPT6 -A INPUT -i lo -j ACCEPT
9 l+ \5 E8 V$ u( l$IPT6 -A OUTPUT -o lo -j ACCEPT
2 E0 P2 Y5 D8 y, W2 m7 U+ O+ `( K$ a: _% N: D8 H1 B* v
# DROP all incomming traffic' |4 @& ^& g5 z6 B4 h
$IPT6 -P INPUT DROP
% K: u( t. V) m; o/ Q% K2 @$IPT6 -P OUTPUT DROP: y9 Z2 x- J2 S2 M: I: X
$IPT6 -P FORWARD DROP6 a% d2 x7 ?2 R
. I: K, B& G; P1 Y% ]8 H5 U! Y4 L# Allow full outgoing connection but no incomming stuff) \3 e6 }4 N \ j6 ?
$IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT* r; Q) B( f$ [) L
$IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT) D) _5 Z% \2 ?! }+ ?! j
: v x2 i; X+ L9 h7 g5 y4 ?
# allow incoming ICMP ping pong stuff) X4 F' z$ C r) g8 x
$IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT2 m3 X) j {* q+ |* B; n; o5 X \
$IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT
! c5 V) k* i: D4 H$ [( q- [* X& {; V' f; o
############# START 在下面添加上自己的特殊规则 ############3 C, c3 N) c r
### open IPv6 port 80 % ], M4 V9 l% z3 B0 R
#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT
0 r" ^7 K' M. D, D2 [3 E2 p### open IPv6 port 22
- x! e8 b G" ~/ N1 I/ }. e+ c#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT, u3 ?5 F' v$ k) \2 s) g4 _5 O% M
### open IPv6 port 25
/ w2 e5 C j Y3 n% w5 f% ?#$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT
Y1 R6 p$ J9 o" C$ d############ END 自己特殊规则结束 ################/ y5 i' O1 Z, |9 I4 Q1 P3 Y+ p
5 _: K7 S' @$ O2 @3 D$ O5 a3 f
#### no need to edit below ###
/ E9 `+ U$ Q n$ O7 Z6 F5 ^, h# log everything else
3 M2 B7 m3 P0 w8 ]0 r4 Q$ J$IPT6 -A INPUT -i $PUBIF -j LOG8 x) P, n' F1 c9 O
$IPT6 -A INPUT -i $PUBIF -j DROP |
|