אני בונה שרת vpn שיהיה מסונן ברמת החבילות.
שאני מדבר מסונן זה לא סינון כמו iptabels זה שינוי תוכן של חבילות, יצירת חבילות חדשות, וזריקה של חבילות.
התקנתי שרת pptp על המחשב. ואני מתחבר ממכונה וירטואלית virtualbox לשרת pptp.
כל חיבור לשרת יוצר interface חדש בשם ppp+ .
זה אומר שיש לי חיבור לנתב/לאינטרנט דרך eth0 ויש לי ppp0.
עכשיו כדי להעביר את מה שיוצא מppp0 ל eth0 ולהיפך עשיתי ככה.
קוד: |
net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -p tcp --syn -s 192.168.0.0/24 -j TCPMSS --set-mss 1356
|
עכשיו בשביל לסנן את החבילות. אני צריך שכל מה שעובר ב FORWARD בין eth0 ל ppp0 אני לוקח ושזה לא יעבור הלאה.
אז עשיתי חוק כזה.
קוד: |
sudo iptables -A FORWARD -i ppp+ -o eth0 -j NFQUEUE --queue-num 0
sudo iptables -A FORWARD -i eth0 -o ppp+ -j NFQUEUE --queue-num 0
|
ואני תופס את החבילות ע"י סוקט של NFQ. בתוכנה שכתובה ב C.
כדוגמת זה
https://github.com/prasannabe2004/pcapture/blob/d8f45d8bfbc780ea3b62c28afabb6d9a6247f22e/internet_nfq1.c
עכשיו החבילות לא עוברות הלאה הם רק נקלטות ע"י התוכנה שלי.
עכשיו אם אני רוצה להעביר אותם הלאה. מהתוכנה זה הקושי הגדול שלי.
ניסתי להשתמש בסוקט raw.
ככה.
קוד: |
int outfd = socket( AF_INET , SOCK_RAW , IPPROTO_RAW );
struct iphdr *in_iphdr = (struct iphdr *)(buf);
struct sockaddr_in daddr;
daddr.sin_family = AF_INET;
daddr.sin_port = 0 ;
daddr.sin_addr.s_addr = in_iphdr->daddr;
rc = sendto( outfd,buf,rc,MSG_DONTWAIT, (struct sockaddr *)&daddr ,(socklen_t)sizeof(daddr));
|
הבעיה בזה הייתה שחבילות tcp וudp הוא משנה את הפורט מקור ל1. שמתי לב שזה דווקא. באותו זמן שעובר החבילה מה eth0 ל ppp0 . אם אני שומר את התוכן של החבילה. ושולח אותה כעבור זמן. זה נשלח בשלמות בלי שינוי.
אז ניסתי להתנהג כמו ppp0 אמרתי שהרי כל מה שיוצא מppp0 מופנה ואוטומטי למקום הנכון. אז אני יעשה התקן וירטואלי של tap. ואני יוציא משם מה שאני רוצה.
עשיתי התקן וירטואלי ככה.
קוד: |
int nffd = open("/dev/net/tun", O_RDWR);
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TAP | IFF_NO_PI ;
strncpy(ifr.ifr_name, "tap0", sizeof(ifr.ifr_name) - 1);
ioctl(nffd, TUNSETIFF, (void *) &ifr) < 0
|
ונוצר התקן חדש במערכת אני עושה לו up והוא שולח חבילות ואני יכול לראות את זה ב wireshark אבל אין FORWARD בכלל.
כלומר יוצאת חבילה tcp עם כתובת יעד חיצונית וכתובת מקור 192.168.0.100 וזה לא מנותב לשום מקום.
מה אפשר לעשות כדי לסנן ואם למישהו יש אולי רעיון לסנן בלי NFQ אלא לעשות ניתוב רק של ppp0 ל tap0 ו tap0 ל ppp0.
הבנתי שהגדרות ניתוב הם כלליות לפי ip ואין אפשרות לנתב if ספציפי ל if ספציפי.
אשמח לכל עזרה.
תודה מראש.