端口转发从 domain1.com:25565 到 40000 以及从 domain2.com:25565 到 30000

端口转发从 domain1.com:25565 到 40000 以及从 domain2.com:25565 到 30000

我有一个在端口 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.somod_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外部网络的端口3000040000因为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

来源

相关内容