ip6tables命令
ip6tables命令
ip6tables命令和iptables⼀样,都是linux中防⽕墙软件,不同的是ip6tables采⽤的TCP/ip协议为IPv6。常⽤语法
语法
ip6tables(选项)
选项
-t<;表>:指定要操纵的表;
-A:向规则链中添加条⽬;
-D:从规则链中删除条⽬;
-i:向规则链中插⼊条⽬;
-R:替换规则链中的条⽬;
-L:显⽰规则链中已有的条⽬;
-F:清楚规则链中已有的条⽬;
-Z:清空规则链中的数据包计算器和字节计数器;
-N:创建新的⽤户⾃定义规则链;
-P:定义规则链中的默认⽬标;
-h:显⽰帮助信息;
-p:指定要匹配的数据包协议类型;
-s:指定要匹配的数据包源ip地址;
-j<⽬标>:指定要跳转的⽬标;
-i<⽹络接⼝>:指定数据包进⼊本机的⽹络接⼝;
-o<⽹络接⼝>:指定数据包要离开本机所使⽤的⽹络接⼝。
-
c<;计数器>:在执⾏插⼊操作(inrt),追加操作(append),替换操作(replace)时初始化包计数器和字节计数器。
实例
在命令⾏窗⼝输⼊下⾯的指令就可以查看当前的 IPv6 防⽕墙配置:
ip6tables -nl --line-numbers
/etc/sysconfig/ip6tables⽂件
使⽤编辑器编辑/etc/sysconfig/ip6tables⽂件:
vi /etc/sysconfig/ip6tables
可能会看到下⾯的默认 ip6tables 规则:
*filter
:INPUT accept [0:0]
团结奋进:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-
A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -j reject --reject-with icmp6-adm-prohibited
COMMIT
与 IPv4 的 iptables 规则类似,但⼜不完全相同。
要开启 80 端⼝(HTTP 服务器端⼝),在 COMMIT ⼀⾏之前添加如下规则:怎么备课
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
-p tcp表⽰仅针对 tcp 协议的通信。--dport指定端⼝号。
要开启 53 端⼝(DNS 服务器端⼝),在 COMMIT ⼀⾏之前添加如下规则:
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
-
A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
同时针对 tcp 和 udp 协议开启 53 端⼝。
要开启 443 端⼝,在 COMMIT ⼀⾏之前添加如下规则:
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
要开启 25 端⼝(SMTP 邮件服务器端⼝),在 COMMIT ⼀⾏之前添加如下规则:
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后⼀⾏:
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
COMMIT
改为:
-A RH-Firewall-1-INPUT -j LOG
-A RH-Firewall-1-INPUT -j DROP
COMMIT
保存并关闭该⽂件。然后重新启动 ip6tables 防⽕墙:
# rvice ip6tables restart
然后重新查看 ip6tables 规则,可以看到如下所⽰的输出:
小雀儿# ip6tables -vnL --line-numbers幼儿咳嗽
输出⽰例:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
142237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0大班户外体育游戏
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
100 RH-Firewall-1-INPUT all * * ::/0 ::/0
Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes)
num pkts bytes target prot opt in out source destination
Chain RH-Firewall-1-INPUT (2 references)
num pkts bytes target prot opt in out source destination
16656 ACCEPT all lo * ::/0 ::/0
237519 2730K ACCEPT icmpv6 * * ::/0 ::/0
300 ACCEPT esp * * ::/0 ::/0
400 ACCEPT ah * * ::/0 ::/0
541348385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353
600 ACCEPT udp * * ::/0 ::/0 udp dpt:631
700 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631
817379521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000
900 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02
1000 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22
1100 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80
1200 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
134108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53
14184196 REJECT all * * ::/0 ::/0
IPv6 私有 IP
IPv4 通常默认即可保护内部局域⽹私有 IP 上的主机。但是 IPv6 的地址⾮常丰富,不再需要使⽤类似
NAT 等协议的私有⽹络。这样⼀来,所有的内部主机都可以拥有公⽹ IP ⽽直接连接到互联⽹,也就同时暴露于互联⽹上的各种威胁之中了。那么,如何配置 IPv6 防⽕墙使其默认将除了 ping6 请求之外的所有输⼊数据包都丢弃呢?可以使⽤前缀来标识本地 IPv6 单播地址。
IPv6的特殊地址(本地单播地址):
链路本地地址和唯⼀本地地址都属于本地单播地址,在IPv6中,本地单播地址就是指本地⽹络使⽤的单播地址,也就是IPV4地址中局域
⽹专⽤地址。每个接⼝上⾄少要有⼀个链路本地单播地址,另外还可分配任何类型(单播、任播和组播)或范围的IPv6地址。
(1) 链路本地地址(FE80::/10):仅⽤于单个链路(链路层不能跨VLAN),不能在不同⼦⽹中路由。结点使⽤链路本地地址与同⼀个链路上的相邻结点进⾏通信。例如,在没有路由器的单链路IPv6⽹络上,主机使⽤链路本地地址与该链路上的其他主机进⾏通信。
(2) 唯⼀本地地址(FC00::/7):唯⼀本地地址是本地全局的,它应⽤于本地通信,但不通过Internet路由,将其范围限制为组织的边界。ip6tables的nat转发
1.常⽤命令
显⽰nat表规则:
ip6tables -t nat -nL
显⽰编号:
ip6tables -t nat -nL --line-number
删除对应编号:
ip6tables -t nat -D PREROUTING 1
ip6tables -t nat -D POSTROUTING 1
添加转发规则:
ip6tables -t nat -I PREROUTING -p tcp --dport 80 -j DNAT --to [本地IPv6地址]:8999
ip6tables -t nat -I POSTROUTING -p tcp --dport 8999 -j MASQUERADE
注:SNAT,DNAT,MASQUERADE都是NAT,MASQUERADE是SNAT的⼀个特例。
SNAT是指在数据包从⽹卡发送出去的时候,把数据包中的源地址部分替换为指定的IP,这样,接收⽅就认为数据包的来源是被替换的那个IP的主机。
MASQUERADE是⽤发送数据的⽹卡上的IP来替换源IP,因此,对于那些IP不固定的场合,⽐如拨号⽹络或者通过dhcp分配IP的情况下,就得⽤MASQUERADE。
2.可能遭遇的问题:
数据包进⼊PREROUTE链后,修改完DNAT,但未转发到POSTROUTE脸。
解决⽅案:开启内核forward转发
查看:sysctl -a |grep ipv6 |grep forward
修改:sysctl -w f.all.forwarding=1
允许特定的 ICMPv6 通信
使⽤ IPv6 的时候需要允许⽐ IPv4 更多类型的 ICMP 通信以保证路由和 IP 地址⾃动配置等功能正常⼯作。有时候,如果你的规则设置太过苛刻,可能都⽆法分配到正确的 IPv6 地址。当然,不使⽤ DHCP ⽽是⼿动配置 IP 地址的除外。
下⾯是⼀些⽐较常见的 ipv6-icmp 配置实例:
:ICMPv6 - [0:0]
# Approve certain ICMPv6 types and all outgoing ICMPv6
# /viewtopic.php?p=39840#39840
家庭吧台设计-A INPUT -p icmpv6 -j ICMPv6
-A ICMPv6 -p icmpv6 --icmpv6-type echo-request -j ACCEPT
-A ICMPv6 -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT
-A ICMPv6 -p icmpv6 --icmpv6-type packet-too-big -j ACCEPT
-A ICMPv6 -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT
-A ICMPv6 -p icmpv6 --icmpv6-type parameter-problem -j ACCEPT
-A ICMPv6 -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT
-
A ICMPv6 -p icmpv6 --icmpv6-type router-advertiment -j ACCEPT
-A ICMPv6 -p icmpv6 --icmpv6-type neighbour-solicitation -j ACCEPT
荆州古城
-A ICMPv6 -p icmpv6 --icmpv6-type neighbour-advertiment -j ACCEPT
-A ICMPv6 -p icmpv6 --icmpv6-type redirect -j ACCEPT
-A ICMPv6 -p icmpv6 --icmpv6-type 141 -j ACCEPT
体操比赛口号-A ICMPv6 -p icmpv6 --icmpv6-type 142 -j ACCEPT
-A ICMPv6 -p icmpv6 --icmpv6-type 148 -j ACCEPT
-A ICMPv6 -p icmpv6 --icmpv6-type 149 -j ACCEPT
-A ICMPv6 -p icmpv6 --icmpv6-type 130 -s fe80::/10 -j ACCEPT
-A ICMPv6 -p icmpv6 --icmpv6-type 131 -s fe80::/10 -j ACCEPT
-A ICMPv6 -p icmpv6 --icmpv6-type 132 -s fe80::/10 -j ACCEPT
-
A ICMPv6 -p icmpv6 --icmpv6-type 143 -s fe80::/10 -j ACCEPT
-A ICMPv6 -p icmpv6 --icmpv6-type 151 -s fe80::/10 -j ACCEPT
-A ICMPv6 -p icmpv6 --icmpv6-type 152 -s fe80::/10 -j ACCEPT
-A ICMPv6 -p icmpv6 --icmpv6-type 153 -s fe80::/10 -j ACCEPT
-A ICMPv6 -j RETURN
-A OUTPUT -p icmpv6 -j ACCEPT
Linux上的MAP66(NAT)
IPv6的NAT也不例外。MAP66是⼀个基本遵循RFC6296建议的Linux实现,很简单,和IPv4的iptables⼀样:
1.配置正向的转换规则,将源地址fdca:ffee:babe::/64⽹段的地址转换为2008:db8:1::/64⽹段的地址
ip6tables -t mangle -A POSTROUTING -s fdca:ffee:babe::/64 -o eth2 -j MAP66--src-to 2008:db8:1::/64
可以看出,没有显式指定任何具体地址,类似IPv4的MASQUERADE和IPv4的IP Pool,原理详见第5节。
2.配置反向包的转换规则,将正向包被转换过的地址再转换回去
ip6tables -t mangle -A PREROUTING -d 2008:db8:1::/64 -i eth2 -j MAP66 --dst-to fdca:ffee:babe::/64
可以看出,也没有显式指定任何具体的地址,更值得⼀提的是,内核并不维护任何关于NAT映射的信息,因此MAP66也不再依赖
ip(6)_conntrack。
如果使能上述两条规则,ping⼀下对端地址,tcpdump抓包的结果如下:
IPv6⼀对⼀映射:
ip6tables -t nat -A PREROUTING -d 2001::4/128 -j DNAT --to-destination fd01::2002:3a4b:2aff:fee8:2
ip6tables -t nat -A POSTROUTING -s fd01::2002:3a4b:2aff:fee8:2/128 -o eth2 -j SNAT --to-source 2001::4/128待映射的IPv6地址:2001::4/128
映射后的IPv6地址:fd01::2002:3a4b:2aff:fee8:2