Модуль Stateless NAT для IPTables
От: xneo Украина  
Дата: 08.04.12 17:45
Оценка:
Здраствуйте.
Пробую писать свой модуль для IPTables (Debian). Суть модуля простая: локальная машина с IP 10.11.0.77. Когда пакет с локальной машины проходит через шлюз на Debian во вне то IP источника подменяется на 91.92.93.94(пример), а когда пакет приходит извне для 91.92.93.94 то адрес назначения подменяется на 10.11.0.77. В общем обычный NAT но без отслеживания соединений.
Конфиг выглядит примерно так:

iptables -t mangle -A POSTROUTING -j STLNAT --src-ip 10.11.0.77 --to-ip 91.92.93.94
iptables -t mangle -A PREROUTING -j STLNAT --dst-ip 91.92.93.94 --to-ip 10.11.0.77


Код самой функции обработки пакетов которая должна подменять адреса:


static unsigned int ipt_stlnat_target(struct sk_buff *skb, const struct xt_action_param *par) {

    struct stlnat_target_info *tinfo;
    struct iphdr *iph;
    int cnt, c;
    unsigned int *pip = NULL, *tip, ip, newip;

    if (!skb_make_writable(skb, sizeof(struct iphdr)))
        return XT_CONTINUE;
    
    iph = ip_hdr(skb);
    
    tinfo = par->targinfo;
    cnt = tinfo->len;
    if (cnt > 0) cnt = cnt - 1;

    if (tinfo->srcip > 0) {
        pip = &iph->saddr;
        tip = &tinfo->srcip;
    }
    if (tinfo->dstip > 0) {
        pip = &iph->daddr;
        tip = &tinfo->dstip;        
    }
    
    if (pip) {
        ip = htonl(*pip);
        if ((ip >= *tip) && (ip <= *tip + cnt)) {
            c = ip - *tip;
            newip = htonl(tinfo->toip + c);
            csum_replace4(&iph->check, *pip, newip);
            *pip = newip;
            return NF_ACCEPT;
        }
    }
    return XT_CONTINUE;
}


Возникли следующие сложности:
— почему-то не хочет вообще подменять адрес при установке правила в таблицу nat, а хотелось бы. В таблице mangle подменяет нормально;
— внешние адреса из локальной машины пингуются нормально, а вот TCP соединения не работают. Что я мог упустить?

Помогите плиз разобраться
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.