Използване на VpnService за блокиране на някои IP адреси (KitKat срещу 4.3 и по-стари)

Добро утро хора,

Опитах се да модифицирам проба на VPN (ToyVPN), за да работи като обикновена защитна стена, за да блокира част от изходящия трафик. Реших да го направя по следния начин:

  • Създайте VPN връзка само за някои IP адреси
  • Не правете нищо в кода за обработка на VPN :)

Което изглежда по-лесно от оценката на пакетите и действието според тяхното съдържание.

Това изглежда работи добре за Android 4.3, но на 4.4 получавам грешка:

...
09-03 06:02:11.340    1806-1897/com.example.android.toyvpn E/ToyVpnService﹕ Got java.lang.IllegalStateException: command '43 interface fwmark rule add tun0' failed with '400 43 Failed to add fwmark rule (No such device)'command '43 interface fwmark rule add tun0' failed with '400 43 Failed to add fwmark rule (No such device)'
...

Ето моя код на VpnService Builder:

    Builder builder = new Builder();
    builder.setMtu(30000);
    builder.addAddress("10.0.0.1",24);
    builder.addRoute("212.77.100.101",32); // this is a sample IP I use for tests 

    mInterface = builder.setSession(mServerAddress)
            .setConfigureIntent(mConfigureIntent)
            .establish();

Стартирайте кода, който имам, не прави нищо:

while (true){
            Thread.sleep(1000);
            Log.e(TAG,"Running");
           }

В резултат получавам това, което искам - трафикът към моя ръчно въведен IP се насочва към /dev/null тип интерфейс :)

Вярвам, че проблемът ми с KitKat е свързан с някои грешки/проблеми в Android 4.4 (напр. https://code.google.com/p/android/issues/detail?id=63349, но има повече свързани с VPN).

Но знам, че това, което се опитвам да постигна, е изпълнимо - https://play.google.com/store/apps/details?id=com.netspark.firewall е доказателство, че работи добре на моя телефон 4.4. И се прави чрез VpnService, тъй като при използване на това приложение се появява същият изскачащ VPN прозорец.

Бихте ли ми помогнали да разбера какво правя погрешно и как да накарам VpnService да работи на 4.4 ... всъщност не да правя VPN, а по-скоро просто защитна стена.

Всичко това се отнася за нерутирани устройства.

PS. Има ли някакво ограничение за броя IP (IP подмрежи), които мога да добавя към VpnService по този начин?


person Piotr    schedule 03.09.2014    source източник
comment
Интересен факт - кодът работи на 4.4 устройство, не успява на 4.4 емулатор. Въпреки това работи на емулатор 4.3 ??   -  person Piotr    schedule 04.09.2014
comment
След различни тестове разбрах, че VPN услугата работи значително по-различно на емулатор 4.3 срещу 4.4 ... но не толкова голяма разлика на реално устройство. Вярвам, че това беше източникът на всички проблеми, които имах.   -  person Piotr    schedule 15.09.2014


Отговори (1)


Трябва да направя този проблем, първо трябва да разберете, че android VpnService ви дава ParcelFileDescriptor, в това можете да получите ip пакет, той може да бъде прехвърлен към Linux iphdr * указател, така че получавате пакета srcIP и dstIP dstPort, можете да изберете drop или traffic този пакет. ако имате друг проблем, можете да създадете tcp или udp пакет от ip пакет, на това ниво можете да получите ip адрес на хост и уебсайт.

person Dartan Li    schedule 21.01.2015