iptables 配置 - 僅來自遠端網路的 ssh 連接
我正在嘗試配置伺服器的 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 中首次出現。