我有一个在端口 30.000 和端口 40.000 上运行的服务器,如果有人访问 domain1.com:25565,他应该连接到本地端口 40.000,如果他通过 domain2.com:25565 连接,他应该连接到本地端口 30.000
domain1.com:25565 -> 37.120.174.183:25565 -> 本地主机:40000
domain2.com:25565 -> 37.120.174.183:25565 -> 本地主机:30000
答案1
通常,尝试发起连接的传入数据包不会包含目标域名,而只包含目标 IP 地址。因此,没有足够的信息来创建任何 iptables 规则来重定向数据包。您无法执行尝试执行的操作。
现在,您可能已经意识到,Web 服务器通常可以处理许多不同的域,所有域都解析为一个 IP 地址。这是通过 Web 服务器配置完成的,而不是在网络数据包级别完成的。最终,一旦建立了网络连接,就会包含目标域名,Web 服务器可以决定用户尝试访问的实际页面并做出相应的响应。
答案2
虽然不是iptables
解决方案,但确实有效:)
解决方案是使用apache
模块mod_proxy.so
和mod_proxy_http.so
在 Apache Web 服务器中安装 mod_proxy 并设置反向代理
安装模块
sudo apt-get install libapache2-mod-proxy-html
安装依赖项 libxml2-dev
apt-get install libxml2-dev
加载模块
a2enmod proxy proxy_http
在 apache 配置文件中创建虚拟主机。
sudo nano /etc/apache2/sites-enabled/000-default
Listen 40000
Listen 30000
<VirtualHost *:25565>
ServerName domain1.com
ServerAlias www.domain1.com
DocumentRoot /var/www/vhosts/domain1.com
<Directory /var/www/vhosts/domain1.com>
Options -Indexes FollowSymLinks -MultiViews
AllowOverride All
Order deny,allow
Allow from all
</Directory>
CustomLog /var/log/httpd/domain1.com-access.log combined
ErrorLog /var/log/httpd/domain1.com-error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
ProxyPass / http://domain1.com:40000/
ProxyPassReverse / http://domain1.com:40000/
</VirtualHost>
<VirtualHost *:40000>
ServerName domain1.com
ServerAlias www.domain1.com
#### This is where you put your files for that domain: /var/www/vhosts/domain1.com
DocumentRoot /var/www/vhosts/domain1.com
</VirtualHost>
<VirtualHost *:25565>
ServerName domain2.com
ServerAlias www.domain2.com
DocumentRoot /var/www/vhosts/domain1.com
<Directory /var/www/vhosts/domain2.com>
Options -Indexes FollowSymLinks -MultiViews
AllowOverride All
Order deny,allow
Allow from all
</Directory>
CustomLog /var/log/httpd/domain2.com-access.log combined
ErrorLog /var/log/httpd/domain2.com-error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
ProxyPass / http://domain2.com:30000/
ProxyPassReverse / http://domain2.com:30000/
</VirtualHost>
<VirtualHost *:30000>
ServerName domain2.com
ServerAlias www.domain2.com
#### This is where you put your files for that domain: /var/www/vhosts/domain2.com
DocumentRoot /var/www/vhosts/domain2.com
</VirtualHost>
现在重新启动 apache
/etc/init.d/apache2 restart
只剩下拒绝访问iptables
外部网络的端口30000
,40000
因为apache
使用localhost
。
答案3
尽管mod-proxy
从 Apache 可以工作,但解决您的问题的最佳方法是使用反向代理,例如haproxy
。
haproxy
使用此命令安装:
sudo apt-get install haproxy
然后像这样编辑配置文件:
sudo nano /etc/haproxy.cfg
把这些行放入配置文件中
//Put this in the file
global
daemon
maxconn 4096
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
bind *:25565
acl is_site1 hdr_end(host) -i domain1.com
acl is_site2 hdr_end(host) -i domain2.com
use_backend site1 if is_site1
use_backend site2 if is_site2
backend site1
balance roundrobin
option httpclose
option forwardfor
server s2 127.0.0.1:40000 maxconn 32
backend site2
balance roundrobin
option httpclose
option forwardfor
server s1 127.0.0.1:30000 maxconn 32
listen admin
bind 127.0.0.1:8080
stats enable
使用以下命令启动/重新启动服务器:
sudo /usr/sbin/haproxy -f /etc/haproxy.cfg -D -p /var/run/haproxy.pid