Apache-2.2

強制 Apache2 Web 伺服器偵聽單個外部 IP

  • December 31, 2016

我正在嘗試強制 Apache2 Web 伺服器偵聽屬於 HAProxy ( 192.168.50.30) 的單個外部 IP,因此使用者必須通過 HAProxy 才能使用 Apache2 Web 伺服器。目前(不幸的是)使用者可以通過http://192.168.50.10and訪問 Apache2 Web 伺服器http://192.168.50.30(只有這個應該被允許)。

  • HAProxy IP:192.168.50.30
  • 阿帕奇2 IP:192.168.50.10

大多數文章說更改Listen *:80Listen IP-ADDRESS:80in/etc/apache2/ports.conf可以解決問題,但是當我嘗試重新啟動 apache2 時出現以下錯誤。

(99)Cannot assign requested address: AH00072: make_sock: could not bind to address 192.168.50.30:80
no listening sockets available, shutting down

我的目前設置

/etc/apache2/ports.conf

Listen 192.168.50.30:80

<IfModule ssl_module>
       Listen 443
</IfModule>

<IfModule mod_gnutls.c>
       Listen 443
</IfModule>

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
       DocumentRoot /var/www/html
</VirtualHost>

/etc/apache2/apache2.conf

<Directory />
       Options FollowSymLinks
       AllowOverride None
       Require all denied
</Directory>

<Directory /usr/share>
       AllowOverride None
       Require all granted
</Directory>

<Directory /var/www/>
       Options Indexes FollowSymLinks
       AllowOverride None
       Require all granted
</Directory>

/etc/hosts

127.0.0.1       webserver1      webserver1
127.0.0.1 localhost
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

$ ifconfig -a

eth0      Link encap:Ethernet  HWaddr 08:00:27:b5:33:dd  
         inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
         inet6 addr: fe80::a00:27ff:feb5:33dd/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:63695 errors:0 dropped:0 overruns:0 frame:0
         TX packets:13588 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000 
         RX bytes:75453727 (75.4 MB)  TX bytes:983784 (983.7 KB)

eth1      Link encap:Ethernet  HWaddr 08:00:27:9a:05:45  
         inet addr:192.168.50.10  Bcast:192.168.50.255  Mask:255.255.255.0
         inet6 addr: fe80::a00:27ff:fe9a:545/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:8721 errors:0 dropped:0 overruns:0 frame:0
         TX packets:8392 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000 
         RX bytes:656568 (656.5 KB)  TX bytes:872702 (872.7 KB)

lo        Link encap:Local Loopback  
         inet addr:127.0.0.1  Mask:255.0.0.0
         inet6 addr: ::1/128 Scope:Host
         UP LOOPBACK RUNNING  MTU:65536  Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0 
         RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

我會為此使用訪問控制。首先確保您的 Listen 語句都只列出 1 個 IP 地址(但這可能並不重要)。然後配置訪問控制,只允許來自 HA Proxy 地址的訪問

Order deny,allow
Deny from all
Allow from 192.168.50.30

或類似的東西只允許從 haproxy 地址訪問。

您只能綁定到出現在 ifconfig 中的 IP(即本地 IP)。聽起來您想限制 Apache 僅在 HAProxy 連接到它時才響應。

您可以在 Apache 主機上使用 IPTables 執行此操作:

iptables -A INPUT -s 192.168.1.30 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j REJECT

這表示允許從 192.168.1.30 連接到埠 80,並拒絕所有其他連接。

事先執行“iptables -L”以查看是否有任何其他規則,這可能會改變您添加這些規則的細節。

另一種選擇是使用 Apache 訪問控制來做同樣的事情:https ://httpd.apache.org/docs/2.4/howto/access.html#host

<RequireAll>
   Require all granted
   Require ip 192.168.1.30
</RequireAll>

引用自:https://serverfault.com/questions/823483