Linux

關於 IPv6 規則和 ip6tables 的幫助

  • January 5, 2018

現在我正試圖弄清楚如何在我的伺服器上設置一些 IPv6 規則。我的要求是禁止向環回設備和本地 IP 地址(在本例中為本地連結)輸入回應要求,並打開埠 22、80 和 443。一切都適用於 IPv4,但我似乎在 INPUT 的鏈順序之後出現了 ip6tables 的問題。這是我現在擁有的:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p icmpv6 -m icmpv6 --icmpv6-type echo-request -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j REJECT
-A FORWARD -j REJECT --reject-with icmp6-port-unreachable
-A OUTPUT -p icmpv6 --icmpv6-type echo-request -d ::1/128 -j REJECT --reject-with icmp6-port-unreachable
-A OUTPUT -p icmpv6 --icmpv6-type echo-request -d fe80::/64 -j REJECT --reject-with icmp6-port-unreachable
-A OUTPUT -j ACCEPT
COMMIT

目前我的罪魁禍首是-A INPUT -j REJECT. 我的期望是它會隱含地否認鏈中上面未列出的所有內容。但這似乎並非如此,並且似乎與具有 IPv4 規則的普通舊 iptables 的行為不同。有人可以告訴我這裡的解決方案嗎?這是一個 Ubuntu 14.04 伺服器

讓我們先看看你的規則試圖做什麼,看看為什麼它們可能不起作用:

-A INPUT -i lo -j ACCEPT

將處理到達環回介面的所有流量,包括 ICMPv6 流量。

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

很正常。

-A INPUT -p icmpv6 -m icmpv6 --icmpv6-type echo-request -j ACCEPT

這條規則,如所寫,將只允許 ping 請求(到任何介面):任何其他 ICMPv6 數據包將在最後被顯式 REJECT 拒絕。

-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j REJECT
-A FORWARD -j REJECT --reject-with icmp6-port-unreachable

很正常。

-A OUTPUT -p icmpv6 --icmpv6-type echo-request -d ::1/128 -j REJECT --reject-with icmp6-port-unreachable
-A OUTPUT -p icmpv6 --icmpv6-type echo-request -d fe80::/64 -j REJECT --reject-with icmp6-port-unreachable

這些規則只會阻止您的主機向 localhost 和連結本地網路地址發送 ping(同樣,連結本地地址範圍是 /10。)

-A OUTPUT -j ACCEPT

很正常。

但是,您說:“我的要求是禁止向環回設備和本地 IP 地址(在本例中為連結本地)輸入回應要求

$$ … $$“。您編寫的規則幾乎與您對此要求的要求相反。此外,通常最好將輸入過濾器放在輸入端,因為這是大多數人會尋找這樣的東西的地方,它會對所有流量都有效,而不僅僅是您的電腦正在發送的流量。 我建議您編寫規則鏈如下:

-A INPUT -i lo -p icmpv6 -m icmpv6 --icmpv6-type echo-request -j REJECT --reject-with icmp6-port-unreachable
-A INPUT -d fe80::/10 -p icmpv6 -m icmpv6 --icmpv6-type echo-request -j REJECT --reject-with icmp6-port-unreachable
-A INPUT -p icmpv6 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j REJECT
-A FORWARD -j REJECT --reject-with icmp6-port-unreachable

關於重寫規則的一些觀察:

  1. 我更喜歡將 REJECT 規則放在 ACCEPT 規則前面,將較窄的過濾器放在較寬的過濾器前面,這樣我就不會因為更寬的過濾器允許某些東西而意外允許通過。這不是一成不變的規則,但它可以幫助我更容易地想像正在發生的事情。
  2. 不再需要 OUTPUT 鏈,因為規則是在 INPUT 鏈中處理的。
  3. 儘管您將其作為要求,但我不確定您為什麼要禁止對環回介面的 ping,因為只有本地電腦可以發送到該介面。不過,這只是一個觀察結果:如果您有特殊需要這樣做,那很好。

引用自:https://unix.stackexchange.com/questions/414875