Geth 乙太坊節點中用於 IPv4 和 IPv6 的良好 iptables 規則集
目前我正在為我的遠端(伺服器)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
謝謝:
- https://www.reddit.com/user/cryptihkal - https://ethereum.stackexchange.com/users/4735/cryptihkal
- https://www.reddit.com/user/CodyRo
- https://www.reddit.com/user/DaedalusInfinito
- https://www.reddit.com/user/m1ll3n1umf4lc0n
感謝他們的回答,感謝 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 和其他安全連接的重要性。祝你好運,希望其他人可以批評我忘記的任何事情(我會很感激)。