Ssh

iptables 配置 - 僅來自遠端網路的 ssh 連接

  • June 18, 2020

我正在嘗試配置伺服器的 Iptables,以便僅允許來自某個網路的 SSH 傳入連接。

順便說一句,這是規則鏈:

# Drop anything we aren't explicitly allowing. All outbound traffic is okay
*filter
:INPUT DROP [0:0]
:FORWARD DROP [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 icmp --icmp-type echo-reply -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
# Accept Pings
-A RH-Firewall-1-INPUT -p icmp --icmp-type echo-request -j ACCEPT
# Log anything on eth0 claiming it's from a local or non-routable network
# If you're using one of these local networks, remove it from the list below
-A INPUT -i eth0 -s 10.0.0.0/8 -j LOG --log-prefix "IP DROP SPOOF A: "
-A INPUT -i eth0 -s 172.16.0.0/12 -j LOG --log-prefix "IP DROP SPOOF B: "
-A INPUT -i eth0 -s 192.168.0.0/16 -j LOG --log-prefix "IP DROP SPOOF C: "
-A INPUT -i eth0 -s 224.0.0.0/4 -j LOG --log-prefix "IP DROP MULTICAST D: "
-A INPUT -i eth0 -s 240.0.0.0/5 -j LOG --log-prefix "IP DROP SPOOF E: "
-A INPUT -i eth0 -d 127.0.0.0/8 -j LOG --log-prefix "IP DROP LOOPBACK: "
# Accept any established connections
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accept ssh traffic. Restrict this to known ips if possible.
-A INPUT -p tcp -s 88.253.5.38 --dport 22 -j ACCEPT
# Opening port 80 and port 443 in order to allow http and https requests
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
#Log and drop everything else
-A RH-Firewall-1-INPUT -j LOG
-A RH-Firewall-1-INPUT -j DROP
COMMIT

使用以下命令保存這些規則似乎可以正確應用它們:

/etc/init.d/iptables restart && service iptables save

# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination         
25332   17M RH-Firewall-1-INPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
   0     0 LOG        all  --  eth0   *       10.0.0.0/8           0.0.0.0/0           LOG flags 0 level 4 prefix `IP DROP SPOOF A: ' 
   0     0 LOG        all  --  eth0   *       172.16.0.0/12        0.0.0.0/0           LOG flags 0 level 4 prefix `IP DROP SPOOF B: ' 
   0     0 LOG        all  --  eth0   *       192.168.0.0/16       0.0.0.0/0           LOG flags 0 level 4 prefix `IP DROP SPOOF C: ' 
   0     0 LOG        all  --  eth0   *       224.0.0.0/4          0.0.0.0/0           LOG flags 0 level 4 prefix `IP DROP MULTICAST D: ' 
   0     0 LOG        all  --  eth0   *       240.0.0.0/5          0.0.0.0/0           LOG flags 0 level 4 prefix `IP DROP SPOOF E: ' 
   0     0 LOG        all  --  eth0   *       0.0.0.0/0            127.0.0.0/8         LOG flags 0 level 4 prefix `IP DROP LOOPBACK: ' 
   0     0 ACCEPT     tcp  --  *      *       88.253.5.38          0.0.0.0/0           tcp dpt:22 

Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination         
   0     0 RH-Firewall-1-INPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 25163 packets, 17M bytes)
pkts bytes target     prot opt in     out     source               destination         

Chain RH-Firewall-1-INPUT (2 references)
pkts bytes target     prot opt in     out     source               destination         
24175   17M ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
   0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 0 
   0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 3 
   0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 11 
   0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 8 
1052  121K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
  94  6016 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:443 
   0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80 
  11   440 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           LOG flags 0 level 4 
  11   440 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0 

我遇到困難的關鍵部分是:

-A INPUT -p tcp -s 88.253.5.38 --dport 22 -j ACCEPT

我想要實現的是只允許從我所在的 LAN 進行連接,為此我已經從這裡檢查了我的路由器的外部 ip(它是靜態 ip),它返回讓我們說88.253.5.38

我的主要疑問是,我是否通過使用路由器的外部 IP 做正確的事情?或者我應該使用我機器的內部 ip,還是內部 ip 地址的範圍?

或者也許整個鏈條都有一些衝突,不允許我嘗試做的配置?

感謝您的任何推動,我真的卡住了

我是否通過使用路由器的外部 IP 做正確的事情?或者我應該使用我機器的內部 ip,還是內部 ip 地址的範圍?

TL;DR:如果您的伺服器與您自己的機器“通過 Internet”連接,則您在iptables規則中使用路由器的地址。

更長的答案:

防火牆規則從被防火牆保護的設備的角度工作。理想情況下,世界上的每台設備都有自己的 IP 地址。但他們沒有,我們有這個醜陋的黑客,叫做 NAT。在簡單的情況下,這是一個設備或軟體,它採用一系列 IP 地址(例如 192.168.1.)並將它們映射到單個 IP 地址。192.168. 地址保證不可路由,因此在真正的 Internet 上永遠找不到它們。每個人的網路都隱藏在 NAT 設備後面,因此每個網路都顯示為一個唯一的 IP 地址。因此,許多人可以在其內部網路上使用相同範圍的地址 192.168.*,因為其他人無法直接看到它們。

所以,回到問題。

如果您的伺服器在您的 NAT 網路“外部”,那麼它只會看到單個公共地址。這就是iptables規則中必須包含的內容。

另一方面,如果您的伺服器連接到您自己的網路,而它們之間沒有 NAT 設備,則必須使用實際的內部地址。

這是 IPv4 Internet 定址的醜陋現實的高度簡化版本,但它應該可以幫助您入門。


現在回答您的具體問題,這就是您的iptables規則無法按預期工作的原因。從鏈條開始,INPUT然後依次跟隨。第一行呼叫鏈RH-Firewall-1-INPUT。當您按照此操作進行操作時,您會看到一對ACCEPT在埠 80 和 443 上進行通信的規則。然後還有一個DROP適用於其他所有內容的規則。在該鏈的末端,我們返回INPUT並最終到達您ACCEPT的埠 22。但此時所有流量都已被丟棄,因此該規則無關緊要。

這裡的一個解決方案是將ACCEPT埠 22 的規則移動到RH-Firewall-1-INPUT鏈中,緊接在埠 80 和 443 的規則之後,但在 catch-all 之前DROP

我懷疑正確的解決方案是學習使用firewalld,但我不知道這是否在 CentOS 6.x 中可用,或者它是否僅在 CentOS 7 中首次出現。

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