Вопрос:


У меня шлюз в интернет на Linux. Citrix стоит в локальной сети на приватном адресе. Какие правила надо приписать в iptables, чтобы из интернета можно было получить доступ к внутреннему терминальному серверу?

Ответ:

Допустим, внешний интерфейс (eth0) имеет адрес 221.23.124.181, а Windows 2000 + Terminal Services + Citrix MetaFrame сидят в локальной сети на адресе 192.168.0.1. Тогда в правила iptables добавляем строчку:

  iptables -t nat -A PREROUTING -s 221.23.124.181 -i eth0 -p tcp --dport 3389 -j DNAT --to 192.168.0.1:3389
  iptables -t nat -A PREROUTING -s 221.23.124.181 -i eth0 -p tcp --dport 1494 -j DNAT --to 192.168.0.1:1494
  iptables -t nat -A PREROUTING -s 221.23.124.181 -i eth0 -p udp --dport 1604 -j DNAT --to 192.168.0.1:1604
  iptables -A FORWARD -i eth0 -o eth1 -p tcp -d 192.168.0.1 --dport 1494 -j ACCEPT
  

Здесь 3389 используется Microsoft RDP, а 1604 и 1494 - Citrix ICA. (См. FAQ10)

Если у вас более старая версия Linux (ядро 2.2 и ниже) и используется ipchains, то можно пойти двумя способами:

  1. Использовать редиректоры портов, например, rinetd.
    В случае с rinetd создайте файл /etc/rinetd.conf и пропишите туда:
        221.23.124.181 3389 192.168.0.1 3389
        
  2. Установить вместо inetd более продвинутый xinetd (используется в свежих версиях Linux).
    В этом случае допишите в /etc/xinetd.conf:
        service ica
        {
            disable = no
            port = 1494
            bind = 221.23.124.181
            socket_type = stream
            protocol = tcp
            user = root
            redirect = 192.168.0.1 1494
            type = UNLISTED
            wait = no
        }
    

    Аналогично можно прописать редирект порта 3389 для RDP (Terminal Services).

В случае с xinetd альтернативный адрес командой altaddr выдавать нет необходимости. На клиенте вы должны явно указать IP внешнего интерфейса (в нашем случае 221.23.124.181), и не использовать "Auto-Locate".

См. также:


В начало