在ip6tables中设置规则还是禁用ipv6更好?


11

我具有以下网络配置:

# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:e0:1c:73:02:09
          inet addr:10.1.4.41  Bcast:10.1.255.255  Mask:255.255.0.0
          inet6 addr: fe80::2e0:4cff:fe75:309/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:858600 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1069549 errors:0 dropped:0 overruns:5 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:142871181 (136.2 MiB)  TX bytes:717982640 (684.7 MiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:37952 errors:0 dropped:0 overruns:0 frame:0
          TX packets:37952 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:3396918 (3.2 MiB)  TX bytes:3396918 (3.2 MiB)

我的网络中有DHCP服务器,可以获得以下租约:

lease {
  interface "eth0";
  fixed-address 10.1.4.41;
  option subnet-mask 255.255.0.0;
  option routers 10.1.255.253;
  option dhcp-lease-time 120;
  option dhcp-message-type 5;
  option domain-name-servers 82.160.125.52,213.199.198.248,82.160.1.1;
  option dhcp-server-identifier 192.168.22.22;
  renew 3 2014/01/01 18:34:41;
  rebind 3 2014/01/01 18:35:30;
  expire 3 2014/01/01 18:35:45;
}

我可以ping 127.0.0.1::110.1.4.41

$ ping 10.1.4.41
PING 10.1.4.41 (10.1.4.41) 56(84) bytes of data.
64 bytes from 10.1.4.41: icmp_seq=1 ttl=64 time=0.065 ms
64 bytes from 10.1.4.41: icmp_seq=2 ttl=64 time=0.075 ms
64 bytes from 10.1.4.41: icmp_seq=3 ttl=64 time=0.085 ms
^C
--- 10.1.4.41 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.065/0.075/0.085/0.008 ms

$ ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.066 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.056 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.055 ms
^C
--- 127.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.055/0.059/0.066/0.005 ms

$ ping6 ::1
PING ::1(::1) 56 data bytes
64 bytes from ::1: icmp_seq=1 ttl=64 time=0.052 ms
64 bytes from ::1: icmp_seq=2 ttl=64 time=0.049 ms
64 bytes from ::1: icmp_seq=3 ttl=64 time=0.037 ms
^C
--- ::1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.037/0.046/0.052/0.006 ms

我无法ping ipv6地址fe80::2e0:4cff:fe75:309

$ ping6 fe80::2e0:4cff:fe75:309
connect: Invalid argument

我已经设置了一些iptables规则(ipv4):

# iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-N TCP
-N UDP
-A INPUT -i eth0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i tun0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
-A OUTPUT -m conntrack --ctstate INVALID -j DROP

并且它可以为ipv4正常工作。但是当我检查ip6tables时,我看到那里有一些数据包:

# ip6tables -nvL
Chain INPUT (policy ACCEPT 381 packets, 27624 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 390 packets, 26296 bytes)
 pkts bytes target     prot opt in     out     source               destination

我遵循了指南,他们说我应该复制iptables(ipv4)配置并将其粘贴到ip6tables(ipv6)中。但是,当我这样做时,没有数据包可以通过RELATED,ESTABLISHEDipv6表中的规则。由于INPUT链策略(DROP),所有它们都被删除。

# ip6tables -nvL
Chain INPUT (policy DROP 5 packets, 360 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all      eth0   *       ::/0                 ::/0                 ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all      lo     *       ::/0                 ::/0
    0     0 ACCEPT     all      tun0   *       ::/0                 ::/0                 ctstate RELATED,ESTABLISHED
    0     0 DROP       all      *      *       ::/0                 ::/0                 ctstate INVALID
    0     0 UDP        udp      *      *       ::/0                 ::/0                 ctstate NEW
    0     0 TCP        tcp      *      *       ::/0                 ::/0                 tcp flags:0x17/0x02 ctstate NEW
    0     0 REJECT     tcp      *      *       ::/0                 ::/0                 reject-with tcp-reset
    0     0 REJECT     udp      *      *       ::/0                 ::/0                 reject-with icmp6-port-unreachable

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DROP       all      *      *       ::/0                 ::/0                 ctstate INVALID

Chain TCP (1 references)
 pkts bytes target     prot opt in     out     source               destination

Chain UDP (1 references)
 pkts bytes target     prot opt in     out     source               destination

如您所见,没有输出数据包,那么为什么Google和Stack Exchange尝试连接到我的机器?而且,即使我无法ping我的ipv6地址,他们也该怎么做?

他们还说,如果我的ISP没有ipv6(在租约中,没有ipv6条目),我应该禁用ipv6,并在使用之前做过此操作ipv6.disable=1。我在提出了类似的问题meta.stackoverflow.com,但得到的答案是我不应该禁用ipv6。

我不知道该怎么做。我有一些连接问题,我的意思是有时我无法在堆栈交换或Google上访问页面,pastebin.com也有问题。在每种情况下,都有相同的症状-在浏览器中输入地址后,有时我必须等待几分钟才能访问该网站,然后重新加载2-3次后,我可以自由浏览它,至少一定的时间。

Answers:


13

您的IPv6地址以开头,fe80:因此是本地链接地址。此类地址只能在与网络接口相同的链接上使用。因为同样的链路本地子网中的每个网络上存在的接口,你必须指定哪个你想使用的界面。例如,当您要ping通本地链接地址时。

请尝试以下ping6示例之一。两者都做同样的事情:

ping6 fe80::2e0:4cff:fe75:309%eth0
ping6 -I eth0 fe80::2e0:4cff:fe75:309

这也意味着,只有本地链接(您的LAN)上的系统才能使用此链接本地地址连接到您的系统。路由器不会路由这些地址。Google或Stack Exchange无法将IPv6流量发送到您的计算机,因为您的计算机没有可从其访问/路由的IPv6地址。

那么,什么IPv6流量你看到你的界面上?可能像mDNS(多播DNS)之类的东西可以自动在本地链接上连接。例如Apple AirplayWindows Home Group

您的防火墙规则缺少一件非常重要的事情:ICMPv6。IPv6使用ICMP比使用IPv4多得多,并且不让ICMP数据包进入会严重削弱流量,因为您不会收到与该流量相关的错误消息。这可能会导致长时间的延迟/超时。通常,允许进入ICMPv6流量不会有什么坏处,因此可以将其添加到防火墙规则中:

ip6tables -A INPUT -p icmpv6 -j ACCEPT

如果您想阻止ping6数据包(尽管我现在不太清楚为什么人们现在仍然这样做,这会使调试连接变得更加困难),则可以在上ACCEPT一行之前添加以下内容:

ip6tables -A INPUT -p icmpv6 --icmpv6-type 128 -j DROP

当您与计算机建立真正的全局IPv6连接时,这最重要,但是如果您已经为此做好准备,则不会受到任何损害:-)


1
我明白了 我添加了icmpv6规则,但限制为20 / min,我可以看到数据包在那里。ping6 -I eth0 fe80::2e0:4cff:fe75:309也可以。
Mikhail Morfikov 2014年

2

我总是采取这样的立场,管理系统时,任何事情,我不明确需要提供该系统上的服务,它应该被关闭。无论是以下哪种情况,这一理念都应运而生:

  • 卸载不必要的软件
  • 在服务器上禁用GUI桌面
  • 禁用和/或排除不必要的硬件
  • 禁用IPv6
  • 禁用不必要的服务
  • 等等

我有同样的理念,但是在这种情况下,我真的不知道该怎么办。有人说我应该禁用ipv6,其他人则说些不同。即使禁用了ipv6,我也有问题。
米哈伊尔·莫尔菲科夫

@MikhailMorfikov-您的ISP是否在使客户使用IPv6只是为了访问ISP的情况下执行任何代理/ NAT。我认为这对您来说不是问题,否则您会拥有一个IPv6地址,但只是想到了这一点。
slm

我不知道,也许我应该问他们,也许他们会做些事情并解决问题。
Mikhail Morfikov 2014年

2

他们还说,如果我的ISP没有ipv6(在租约中,没有ipv6条目),我应该禁用ipv6,并在使用ipv6.disable = 1之前进行了此操作。我在meta.stackoverflow.com上问了类似的问题,并且得到了我不应该禁用ipv6的答案。

当然,您不会看到DHCP的IPv6地址租约-这就是DHCPv6的用途:DHCP和DHCPv6不兼容。

关于是否关闭IPv6:如果您不需要它,而您的ISP还不提供它,请关闭它,但准备引入它。这包括删除/重新设计明确依赖于旧IP的所有内容,例如硬编码IP地址或使用广播。

Apropos关闭IPv6:请注意,例如,Microsoft将IPv6视为操作系统的组成部分,因此在该位置关闭IPv6可能会影响您从中获得的支持。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.