Security

Geth 乙太坊節點中用於 IPv4 和 IPv6 的良好 iptables 規則集

  • December 13, 2016

目前我正在為我的遠端(伺服器)geth 節點使用以下 iptables 規則:

V4

*filter

# Allow all loopback (lo0) traffic and reject traffic
# to localhost that does not originate from lo0.
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT

# Allow ping.
-A INPUT -p icmp -m state --state NEW --icmp-type 8 -j ACCEPT

# Allow SSH connections.
-A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT

# Allow TCP and UDP connections from anywhere
-A INPUT -p tcp --dport 30303 -m state --state NEW -j ACCEPT
-A INPUT -p udp --dport 30303 -m state --state NEW -j ACCEPT
-A INPUT -p udp --dport 30301 -m state --state NEW -j ACCEPT

# Allow inbound traffic from established connections.
# This includes ICMP error returns.
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Log what was incoming but denied.
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables_INPUT_denied: " --log-level 7

# Reject all other inbound.
-A INPUT -j REJECT

# Log any traffic that was sent to you
# for forwarding.
-A FORWARD -m limit --limit 5/min -j LOG --log-prefix "iptables_FORWARD_denied: " --log-level 7

# Reject all traffic forwarding.
-A FORWARD -j REJECT

COMMIT

V6

*filter

# Allow all loopback (lo0) traffic and reject traffic
# to localhost that does not originate from lo0.
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -s ::1/128 -j REJECT

# Allow ping.
-A INPUT -p icmp -m state --state NEW --icmp-type 8 -j ACCEPT

# Allow SSH connections.
-A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT

# Allow TCP and UDP connections from anywhere
-A INPUT -p tcp --dport 30303 -m state --state NEW -j ACCEPT
-A INPUT -p udp --dport 30303 -m state --state NEW -j ACCEPT
-A INPUT -p udp --dport 30301 -m state --state NEW -j ACCEPT

# Allow inbound traffic from established connections.
# This includes ICMP error returns.
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Log what was incoming but denied.
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "ip6tables_INPUT_denied: " --log-level 7


# Reject all other inbound.
-A INPUT -j REJECT

# Log any traffic that was sent to you
# for forwarding.
-A FORWARD -m limit --limit 5/min -j LOG --log-prefix "ip6tables_FORWARD_denied: " --log-level 7

# Reject all traffic forwarding.
-A FORWARD -j REJECT

COMMIT

有什麼辦法可以讓規則更安全。另外我想知道對於奇偶校驗節點是否足夠好。

在這個Reddit 執行緒上有很多很好的答案和建議,我將嘗試總結一下。

iptables 本身的規則不足以應對大型或有組織的攻擊,數據中心必須在其網路中具有某種適當的 DDoS 保護。這在處理 DDoS 攻擊時至關重要。

  • 刪除所有請求/從預設的 DROP 策略開始

從預設的 DROP 策略開始,然後簡單地將所需的任何內容列入白名單是一個很好的策略。

一個好的建議是丟棄所有請求,但伺服器期望接收或期望發出的請求除外。另一個好主意是明確丟棄埠 0,一些攻擊正在利用它,因為一些 DDoSer 仍然能夠繞過對該埠的攻擊。不確定這是否只是困擾舊 iptables/OS 的問題。

此類規則的範例如下:

iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 30303 -j ACCEPT
iptables -A INPUT -p udp --dport 30303 -j ACCEPT

iptables -P FORWARD DROP

.. ETC

  • 使用 netstat 查看每個服務需要哪些埠

除了“DROP”策略之外,使用 netstat 包含您需要的任何服務所需的埠並將它們包含在 iptables 規則中是一個好方法。在這個例子中,除了 Geth 的埠,我們還包括了比特幣和萊特幣客戶端的守護程序埠

#!/bin/bash
IPT="/sbin/iptables"
# This is the iptables script that will be loaded through a cronjob, every time the system boots. 
# First we will flush old rules and then fill iptables with policies and rules specified below.
# Iptables on
systemctl start iptables
# Flush old rules, old custom tables
$IPT --flush
$IPT --delete-chain

### POLICIES ###
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP

### INPUT RULES ###
# accept local port use, for example so you can use json-rpc on the    servers cli
$IPT -A INPUT -i lo -j ACCEPT
# accept other nodes data reply in case for example a peer request your Geth made to another node
$IPT -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
# ssh from your home
$IPT -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
# accept your local crypto daemons to receive connections
# Bitcoin
$IPT -A INPUT -p tcp --dport 18333 -s 0.0.0.0/0 -j ACCEPT
# Litecoin
$IPT -A INPUT -p tcp --dport 19333 -s 0.0.0.0/0 -j ACCEPT
# Go-Ethereum (Geth)
$IPT -A INPUT -p tcp --dport 30303 -s 0.0.0.0/0 -j ACCEPT
  • 僅接受來自您的家庭 IP 地址的 SSH

做類似的事情:

$IPT -A INPUT -p tcp --dport 22 -m state --state NEW -s [your home ip]/32 -j ACCEPT

為了限制除使用您家庭地址的使用者之外的任何人的訪問權限,可能會限制不需要的訪問權限。警告ISP 可能會在沒有事先通知的情況下更改您的 IP 地址,從而使您無法訪問遠端伺服器。僅當您有固定 IP 地址或可以從 cpanel 或控制台(例如 AWS)執行此操作時才考慮使用它。

  • 更改預設 SSH 埠

另一個建議是將預設 SSH 埠更改為隨機埠,許多中國伺服器試圖暴力破解預設埠。確保嘗試的速率限制也到位是一個好主意。

  • 禁止 ping

主機不需要響應 ping,您不需要允許 ICMP 回顯。

  • 將 VPN 添加到 SSH

為自己設置一個 VPN 可能會很好。可以通過以下方式使 SSH 規則更嚴格:

sudo iptables -A INPUT -p tcp -s $vpn_connection --dport 80 -j ACCEPT # allow all tcp connections by $vpn_connection to port 80
  • 添加規則以保護您免受自己的侵害

這只是保護主機免受自己傷害的一般規則。這條規則基本上說您添加的任何新規則都不會切斷現有連接(即,如果您不小心添加了一條切斷您自己的活動 SSH 連接的規則):

sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # prevent added rules from severing existing connections

謝謝:

感謝他們的回答,感謝 5chdn 在 Reddit 上公開這個問題。

網路安全不是我的專長,但我想我會就我認為顯而易見的事情提供一些回饋。

  • 為自己設置一個 VPN 可能會很好。一般來說,最好只是盲目地拒絕來自不受信任來源的任何流量。如果他們無法連接到您的伺服器,則測試漏洞會更加困難。配置完成後,您可以通過以下方式使您的 SSH 規則更嚴格:

sudo iptables -A INPUT -p tcp -s $ vpn_connection –dport 80 -j ACCEPT # allow all tcp connections by $ vpn_connection 到埠 80

  • 這只是保護您免受自己傷害的一般規則,您可以選擇添加或不添加它。這條規則基本上說您添加的任何新規則都不會切斷現有連接(即,如果您不小心添加了一條切斷您自己的活動 SSH 連接的規則):

sudo iptables -A INPUT -m conntrack –ctstate RELATED,ESTABLISHED -j ACCEPT # 防止添加的規則切斷現有連接

就一般說明而言,我喜歡您通過對所有剩餘請求的 drop 命令結束您的規則集。除此之外,我不能再強調設置 VPN 以限制 SSH 和其他安全連接的重要性。祝你好運,希望其他人可以批評我忘記的任何事情(我會很感激)。

引用自:https://ethereum.stackexchange.com/questions/8710