File: IPCHAINS-HOWTO

package info (click to toggle)
doc-linux-it 2000.01-1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 8,136 kB
  • ctags: 19
  • sloc: perl: 249; makefile: 50; sh: 42
file content (3564 lines) | stat: -rw-r--r-- 119,569 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
  Linux IPCHAINS HOWTO
  Paul Russell, ipchains@rustcorp.com
  v1.0.7, 12 marzo 1999

  Questo documento intende descrivere come ottenere, installare e con
  figurare il software di ``enhanced IP firewalling chains'' per Linux,
  ed alcune idee su come si potrebbe usarlo.  Traduzione a cura di Gio
  vanni Bortolozzo borto at pluto.linux.it.

  1.  Introduzione

  Questo  il Linux IPCHAINS-HOWTO; si veda la Sezione ``Dove?'' per
  ottenere l'indirizzo del sito principale, che contiene l'ultima
  versione.  Si dovrebbe leggere anche il Linux NET-3-HOWTO. L'IP-
  Masquerading HOWTO, il PPP-HOWTO, l'Ethernet-HOWTO ed il Firewall
  HOWTO possono essere altre letture interessanti (come d'altronde lo
  possono essere le FAQ di alt.fan.bigfoot).


  Se interessa il filtraggio dei pacchetti (packet filtering), si legga
  la Sezione ``Perch?'', la Sezione ``Come?'' e si dia un'occhiata ai
  titoli nella sezione ``IP Firewalling Chains''.


  Se si sta operando la conversione da ipfwadm, si legga la Sezione
  ``Introduzione'', la sezione ``Come?'' e le appendici nella sezione
  ``Differenze tra ipchains e ipfwadm'' e nella sezione ``L'uso dello
  script `ipfwadm-wrapper'''.


  1.1.  Cos'?

  Il Linux ipchains  una riscrittura del codice di firewalling IPv4 di
  Linux (il quale era stato rubato principalmente da BSD) e una
  riscrittura di ipfwadm, che a sua volta era, almeno penso, una
  riscrittura di ipfw di BSD.   richiesto per amministrare il
  filtraggio dei pacchetti IP nelle versioni del kernel di Linux 2.1.102
  e superiori.


  1.2.  Perch?

  Il vecchio codice di firewalling di Linux non gestisce i frammenti
  (fragment), ha contatori a 32 bit (almeno su Intel), non permette di
  specificare protocolli diversi da TCP, UDP e ICMP, non pu rendere
  atomiche grosse modifiche, non pu specificare regole inverse, ha
  qualche scemata e pu risultare difficile da manipolare (rendendolo
  propenso a errori utente).


  1.3.  Come?

  Attualmente il codice fa parte del kernel a partire dalla versione
  2.1.102.  Per la serie dei kernel 2.0,  necessario scaricare una
  patch dalla pagina web.  Se il proprio kernel 2.0  pi recente della
  patch disponibile, una patch pi vecchia dovrebbe andare bene lo
  stesso; questa parte del kernel 2.0  piuttosto stabile (eg. la patch
  per il kernel 2.0.34 funziona bene sul kernel 2.0.35).  Poich la
  patch per il 2.0  incompatibile con le patch ipportfw e ipautofw, non
  raccomando di applicarla a meno che non si abbia veramente bisogno di
  alcune delle funzionalit che offre ipchains.





  1.4.  Dove?

  La pagina ufficiale  The Linux IP Firewall Chains Page
  <http://www.rustcorp.com/linux/ipchains>


  Esiste una mailing list per le segnalazioni di bug, discussione,
  sviluppo e uso.   possibile associarsi alla mailing list inviando un
  messaggio contente la parola ``subscribe'' a ipchains-request a
  rustcorp.com.  Per inviare mail alla lista si usi `ipchains' invece di
  `ipchains-request'.


  2.  Fondamenti di Packet Filtering

  2.1.  Cos'?

  Tutto il traffico attraverso una rete  inviato sotto forma di
  pacchetti.  Per esempio, lo scaricarsi questo documento (facciamo
  conto sia lungo 50k) fa s che si ricevano 36 o pi pacchetti da 1460
  byte ognuno (tanto per mettere un po' di numeri).


  L'inizio di ogni pacchetto specifica dove deve andare, da dove viene,
  il tipo del pacchetto ed altri dettagli amministrativi.  Questa parte
  iniziale del pacchetto  detta header (intestazione).  Il resto del
  pacchetto, contenente i dati reali da trasmettere, solitamente  detto
  body (corpo).


  Alcuni protocolli, come TCP, usato per il traffico web, mail e login
  remoti, usano il concetto di "connessione": prima di inviare un
  qualsiasi pacchetto con i dati reali, sono scambiati diversi pacchetti
  di impostazione (con intestazioni speciali) che dicono ``Voglio
  connettermi'', ``OK'' e ``Grazie''.  Poi sono scambiati i pacchetti
  normali.


  Un filtro di pacchetti (packet filter)  un pezzo di software che
  guarda l'intestazione dei pacchetti che passano e decide il destino
  dell'intero pacchetto.  Potrebbe decidere di proibire (deny) il
  pacchetto (ie. scartare il pacchetto come non fosse mai stato
  ricevuto), accettare (accept) il pacchetto (ie. lasciare che il
  pacchetto prosegua), o rifiutare (reject) il pacchetto (simile a
  proibire, ma comunica inoltre alla fonte del pacchetto quello che ha
  fatto).


  Sotto Linux, il filtraggio dei pacchetti  contenuto all'interno del
  kernel e ci sono alcune cosette divertenti che si possono fare con i
  pacchetti, ma il principio generale  sempre quello di guardare le
  intestazioni e di decidere la sorte dei pacchetti.


  2.2.  Perch?

  Controllo.  Sicurezza.  Vigilanza.



     Controllo:
        quando si usa una macchina Linux per connettere la propria rete
        interna ad un'altra rete (Internet, ad esempio) si ha
        l'opportunit di permette un certo tipo di traffico e di
        proibirne dell'altro.  Per esempio, l'intestazione di un
        pacchetto contiene l'indirizzo della destinazione del pacchetto,
        e quindi si pu impedire ai pacchetti di andare verso una certa
        parte della rete esterna.  Un altro esempio: uso Netscape per
        accedere agli archivi di Dilbert.  Nella pagina ci sono avvisi
        pubblicitari di doubleclick.net e Netscape spreca il mio tempo
        scaricandoli pedissequamente.  Dicendo al filtro dei pacchetti
        di non permettere alcun pacchetto da o per l'indirizzo posseduto
        da doubleclick.net si risolve quel problema (anche se penso ci
        siano modi migliori per risolverlo).


     Sicurezza:
        quando la propria macchina Linux  la sola cosa tra il caos di
        Internet e la propria bella ed ordinata rete,  bene sapere che
        si pu limitare quel che viene a bussare alla propria porta.
        Per esempio, si potrebbe permettere a qualsiasi cosa di uscire
        dalla propria rete, ma certamente non si  ben disposti verso i
        cosiddetti ``Ping della Morte'' provenienti da estranei
        maliziosi.  Un altro esempio: si pu voler evitare che gli
        estranei possano fare telnet nella macchina, anche se tutti gli
        account hanno una password; oppure si vuole (come molti
        d'altronde) essere un semplice osservatore in Internet e non un
        server (volente o nolente): semplicemente non si permetta a
        nessuno di connettersi, facendo s che il filtro dei pacchetti
        rifiuti tutti i pacchetti entranti usati per instaurare una
        connessione.


     Vigilanza:
        talvolta una macchina mal configurata in una rete locale decide
        di emettere pacchetti per il mondo esterno.   bene dire al
        filtro dei pacchetti di informarvi se succede qualcosa di
        anormale; forse si pu fare qualcosa per risolverlo o forse si 
        solo curiosi per natura.


  2.3.  Come?

  2.3.1.  Un kernel con il filtraggio dei pacchetti

   necessario un kernel che possieda al suo interno il nuovo supporto
  per le "IP firewall chains" (catene firewall IP).   possibile sapere
  se il kernel attualmente in esecuzione ce l'ha cercando il file
  `/proc/net/ip_fwchains'.  Se esiste, allora c'.


  Se cos non ,  necessario compilare un kernel che supporti le catene
  firewall IP.  Per prima cosa si scarichino i sorgenti del kernel che
  si vuole.  Se si possiede un kernel versione 2.1.102 o superiore non
  si avr bisogno di una patch ( gi presente nel kernel).  Altrimenti
  si applichi la patch scaricabile dalla pagina web suddetta e si
  effettui la configurazione come spiegato dettagliatamente nel seguito.
  Se non si sa come farlo, niente panico: si legga il Kernel-HOWTO.



  Le opzioni di configurazione che sar necessario impostare per i
  kernel della serie 2.0 sono:


  ______________________________________________________________________
          CONFIG_EXPERIMENTAL=y
          CONFIG_FIREWALL=y
          CONFIG_IP_FIREWALL=y
          CONFIG_IP_FIREWALL_CHAINS=y
  ______________________________________________________________________

  Per i kernel delle serie 2.1 o 2.2:

  ______________________________________________________________________
          CONFIG_FIREWALL=y
          CONFIG_IP_FIREWALL=y
  ______________________________________________________________________




  Lo strumento ipchains dialoga con il kernel e lo istruisce su quali
  pacchetti filtrare.  A meno che non si sia dei programmatori, o
  particolarmente curiosi, questo  il solo modo con cui si controller
  il filtraggio dei pacchetti.


  2.3.2.  ipchains

  Il programma ipchains inserisce e cancella regole dalla sezione di
  filtraggio dei pacchetti del kernel.  Ci significa che qualsiasi cosa
  si imposti, sar persa al riavvio; si veda la sezione ``Rendere
  permanenti le regole'' per un metodo per assicurarsi che siano
  ripristinate all'avvio successivo di Linux.


  ipchains rimpiazza ipfwadm, usato per il vecchio codice di Firewall
  IP. Nel sito ftp di ipchains  disponibile una serie di script molto
  utili:

  ftp://ftp.rustcorp.com/ipchains/ipchains-scripts-1.1.2.tar.gz
  <ftp://ftp.rustcorp.com/ipchains/ipchains-scripts-1.1.2.tar.gz>


  Questo pacchetto contiene uno script shell chiamato ipfwadm-wrapper
  che permette di effettuare il filtraggio dei pacchetti come lo si
  faceva prima.  Probabilmente non si dovrebbe usare questo script a
  meno che non si voglia un metodo veloce per aggiornare un sistema che
  usa ipfwadm ( pi lento, non controlla gli argomenti, ecc.).  In tal
  caso, non  necessario proseguire la lettura di questo HOWTO.

  Si veda l'appendice ``Differeze tra ipchains e ipfwadm''  e
  l'appendice ``Usare lo script `ipfwadm-wrapper''' per maggiori
  dettagli.


  2.3.3.  Rendere permanenti le regole

  La configurazione corrente del firewall  immagazzinata nel kernel e
  quindi sar persa al riavvio.  Raccomando di usare gli script
  `ipchains-save' e `ipchains-restore' per rendere permanenti le regole.
  Per far ci, si impostino le proprie regole, poi (come root) si lanci:



       # ipchains-save > /etc/ipchains.rules
       #




  Si crei uno script come il seguente:





  #! /bin/sh
  # Script per controllare il filtraggio dei pacchetti

  # Se non ci sono regole, non fa niente.
  [ -f /etc/ipchains.rules ] || exit 0

  case "$1" in
      start)
          echo -n "Attivazione del filtraggio dei pacchetti:"
          /sbin/ipchains-restore < /etc/ipchains.rules || exit 1
          echo 1 > /proc/sys/net/ipv4/ip_forward
          echo "."
          ;;
      stop)
          echo -n "Disattivazione del filtraggio dei pacchetti:"
          echo 0 > /proc/sys/net/ipv4/ip_forward
          /sbin/ipchains -X
          /sbin/ipchains -F
          /sbin/ipchains -P input ACCEPT
          /sbin/ipchains -P output ACCEPT
          /sbin/ipchains -P forward ACCEPT
          echo "."
          ;;
      *)
          echo "Uso: /etc/init.d/packetfilter {start|stop}"
          exit 1
          ;;
  esac

  exit 0




  Ci si assicuri che sia eseguito abbastanza presto nella procedura di
  avvio.  Nel mio caso (Debian 2.1), ho creato un link simbolico
  chiamato `S39packetfilter' nella directory `/etc/rcS.d' (cos sar
  eseguito prima di S40network).


  3.  Sono confuso!  Instradamento, masquerading, portforwarding, ipaut
  ofw...

  Questo HOWTO  sul filtraggio dei pacchetti.  Ci significa decidere
  quando un pacchetto debba avere o meno il permesso di passare.
  Comunque, essendo Linux il campo giochi degli hacker, si vorr
  probabilmente fare qualcosina di pi.


  Un problema  che lo stesso strumento (``ipchains'')  usato per
  controllare anche il masquerading e il proxy trasparente, sebbene
  queste siano nozionalmente diverse dal filtraggio dei pacchetti
  (l'implementazione corrente di Linux innaturalmente le fonde insieme,
  dando l'impressione che siano strettamente collegate).


  Il masquerading ed il proxy sono trattati da altri HOWTO, mentre le
  caratteristiche auto forwading e port forwarding sono controllate da
  altri strumenti, ma poich la gente continua a domandarmene, includer
  un insieme di scenari comuni ed indicher quando ognuno possa essere
  applicato.  I meriti di sicurezza di ciascuna configurazione non
  saranno qui discussi.




  3.1.  Le tre linee guida di Rusty al masquerading

  Si assume che la propria interfaccia esterna si chiami `ppp0'.  Si usi
  ifconfig per scoprire qual' e si aggiusti il tutto a proprio gusto.



       # ipchains -P forward DENY
       # ipchains -A forward -i ppp0 -j MASQ
       # echo 1 > /proc/sys/net/ipv4/ip_forward





  3.2.  Promozione gratuita: WatchGuard

  I firewall si possono anche comprare.  Uno eccellente  il FireBox
  della WatchGuard.   eccellente perch mi piace,  sicuro,  basato su
  Linux e anche perch quelli della WatchGuard sovvenzionano il
  mantenimento di ipchains e del nuovo codice di firewall (atteso per il
  2.3).  In breve, la WatchGuard mi sta pagando da mangiare mentre
  lavoro per voi.  Quindi vi invito a considerare i loro prodotti.

  http://www.watchguard.com <http://www.watchguard.com>


  3.3.  Configurazioni comuni di firewall

  Supponiamo che si amministri il dominio littlecorp.com.  Si ha una
  rete interna e una sola connessione in dialup (PPP) verso Internet
  (firewall.littlecorp.com che  1.2.3.4).  Si usa Ethernet nella
  propria rete locale e la propria macchina personale si chiama
  "myhost".


  Questa sezione illustrer diversi arrangiamenti comuni.  Li si legga
  attentamente, perch sono subdolamente diversi uno dall'altro.


  3.3.1.  Rete privata: proxy tradizionale

  In questo scenario, i pacchetti provenienti dalla rete privata non
  traverseranno mai Internet e viceversa.  Gli indirizzi IP della rete
  privata dovranno essere assegnati secondo le Private Network
  Allocations del RFC1597 (ie. 10.*.*.*, 172.16.*.* or 192.168.*.*).


  Il solo modo nel quale ci si potr mai connettere ad Internet  di
  connettersi al firewall, che  la sola macchina in entrambe le reti
  che pu uscire dalla rete locale.  Per far questo si pu eseguire un
  programma (nel firewall) detto proxy (ci sono proxy per FTP, accesso
  al web, telnet, RealAudio, Usenet News e altri servizi).  Si veda il
  Firewall HOWTO.


  Qualsiasi servizio che si vuole sia accessibile da Internet deve
  essere nel firewall (si veda anche ``Servizi interni limitati'' nel
  seguito).


  Esempio: Permettere l'accesso web dalla rete privata ad Internet

  1. Alla rete privata sono assegnati gli indirizzi 192.168.1.*, e in
     particolare a myhost  assegnato il 192.168.1.100 e all'interfaccia
     Ethernet del firewall il 192.168.1.1.
  2. Nel firewall  installato e configurato un proxy web (eg. "squid"),
     ed  in funzione sulla porta 8080.

  3. Il Netscape sulla rete privata  configurato per usare la porta
     8080 del firewall come proxy.

  4. Nel rete privata non serve sia configurato il DNS.

  5. Il DNS deve essere configurato sul firewall.

  6. Nella rete privata non dev'essere configurato nessun instradamento
     predefinito (gateway).


  Netscape su myhost legge http://slashdot.org.

  1. Netscape si connette alla porta 8080 del firewall usando la porta
     1050 su myhost.  Chiede la pagina web di "http://slashdot.org".

  2. Il proxy cerca il nome "slashdot.org" ed ottiene 207.218.152.131.
     Apre una connessione con quell'indirizzo IP (usando la porta 1025
     sull'interfaccia esterna del firewall) e chiede al server web
     (porta 80) la pagina web.

  3. Come il proxy riceve la pagina web dalla sua connessione con il
     server web, copia i dati nella connessione del Netscape.

  4. Netscape mostra la pagina.

  ie.  Dal punto di vista di slashdot.org, la connessione  fatta dalla
  porta 1025 di 1.2.3.4 (l'interfaccia PPP del firewall) verso la porta
  80 di 207.218.152.131 (slashdot.org).  Dal punto di vista di myhost, 
  fatta dalla porta 1050 di 192.168.1.100 (myhost) verso la porta 8080
  di 192.168.1.1 (l'interfaccia Ethernet del firewall).



  3.3.2.  Rete privata: proxy trasparente

  In questo scenario i pacchetti dalla rete privata non traversano mai
  Internet e viceversa.  Gli indirizzi IP della rete privata dovranno
  essere assegnati secondo le Private Network Allocations del RFC1597
  (ie. 10.*.*.*, 172.16.*.* or 192.168.*.*).


  Il solo modo nel quale ci si potr mai connettere ad Internet  di
  connettersi al firewall, che  la sola macchina in entrambe le reti
  che pu uscire dalla rete locale.  Per far questo si pu eseguire un
  programma (nel firewall) detto proxy trasparente; il kernel invia i
  pacchetti al proxy trasparente invece di farli uscire (ie.
  imbastardisce l'instradamento).


  Il proxy fatto in modo trasparente significa che ai client non serve
  sapere che c' un proxy coinvolto.


  Qualsiasi servizio che si vuole sia accessibile da Internet deve
  essere nel firewall (si veda anche ``Servizi interni limitati'' nel
  seguito).


  Esempio: Permettere l'accesso web dalla rete privata ad Internet

  1. Alla rete privata sono assegnati gli indirizzi 192.168.1.*, e in
     particolare a myhost  assegnato il 192.168.1.100 e all'interfaccia
     Ethernet del firewall il 192.168.1.1.

  2. Nell firewall  installato un proxy web trasparente (credo esistano
     delle patch per squid per permettergli di funzionare in questo
     modo, oppure si usi "transproxy") ed  in funzione sulla porta
     8080.

  3. Usando ipchains al kernel  detto di redirigere  al proxy le
     connessioni dirette alla porta 80.

  4. Netscape nella rete privata  configurato per connettersi
     direttamente.

  5. Nella rete privata dev'essere configurato il DNS (ie. si deve
     eseguire anche un server DNS oltre al proxy sul firewall).

  6. Nella rete privata dev'essere configurato l'instradamento
     predefinito (gateway), in modo da inviare i pacchetti al firewall.


  Netscape su myhost legge http://slashdot.org.

  1. Netscape cerca il nome "slashdot.org" ed ottiene 207.218.152.131.
     Allora apre una connessione verso quell'indirizzo IP usando la
     porta locale 1050 e chiede la pagina web al server web (porta 80).

  2. Come i pacchetti da myhost (porta 1050) verso slashdot.org (porta
     80) passano attraverso il firewall, sono rediretti al proxy
     trasparente in attesa sulla porta 8080.  Il proxy trasparente apre
     una connessione (usando la porta locale 1025) verso la porta 80 di
     207.218.152.131 (che  dove stavano andando i pacchetti originali).

  3. Come il proxy riceve la pagina web dalla sua connessione con il
     server web, copia i dati nella connessione del Netscape.

  4. Netscape mostra la pagina.

  ie.  Dal punto di vista di slashdot.org, la connessione  fatta dalla
  porta 1025 di 1.2.3.4 (l'interfaccia PPP del firewall) verso la porta
  80 di 207.218.152.131 (slashdot.org).  Dal punto di vista di myhost, 
  fatta dalla porta 1050 di 192.168.1.100 (myhost) verso la porta 80 di
  207.218.152.131, ma in realt sta dialogando con il proxy trasparente.


  3.3.3.  Rete privata: masquerading

  In questo scenario i pacchetti dalla rete privata non traversano mai
  Internet e viceversa.  Gli indirizzi IP della rete privata dovranno
  essere assegnati secondo le Private Network Allocations del RFC1597
  (ie. 10.*.*.*, 172.16.*.* or 192.168.*.*).


  Invece di usare un proxy, usiamo una speciale caratteristica del
  kernel detta "masquerading" (mascheramento, travestimento).  Il
  masquerading riscrive i pacchetti non appena passano per il firewall,
  cos sembra sempre che provengano dal firewall stesso.  Poi riscrive
  le risposte in modo che sembri provengano dalle fonti originali.


  Il masquerading ha moduli separati per gestire protocolli "banali",
  come FTP, RealAudio, Quake, ecc.  Per protocolli veramenente difficili
  da gestire, la funzione di "auto forwarding" (inoltro automatico) ne
  pu gestire alcuni automaticamente impostando il port forwarding per
  l'insieme delle porte a loro relative: si veda ``ipportfw'' (kernel
  2.0) o ``ipmasqadm'' (kernel 2.1).

  Qualsiasi servizio che si vuole sia accessibile da Internet deve
  essere nel firewall (si veda anche ``Servizi interni limitati'' nel
  seguito).


  Esempio: Permettere l'accesso web dalla rete privata ad Internet

  1. Alla rete privata sono assegnati gli indirizzi 192.168.1.*, e in
     particolare a myhost  assegnato il 192.168.1.100 e all'interfaccia
     Ethernet del firewall il 192.168.1.1.

  2. Il firewall  impostato per "mascherare" qualsiasi pacchetto
     proveniente dalla rete privata e destinato alla porta 80 di un host
     Internet.

  3. Netscape  configurato per connettersi direttamente.

  4. Nella rete privata dev'essere configurato correttamente il DNS.

  5. Il firewall dovr essere l'instradamento predefinito (gateway) per
     la rete privata.

  Netscape su myhost legge http://slashdot.org.

  1. Netscape cerca il nome "slashdot.org", ed ottiene 207.218.152.131.
     Allora apre una connessione verso quell'indirizzo IP usando la
     porta locale 1050 e chiede la pagina web al server web (porta 80).

  2. Come i pacchetti da myhost (porta 1050) verso slashdot.org (porta
     80) passano attraverso il firewall, sono riscritti per apparire
     provenienti dall'interfaccia PPP del firewall (porta 65000).   Il
     firewall ha un indirizzo Internet valido (1.2.3.4) e quindi i
     pacchetti di risposta provenienti da slashdot.org vengono
     correttamente instradati indietro.

  3. Come i pacchetti da slashdot.org (port 80) verso
     firewall.littlecorp.com (porta 65000) arrivano, sono riscritti per
     andare alla porta 1050 di myhost.  Questa  la vera magia del
     masquerading: si ricorda quando riscrive pacchetti uscenti e cos
     pu riscriverli non appena arrivano le risposte.

  4. Netscape mostra la pagina.

  ie.  Dal punto di vista di slashdot.org, la connessione avviene dalla
  porta 65000 di 1.2.3.4 (l'interfaccia PPP del firewall) verso la porta
  80 di 207.218.152.131 (slashdot.org).  Dal punto di vista di myhost,
  la connessione  fatta dalla porta 1050 di 192.168.1.100 (myhost),
  verso la porta 80 di 207.218.152.131 (slashdot.org).



  3.3.4.  Rete pubblica

  In questo scenario la propria rete personale  parte di Internet: i
  pacchetti possono fluire senza modifiche tra le due reti.  Gli
  indirizzi IP della rete interna devono essere assegnati richiedendo un
  blocco di indirizzi IP, in modo che il resto della rete sappia come
  raggiungerla.  Ci implica una connessione permanente.


  In tal caso, il filtraggio dei pacchetti  usato per decidere quali
  pacchetti possono essere inoltrati tra la propria rete ed il resto di
  Internet, eg. per restringere il resto di Internet al solo accesso ai
  propri server web interni.


  Esempio: Permettere l'accesso web dalla rete privata verso Internet.

  1. Alla propria rete interna  assegnato un blocco di indirizzi IP che
     si  richiesto (diciamo 1.2.3.*).

  2. Il firewall  impostato per permettere tutto il traffico.

  3. Netscape  configurato per connettersi direttamente.

  4. Nella propria rete dev'essere configurato il DNS.

  5. Il firewall dovr essere l'instradamento predefinito (gateway) per
     la rete privata.

  Netscape su myhost legge http://slashdot.org.

  1. Netscape cerca il nome "slashdot.org" e ottiene 207.218.152.131.
     Apre poi una connessione verso quel indirizzo IP usando la porta
     locale 1050 e chiede la pagina al server web (porta 80).

  2. I pacchetti passano attraverso il proprio firewall, proprio come
     passano attraverso diversi altri router tra myhost e slashdot.org.

  3. Netscape mostra la pagina.

  ie.  C' solo una connessione: dalla porta 1050 di 1.2.3.100 (myhost)
  verso la porta 80 di 207.218.152.131 (slashdot.org).


  3.3.5.  Servizi interni limitati

  Ci sono un po' di trucchi che si possono usare per permettere ad
  Internet di accedere ai propri servizi interni, piuttosto che far
  girare i servizi sul firewall.  Funzioneranno solo con un approccio
  basato su proxy o masquerading per le connessioni esterne.


  L'approccio pi semplice  di usare un "dirottatore" che non  altro
  che un proxy dei poveri, che attenende la connessione su una data
  porta e poi apre una connessione ad una porta fissa di un host interno
  copiando i dati tra le due connessioni.  Un esempio  il programma
  "redir".  Dal punto di vista di Internet, la connessione  fatta verso
  firewall.  Dal punto di vista del server interno la connessione 
  fatta dall'interfaccia interna del firewall al server.


  Un altro approccio (che richiede un kernel 2.0 con la patch per
  ipportfw, oppure un kernel 2.1 o pi recente)  di usare il port
  forwarding del kernel.  Quest'ultimo fa lo stesso lavoro di "redir" ma
  in modo diverso: il kernel riscrive i pacchetti mentre passano,
  cambiando il loro indirizzo di destinazione e la porta per
  indirizzarli verso l'host interno e la relativa porta.  Dal punto di
  vista di Internet, la connessione  fatta verso il firewall.  Dal
  punto di vista del server interno  fatta una connessione diretta tra
  l'host Internet ed il server.


  3.4.  Ulteriori informazioni sul masquerading

  David Ranch ha scritto un eccellente nuovo HOWTO sul masquerading, che
  ha parecchi argomenti in comune con questo HOWTO.  Attualmente lo si
  pu trovare a

  http://www.ecst.csuchico.edu/~dranch/LINUX/index-LINUX.html#ipmasq


  Presto mi aspetterei di trovarlo sotto gli patrocinio del Linux
  Documentation Project, a http://www.metalab.unc.edu/LDP
  <http://www.metalab.unc.edu/LDP>


  L'home page ufficiale del Masquerading  a

  http://ipmasq.cjb.net <http://ipmasq.cjb.net>



  4.  IP Firewall Chains

  Questa sezione descrive tutto quello che bisogna veramente sapere per
  costruire un filtro di pacchetti che incontri le proprie esigenze.


  4.1.  Come passano i pacchetti attraverso i filtri

  Il kernel parte con tre elenchi di regole; questi elenchi sono detti
  firewall chains (catene firewall) o semplicemente chains (catene).  Le
  tre catene predefinite sono chiamate rispettivamente input (ingresso),
  output (uscita) e forward (inoltro).  Quando arriva un pacchetto
  (diciamo, attraverso la scheda Ethernet) il kernel usa la catena input
  per decidere il suo destino.  Se sopravvive a quel passo, allora il
  kernel decide dove mandare sucessivamente il pacchetto (ci  detto
  routing (instradamento)).  Se  destinato ad un'altra macchina,
  consulta la catena forward.  Alla fine, appena prima che il pacchetto
  esca, il kernel consulta la catena output.


  Una catena  una lista di regole.  Ogni regola dice ``se
  l'intestazione del pacchetto  fatta cos, allora questo  quello che
  si deve fare con il pacchetto''.  Se il pacchetto non soddisfa
  (verifica) una regola, allora viene consultata la successiva regola
  nella catena.  Alla fine, se non ci sono altre regole da consultare,
  il kernel guarda la policy (tattica) della catena per decidere cosa
  fare.  In un sistema conscio delle problematiche di sicurezza, questa
  tattica dice al kernel se rifiutare o proibire il pacchetto.


  Per gli amanti dell'arte ASCII, questa figura mostra il percorso
  completo di un pacchetto entrante in una macchina.


          ----------------------------------------------------------------
          |            ACCEPT/                              lo interface |
          v           REDIRECT                  _______                  |
  --> C --> S --> ______ --> D --> ~~~~~~~~ -->|forward|----> _______ -->
      h     a    |input |    e    {Routing }   |Chain  |     |output |ACCEPT
      e     n    |Chain |    m    {Decision}   |_______| --->|Chain  |
      c     i    |______|    a     ~~~~~~~~        |     | ->|_______|
      k     t       |        s       |             |     | |     |
      s     y       |        q       |             v     | |     |
      u     |       v        e       v            DENY/  | |     v
      m     |     DENY/      r   Local Process   REJECT  | |   DENY/
      |     v    REJECT      a       |                   | |  REJECT
      |   DENY               d       --------------------- |
      v                      e -----------------------------
     DENY


  Di seguito una descrizione di ogni stadio:



     Checksum:
        Questo  il test per verificare che il pacchetto non sia in
        qualche modo corrotto.  Se lo ,  rifiutato.


     Sanity:
        In realt c' una verifica di integrit del pacchetto prima di
        ogni catena firewall, ma quello della catena input  il pi
        importante.  Alcuni pacchetti malformati possono confondere il
        codice per il controllo delle regole, e quindi sono qui
        rifiutati (se ci avviene  stampato un messaggio nel syslog).


     input chain:
         la prima catena firewall contro la quale viene testato il
        pacchetto.  Se il verdetto della catena non  DENY o REJECT, il
        pacchetto prosegue.


     Demasquerade:
        Se il pacchetto  una risposta (reply) ad un precedente
        pacchetto "mascherato",  "demascherato" e passa direttamente
        alla catena output.  Se non si usa L'IP Masquerading si cancelli
        questo percorso dal diagramma.


     Routing decision:
        Il codice di instradamento esamina il campo di destinazione per
        decidere se questo pacchetto deve andare ad un processo locale
        (si veda Local process qui sotto) o inoltrato ad una macchina
        remota (si veda forward chain pi avanti)


     Local process:
        Un processo in esecuzione sulla macchina pu ricevere pacchetti
        dopo il passo di Routing Decision, e pu inviare pacchetti (che
        passano per il passo Routing Decision, e poi attraversano la
        catena output).


     lo interface:
        Se i pacchetti provenienti da un processo locale sono destinati
        ad un processo locale, attraverseranno la catena output con il
        campo interfaccia impostato a `lo', e poi ritornano attraverso
        la catena input sempre con interfaccia impostato a `lo'.
        L'interfaccia lo  solitamente chiamata interfaccia loopback.


     local:
        Se il pacchetto non era stato creato da un processo locale,
        allora  esaminata la catena forward, altrimenti il pacchetto va
        verso la catena output.


     forward chain:
        Questa catena  attraversata da qualsiasi pacchetto che provi a
        passare attraverso questa macchina per andare verso un'altra.


     output chain:
        Questa catena  attraversata da qualsiasi pacchetto un attimo
        prima di essere spedito fuori.




  4.1.1.  Usare ipchains

  Per prima cosa si controlli di avere la versione di ipchains a cui fa
  riferimento questo documento:



       $ ipchains --version
       ipchains 1.3.9, 17-Mar-1999





  Si noti che io raccomando la 1.3.4 (che non ha le opzioni lunghe, come
  `--sport'), o la 1.3.8 o superiori; queste sono molto stabili.


  ipchains ha una pagina man piuttosto dettagliata (man ipchains), e se
  servono ulteriori dettagli o particolari, si pu dare un'occhiata
  all'interfaccia di programmazione (man 4 ipfw), oppure al file
  net/ipv4/ip_fw.c nei sorgenti dei kernel 2.1.x, che sono (ovviamente)
  le fonti pi autorevoli.


  Nel pacchetto sorgente c' pure una eccellente scheda di riferimento
  rapido di Scott Bronson, in PostScript(TM) sia in formato A4 che US
  Letter.


  Ci sono parecchie cose diverse che si possono fare con ipchains.  Per
  prima cosa le operazioni per gestire intere catene.  Si parte con tre
  catene predefinite input, output e forward che non possono essere
  cancellate.


  1. Creare una nuova catena (-N).

  2. Cancellare una catena vuota (-X).

  3. Cambiare la tattica per una catena predefinita (-P).

  4. Elencare le regole in una catena (-L).

  5. Svuotare una catena delle sue regole (-F).

  6. Azzerare i contatori di pacchetti e byte per tutte le regole in una
     catena (-Z).

  Ci sono diversi modi per manipolare le regole in una catena:


  1. Aggiungere una nuova regola ad una catena (-A).

  2. Inserire in una posizione specifica una nuova regola in una catena
     (-I).

  3. Rimpiazzare una regola in una qualche posizione in una catena (-R).

  4. Cancellare da una posizione specifica una regola da una catena
     (-D).

  5. Cancellare da una catena la prima regola corrispondente (-D).

  Ci sono alcune operazioni per il masquerading, che, in mancanza di un
  posto migliore dove metterle, sono in ipchains:
  1. Elenca le connessioni attualmente mascherate (-M -L).

  2. Imposta i valori di timeout del masquerading (-M -S) (si veda anche
     ``Non posso impostare i timeout del masquerading!'').

  La funzione finale (e forse la pi utile) permette di controllare cosa
  succederebbe ad un dato pacchetto se volesse traversare una data
  catena.


  4.1.2.  Operazioni su una sola regola

  Questa  la ragione di sussistenza di ipchains: la manipolazione delle
  regole.  Molto probabilmente si useranno i comandi di aggiunta (-A) e
  cancellazione (-D).  Gli altri (-I per l'inserimento e -R per il
  rimpiazzo) sono semplici estensioni di questi concetti.


  Ogni regola specifica un insieme di condizioni che il pacchetto deve
  soddisfare, e cosa fare se il pacchetto le soddisfa (un "obiettivo").
  Per esempio, si possono voler proibire tutti i pacchetti ICMP
  provenienti dall'indirizzo 127.0.0.1.  Quindi in questo caso le nostre
  condizioni sono che il protocollo deve essere ICMP e che l'indirizzo
  di provenienza deve essere 127.0.0.1.  Il nostro obiettivo  `DENY'.


  127.0.0.1  l'interfaccia `loopback', presente anche se non si
  possiede una vera connessione di rete.  Si pu usare il programma
  `ping' per generare tali pacchetti (semplicemente invia un pacchetto
  ICMP di tipo 8 (echo request) al quale tutti gli host cooperativi
  dovrebbero rispondere obbligatoriamente con un pacchetto ICMP di tipo
  0 (echo reply)).  Ci lo rende molto utile per i test.



       # ping -c 1 127.0.0.1
       PING 127.0.0.1 (127.0.0.1): 56 data bytes
       64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms

       --- 127.0.0.1 ping statistics ---
       1 packets transmitted, 1 packets received, 0% packet loss
       round-trip min/avg/max = 0.2/0.2/0.2 ms
       # ipchains -A input -s 127.0.0.1 -p icmp -j DENY
       # ping -c 1 127.0.0.1
       PING 127.0.0.1 (127.0.0.1): 56 data bytes

       --- 127.0.0.1 ping statistics ---
       1 packets transmitted, 0 packets received, 100% packet loss
       #




  Si pu vedere che il primo ping ha successo (il `-c 1' dice a ping di
  inviare un solo pacchetto).


  Poi si  aggiunta alla catena `input' una regola che specifica che per
  i pacchetti provenienti da 127.0.0.1 (`-s 127.0.0.1') con protocollo
  ICMP (`-p ICMP') si dovr saltare a DENY (`-j DENY').


  Poi si  verificata la nostra regola, usando un secondo ping.  Ci sar
  una pausa prima che il programma si stanchi di aspettare una risposta
  che non arriver mai.

  Si pu cancellare la regola in due modi.  Per prima cosa, poich
  sappiamo che  la sola regola nella catena input, possiamo usare la
  cancellazione in base alla posizione, come in


               # ipchains -D input 1
               #




  per cancellare la regola numero 1 nella catena input.


  Il secondo modo  di ricopiare il comando -A precedente, rimpiazzando
  -A con -D.  Ci  utile quando si ha una complessa catena di regole e
  non si vuole star l a contarle per scoprire che quella che si vuole
  cancellare  la 37-esima.  In tal caso useremo:


               # ipchains -D input -s 127.0.0.1 -p icmp -j DENY
               #




  La sintassi di -D deve avere esattamente le stesse opzioni del comando
  -A (o -I oppure -R).  Se c' una multitudine di regole identiche nella
  stessa catena,  cancellata solo la prima.


  4.1.3.  Specificare il filtraggio

  Si  visto l'uso di `-p' per specificare il protocollo e di `-s' per
  specificare l'indirizzo di provenienza, ma ci sono altre opzioni che
  si possono usare per specificare le caratteristiche del pacchetto.
  Quel che segue  un compendio esaustivo.


  4.1.3.1.  Specificare gli indirizzi di provenienza e destinazione

  Gli indirizzi IP di provenienza (-s) e destinazione (-d) possono
  essere specificati in quattro modi.  Il modo pi comune  di usare il
  nome completo, come `localhost' o `www.linuxhq.com'.  Il secondo modo
   di specificare l'indirizzo IP, come ad esempio `127.0.0.1'.


  Il terzo ed il quarto modo permettono di specificare un gruppo di
  indirizzi IP, come ad esempio `199.95.207.0/24' o
  `199.95.207.0/255.255.255.0'.  Entrambi specificano un qualsiasi
  indirizzo IP tra 192.95.207.0 e 192.95.207.255 estremi inclusi; le
  cifre dopo `/' dicono quali parti dell'indirizzo IP sono
  significative.  I valori predefiniti sono `/32' o `/255.255.255.255'
  (corrispondenti a tutti gli indirizzi IP).  Per specificare nessun
  indirizzo IP pu essere usato `/0', come segue:


               # ipchains -A input -s 0/0 -j DENY
               #




  Questa cosa  raramente usata, in quanto il suo effetto  lo stesso
  che non specificare affatto l'opzione `-s'.

  4.1.3.2.  Specificare una negazione

  Molte opzioni, tra le quali `-s' e `-d', possono avere gli argomenti
  preceduti da `!' (pronunciato `not') per effettuare la corrispondenza
  con indirizzi NON uguali a quelli dati.  Per esempio, `-s ! localhost'
  corrisponde a qualsiasi pacchetto non proveniente da localhost.


  4.1.3.3.  Specificare un protocollo

  Il protocollo pu essere specificato con l'opzione `-p'.  Il
  protocollo pu essere un numero (se si conoscono i valori numerici dei
  protocolli IP) o un nome per i casi speciali di `TCP', `UDP' o `ICMP'.
  Non  importante come  scritto: vanno bene sia `tcp' che `TCP'.


  I nomi dei protocolli possono essere preceduti da un `!' per negarli,
  con ad esempio `-p ! TCP'.


  4.1.3.3.1.  Specificare porte UDP e TCP

  Nei casi particolari nei quali  specificato TCP o UDP come
  protocollo, ci pu essere un argomento aggiuntivo che indica la porta
  TCP e UDP, oppure un intervallo (inclusivo) di porte (si veda anche
  ``Gestire i frammenti'' nel seguito).  Un intervallo  rappresentato
  usando un carattere `:', come ad esempio `6000:6010', che copre 11
  numeri di porte da 6000 a 6010 estremi compresi.  Se  omesso il
  limite inferiore, il valore predefinito  0.  Se  omesso quello
  superiore, il suo valore predefinito  65535.  Quindi per specificare
  le connessioni TCP provenienti da porte inferiori alla 1024, la
  sintassi potrebbe essere `-p TCP -s 0.0.0.0/0 :1023'.  I numeri di
  porta possono essere specificati anche attraverso il nome, eg. `www'.


  Si noti che la specificazione pu essere preceduta da un `!', che la
  nega.  Quindi per specificare qualsiasi pacchetto TCP TRANNE i
  pacchetti WWW, si potrebbe specificare

  -p TCP -d 0.0.0.0/0 ! www



   importante realizzare che la specifica


  -p TCP -d ! 192.168.1.1 www



   molto diversa da

  -p TCP -d 192.168.1.1 ! www



  La prima specifica qualsiasi pacchetto TCP verso la porta WWW su
  qualsiasi macchina tranne la 192.168.1.1.  La seconda specifica
  qualsiasi connessione TCP verso qualsiasi porta di 192.168.1.1 tranne
  la porta WWW.


  Per finire, questo caso indica di escludere sia la porta WWW e che
  192.168.1.1:


  -p TCP -d ! 192.168.1.1 ! www




  4.1.3.3.2.  Specificare tipo e codice ICMP

  Anche ICMP permette argomenti opzionali, ma poich ICMP non ha le
  porte (ICMP ha un tipo e un codice) hanno un significato diverso.


  Possono essere specificati come nomi ICMP (si usi ipchains -h icmp per
  la lista di nomi) dopo l'opzione `-s', oppure come tipo e codice ICMP
  numerici, dove il tipo segue l'opzione `-s' e il codice segue
  l'opzione `-d'.


  I nomi ICMP sono piuttosto lunghi: basta usare solamente abbastanza
  lettere da rendere il nome distinguibile da ogni altro.


  Di seguito una piccola tabella dei pi comuni pacchetti ICMP:


       Numero  Nome                     Richiesto da

       0       echo-reply               ping
       3       destination-unreachable  qualsiasi traffico TCP/UDP.
       5       redirect                 per l'instradamento, se non sta girando
                                        il demone di instradamento
       8       echo-request             ping
       11      time-exceeded            traceroute




  Si noti che i nomi ICMP al momento non possono essere preceduti da
  `!'.


  NON NON NON si blocchino tutti i messaggi ICMP di tipo 3!  (si veda
  ``Pacchetti ICMP'' pi avanti).


  4.1.3.4.  Specificare un'interfaccia

  L'opzione `-i' specifica il nome di un'interfaccia.  Un'interfaccia 
  il dispositivo fisico dal quale entra o esce il pacchetto.  Si pu
  usare il comando ifconfig per avere un elenco delle interfacce che al
  momento sono `s' (ie. che al momento funzionano).


  L'interfaccia per i pacchetti in arrivo (ie. i pacchetti che stanno
  attraversando la catena input)  considerata essere l'interfaccia
  dalla quale entrano.  Logicamente, l'interfaccia per i pacchetti in
  partenza (i pacchetti che stanno attraversando la catena output) 
  l'interfaccia dalla quale usciranno.  Anche l'interfaccia per i
  pacchetti che passano per la catena forward  l'interfaccia dalla
  quale usciranno; a me sembra una decisione piuttosto arbitraria.


   perfettamente legale specificare un'interfaccia che al momento non
  esiste; la regola non sar mai soddisfatta finch l'interfaccia non
  viene attivata.  Ci  estremamente utile per le connessioni PPP in
  dial-up (solitamente l'interfaccia ppp0) e simili.

  Come caso speciale, un nome di intefaccia che termina con un `+'
  corrisponder a tutte le interfacce (che esistano o meno) che iniziano
  con quella stringa.  Per esempio, per specificare una regola che
  corrisponda a tutte le interfacce PPP, pu essere usata l'opzione -i
  ppp+.


  Il nome dell'interfaccia pu essere preceduto da un `!' per far s che
  sia soddisfatta da tutte le interfacce che NON corrispondono
  all'interfaccia (o alle interfacce) specificata.


  4.1.3.5.  Specificare solo pacchetti TCP SYN

  Talvolta  utile permettere connessioni TCP in una direzione, ma non
  nell'altra.  Per esempio, si pu voler permettere connessioni verso un
  server WWW esterno ma non le connessioni da quel server.


  L'approccio naive sarebbe quello di bloccare i pacchetti TCP
  provenienti da server.  Sfortunantamente, le connessioni TCP
  richiedono per funzionare che i pacchetti possono andare in entrambe
  le direzioni.


  La soluzione  di bloccare solo i pacchetti usati per richiedere una
  connessione.  Questi pacchetti sono chiamati pacchetti SYN (ok,
  tecnicamente sono pacchetti con il flag SYN impostato, e i campi FIN e
  ACK non attivati, ma li chiameremo lo stesso pacchetti SYN).  Non
  permettendo solamente questi pacchetti, si possono fermare i tentativi
  di connessione.


  Per questo viene usata l'opzione `-y':  valida solamente per regole
  che specificano TCP come loro protocollo.  Per esempio, per
  specificare un tentativo di connessione TCP da 192.168.1.1:

  -p TCP -s 192.168.1.1 -y




  Ancora una volta, questa opzione pu essere negata precedendola con un
  `!' che significa tutti pacchetti tranni quelli per iniziare la
  connessione.


  4.1.3.6.  Gestire i frammenti

  Qualche volta un pacchetto  troppo grande per passarci tutto intero
  nel cavo.  Quando questo succede, il pacchetto  diviso in frammenti
  (fragments), ed inviato come pacchetti multipli.  L'altro capo della
  connessione riassembla i pacchetti per ricostruire il pacchetto
  intero.


  Il problema con i frammenti  che alcune delle specificazioni suddette
  (in particolare porta d'origine, porta di destinazione, tipo ICMP,
  codice ICMP o flag SYN TCP) richiedono che il kernel sbirci nella
  parte iniziale del pacchetto, che  contenuta solo nel primo
  frammento.


  Se le propria macchina  la sola connessione ad una rete esterna,
  allora si pu dire al kernel di riassemblare tutti i frammenti che gli
  passano attraverso, compilando il kernel con l'opzione IP: always
  defragment posta a `Y'.  Ci evita il problema in maniera pulita.


  Diversamente,  importante capire come sono trattati i frammenti dalle
  regole di filtraggio.  Qualsiasi regola di filtraggio che chiede
  informazioni che non si hanno non verr soddisfatta.  Ci significa
  che il primo frammento  trattato come qualsiasi altro pacchetto.  Non
  lo saranno invece il secondo e i successivi frammenti.  Quindi una
  regola -p TCP -s 192.168.1.1 www (specificante una porta sorgente
  `www') non sar mai soddisfatta da un frammento (tranne al primo).  E
  neppure la regola opposta -p TCP -s 192.168.1.1 ! www.


  Comunque, si pu specificare una regola specifica per il secondo e i
  successivi frammenti, usando l'opzione `-f'.  Ovviamente in questa
  regola per i frammenti  illegale specificare una porta TCP o UDP, un
  tipo o un codice ICMP oppure l'opzione per il SYN TCP.


   pure legale specificare che una regola non si applica al secondo e
  ai successivi frammenti, precendendo il `-f' con `!'.


  Solitamente  considerata una cosa sicura lasciar passare il secondo e
  i successi frammenti, poich il filtraggio avr effetto sul primo
  frammento e quindi preverr la ricostruzione nell'host di
  destinazione.  Comunque, sono noti alcuni bug che permettono il crash
  di macchine semplicemente inviandogli frammenti.


  Una nota per i capoccioni della rete: i pacchetti malformati
  (pacchetti TCP, UDP o ICMP troppo corti affinch il codice di
  firewalling possa leggere le porte o il codice e tipo ICMP) sono
  trattati come frammenti.  Solo i frammenti TCP che iniziano alla
  posizione 8 sono esplicitamente scartati dal codice di firewall
  (dovrebbe apparire un messaggio nel syslog se succede questo).


  Come esempio, la regola seguente scarter qualsiasi frammento diretto
  a 192.168.1.1:




       # ipchains -A output -f -d 192.168.1.1 -j DENY
       #





  4.1.4.  Effetti collaterali del filtraggio

  OK, quindi ora si conoscono tutti i modi con i quali si pu creare una
  regola che corrisponda ad un pacchetto.  Se un pacchetto soddisfa una
  regola, succedono le seguenti cose:


  1. Il contatore di byte per quella regola  incrementato della
     dimensione del pacchetto (intestazione e tutto il resto).

  2.  incrementato il contatore di pacchetti per quella regola.

  3. Se la regola lo richiede, il pacchetto  registrato.


  4. Se la regola lo richiede,  cambiato il campo Type Of Service del
     pacchetto.

  5. Se la regola lo richiede, il pacchetto  marcato (non nei kernel
     della serie 2.0).

  6.  esaminata la regola obiettivo per decidere cosa fare dopo al
     pacchetto.


  Per variet, le esaminer in ordine di importanza.


  4.1.4.1.  Specificare un obiettivo

  Un obiettivo dice al kernel cosa farne di un pacchetto che soddisfa
  una regola.  ipchains usa `-j' (penso `jump-to' - salta a) per la
  specifica dell'obiettivo.  Il nome dell'obiettivo deve essere pi
  corto di 8 caratteri, ed  importante come  scritto: "RETURN" e
  "return" sono completamente diversi.


  Il caso pi semplice  quando non  specificato alcun obiettivo.
  Questo tipo di regola (spesso detta regola di `accounting' -
  contabilit)  utile con contare semplicemente un certo tipo di
  pacchetto.  Che questa regola sia o meno soddisfatta, semplicemente il
  kernel esamina la regola successiva nella catena.  Per esempio, per
  contare il numero di pacchetti da 192.168.1.1, si pu fare cos:


       # ipchains -A input -s 192.168.1.1
       #





  (Usando `ipchains -L -v' si possono vedere i contatori di byte e
  pacchetti associati con ciascuna regola).


  Esistono sei obiettivi speciali.  I primi tre, ACCEPT, REJECT e DENY
  sono piuttosto semplici.  ACCEPT permette che il pacchetto passi.
  DENY scarta il pacchetto come non fosse mai stato ricevuto.  REJECT
  scarta il pacchetto, ma (se non  un pacchetto ICMP) genera una
  risposta ICMP per la sorgente per dirle che la destinazione non 
  raggiungibile.


  Quella dopo, MASQ dice al kernel di mascherare il pacchetto.  Affinch
  ci funzioni, il proprio kernel dev'essere compilato con il supporto
  per l'IP Masquerading.  Per i dettagli si veda il Masquerading-HOWTO e
  l'appendice ``Differenze tra ipchains e ipfwadm''.  Questo obiettivo 
  valido solo per pacchetti che attraversano la catena forward.


  L'altro obiettivo principale  REDIRECT che dice al kernel di inviare
  un pacchetto ad una porta locale invece di dove era destinato ad
  andare.  Pu essere specificato solo per regole che specificano TCP o
  UDP come loro protocolli.  Opzionalmente, pu essere specificata una
  porta (nome o numero) dopo di `-j REDIRECT' che far s che quel
  pacchetto sia dirottato a quella particolare porta anche se era
  indirizzato ad un'altra porta.  Questo obiettivo  valido solo per
  pacchetti che attraversano la catena input.


  L'obiettivo finale speciale  RETURN che  identico all'uscita
  immediata dalla catena (si veda ``Impostare la tattica'' nel seguito).


  Qualsiasi altro obiettivo indica una catena definita dall'utente (come
  descritto in ``Operazione con intere catene'' nel seguito).  Il
  pacchetto inizier ad attraversare le regole in quella catena.  Se
  quella catena non decide il destino del pacchetto, allora, una volta
  che  terminata la traversata della catena, si riprende dalla regola
  successiva nella catena corrente.


   ora di un altro po' arte ASCII.  Si considerino due catene
  (sciocche): input (la catena predefinita) e Test (una catena definita
  dall'utente).


           `input'                           `Test'
          ------------------------------  ------------------------------
          | Regola1: -p ICMP -j REJECT |  | Regola1: -s 192.168.1.1    |
          |----------------------------|  |----------------------------|
          | Regola2: -p TCP -j Test    |  | Regola2: -d 192.168.1.1    |
          |----------------------------|  ------------------------------
          | Regola3: -p UDP -j DENY    |
          ------------------------------




  Si consideri un pacchetto TCP proveniente da 192.168.1.1 e destinato a
  1.2.3.4.  Entra nella catena input e viene controllato rispetto a
  Regola1: non la soddisfa. Soddisfa invece Regola2 il cui obiettivo 
  Test. Quindi la successiva regola ad essere esaminata  la prima di
  Test.  Regola1 in Test  soddisfatta ma non specifica un obiettivo,
  quindi Regola2  la prossima ad essere esaminata.  Questa non 
  soddisfatta e si  cos raggiunta la fine delle catena.  Si quindi
  ritorna alla catena input, dove si  appena esaminata Regola2 e quindi
  ora si esamina Regola3, che non viene soddisfatta.


  Quindi il percorso del pacchetto :

                                    v    ___________________________
           `input'                  |   /  `Test'                  v
          --------------------------|--/  -------------------------|----
          | Regola1                 | /|  | Regola1                |   |
          |-------------------------|/-|  |------------------------|---|
          | Regola2                 /  |  | Regola2                |   |
          |----------------------------|  -------------------------v----
          | Regola3                 /--+___________________________/
          --------------------------|---
                                    v




  Si veda la sezione ``Come organizzare le proprie regole di firewall''
  per alcuni metodi per usare efficacemente le catene definite
  dall'utente.


  4.1.4.2.  Registrazione dei pacchetti

  Questo  un effetto collaterale che pu avere una regola che viene
  soddisfatta: usando l'opzione `-l' si pu far s che il pacchetto che
  la soddisfa sia registrato.  Solitamente questa cosa non la si vuole
  per i pacchetti di routine, ma  una caratteristica utile se si
  vogliono cercare eventi eccezionali.


  Il kernel registra questa informazione come segue:



       Packet log: input DENY eth0 PROTO=17 192.168.2.1:53 192.168.1.1:1025
         L=34 S=0x00 I=18 F=0x0000 T=254




  Questo messaggio di registrazione  pensato per essere conciso e
  contiene informazioni tecniche utili solo ai guru del networking, ma
  pu essere utile anche al resto di noi.  Si suddivide cos:


  1. `input'  la catena che contiene la regola soddisfatta dal
     pacchetto, che ha causato il messaggio di log.

  2. `DENY'  quanto la regola dice di fare del pacchetto.  Se  `-'
     allora la regola non ha effetto sul pacchetto (una regola di
     accounting).

  3. `eth0'  il nome dell'interfaccia.  Poich la catena era la input,
     indica che il pacchetto  entrato da `eth0'.

  4. `PROTO=17' indica che il pacchetto era con protocollo 17.  Un
     elenco dei protocolli  dato in `/etc/protocols'.  I pi comuni
     sono 1 (ICMP), 6 (TCP) e 17 (UDP).

  5. `192.168.2.1' indica che l'indirizzo IP di provenienza era
     192.168.2.1.

  6. `:53' indica che porta di provenienza era la porta 53.  Cercando in
     `/etc/services' si veda che questa  la porta `domain' (ie.
     probabilmente  una risposta DNS).  Per UDP e TCP questo numero 
     la porta di provenienza.  Per ICMP,  il tipo ICMP.  Per gli altri,
     sar 65535.

  7. `192.168.1.1'  l'indirizzo IP di destinazione.

  8. `:1025' indica che la porta di destinazione era la 1025.  Per UDP e
     TCP questo numero  la porta di destinazione.  Per ICMP  il codice
     ICMP.  Per gli altri, sar 65535.

  9. `L=34' indica che il pacchetto era lungo 34 byte.

  10.
     `S=0x00' indica il campo Type of Service (lo si divida per 4 per
     ottenere il Type of Service usato da ipchains).

  11.
     `I=18'  l'ID IP.

  12.
     `F=0x0000'  l'offset a 16 bit del frammento pi i flag.  Un valore
     che cominci con `0x4' o `0x5' indica che il bit `Don't Fragment' 
     impostato.  `0x2' or `0x3' indicano che  impostato il bit `More
     Fragments'; sono da aspettarsi altri frammenti dopo di questo.  Il
     resto del numero  l'offset, diviso per 8, di questo frammento.

  13.
     `T=254'  il `Time To Live' (tempo di vita) del pacchetto.  
     diminuito di uno ad ogni hop, e solitamente parte a 15 o 255.

  14.
     `(#5)' ci pu essere un numero finale tra parentesi nei kernel pi
     recenti (forse dopo il 2.2.9).   il numero della regola che ha
     causato la registrazione del pacchetto.


  Nei sistema Linux standard, questo output del kernel  catturato da
  klogd (il demone di registrazione del kernel) che lo passa poi al
  syslogd (il demone di registrazione di sistema).  Il file
  `/etc/syslog.conf' controlla il comportamento di syslogd, specificando
  una destinazione per ogni `facility' (nel nostro caso la facility 
  "kernel") e `livello' (per ipchains, il livello usato  "info").


  Per esempio, il mio /etc/syslog.conf (Debian) contiene due righe
  corrispondenti a `kern.info':



       kern.*                          -/var/log/kern.log
       *.=info;*.=notice;*.=warn;\
               auth,authpriv.none;\
               cron,daemon.none;\
               mail,news.none          -/var/log/messages




  Indica che i messaggi sono duplicati in `/var/log/kern.log' e in
  `/var/log/messages'.  Per maggiori dettagli, si veda `man
  syslog.conf'.


  4.1.4.3.  Manipolare il `Type Of Service'

  Nell'intestazione IP ci sono quattro bit raramente usati, detti bit
  Type of Service (TOS - Tipo Di Servizio).  Influenzano il modo in cui
  sono trattati i pacchetti; i quattro bit sono "Minimum Delay" (Ritardo
  Minimo), "Maximum Throughput" (Massima Velocit di Trasmissione),
  "Maximum Reliability" (Massima Affidabilit) e "Minimum Cost" (Minimo
  Costo).  Solo ad uno di questo bit  permesso di essere impostato.
  Rob van Nieuwkerk, l'autore del codice di "maltrattamento" TOS, ne
  parla in questi termini:


       Per me  importante specialmente il "Minimum Delay".  L'ho
       attivato per i pacchetti "interattivi" nel mio router
       (Linux) a monte.  Io sono dietro una connessione modem a
       33k6.  Linux prioritizza i pacchetti in 3 code.  In questo
       modo ottengo accettabili prestazioni interattive mentre fac
       cio dei meri download (potrebbe andare ancora meglio se non
       ci fosse una coda cos grande nel driver della seriale, ma
       ora la latenza  mantenuta sotto gli 1.5 secondi).



  Nota: ovviamente, non si ha controllo sui pacchetti in arrivo; si pu
  controllare la priorit solamente dei pacchetti che lasciano la
  propria macchina.  Per negoziare le priorit con l'altro capo della
  connessione, deve essere usato un protocollo tipo RSVP (non so niente
  in proposito, quindi non chiedete a me).



  L'uso pi comune  di impostare le connessioni di controllo di telnet
  e ftp a "Minimum Delay" e quelle dati FTP a "Maximum Throughput".  Ci
  pu essere fatto come segue:



       ipchains -A output -p tcp -d 0.0.0.0/0 telnet -t 0x01 0x10
       ipchains -A output -p tcp -d 0.0.0.0/0 ftp -t 0x01 0x10
       ipchains -A output -p tcp -s 0.0.0.0/0 ftp-data -t 0x01 0x08





  L'opzione `-t' accetta altri due parametri addizionali, entrambi in
  esadecimale.  Questi permettono di far giochetti complessi con i bit
  TOS: con la prima maschera  fatta l'AND con i TOS correnti del
  pacchetto, e poi del risultato viene fatta l'XOR con la seconda.  Se 
  troppo confuso, allora si usi semplicemente la tabella seguente:



       Nome del TOS            Valore          Uso Tipico

       Minimum Delay           0x01 0x10       ftp, telnet
       Maximum Throughput      0x01 0x08       ftp-data
       Maximum Reliability     0x01 0x04       snmp
       Minimum Cost            0x01 0x02       nntp




  Andi Kleen puntualizza quanto segue:

       Forse potrebbe essere utile aggiungere riferimenti al para
       mentro txqueuelen di ifconfig alla discussione dei bit TOS.
       La lunghezza predefinita della coda del dispositivo, rego
       lata per le schede ethernet, per i modem  troppo lunga e fa
       s che lo schedulatore a 3 bande (le cui code sono basate
       sui TOS) funzioni in maniera subottima.   una buona idea
       impostarla ad un valore tra 4 e 10 per le connessioni via
       modem o ISDN a canale b singolo.  Questo  un problema dei
       kernel 2.0 e 2.1, ma mentre nei 2.1 esiste un'opzione di
       ifconfig (nei nettools recenti), nei 2.0  necessaria una
       patch ai sorgenti dei device driver.


  Quindi, per vedere i massimi benefici dalla manipolazione dei TOS
  nella connessioni PPP via modem, si usi `ifconfig $1 txqueuelen' nel
  proprio script /etc/ppp/ip-up.  Il numero da usare dipende dalla
  velocit del modem e dalla dimesione del buffer nel modem; Andi ci
  mostra ancora la direzione da seguire:


       Il miglior valore per una data configurazione si determina
       sperimentalmente.  Se la coda  troppo corta in un router
       allora saranno scartati i pacchetti.  Naturalmente si trag
       gono benefici anche senza la riscrittura dei TOS, solo che
       la riscrittura dei TOS aiuta a dare beneficio ai programmi
       non cooperativi (tutti i programmi standard di Linux sono
       cooperativi).





  4.1.4.4.  Marcare un pacchetto

  Ci permette una complessa e potente iterazione con la nuova
  implementazione di `Quality of Service' di Alexey Kuznetsov e con il
  forwading basato sulla marcatura degli ultimi kernel della serie 2.1.
  Dar maggiori informazioni non appena ne verr in possesso.  Questa
  opzione  ignorata nei kernel della serie 2.0.


  4.1.4.5.  Operazioni su un'intera catena

  Una caratteristica molto utile di ipchains  la possibilit di
  raggruppare regole collegate dentro catene.  Si possono chiamare le
  catene come si vuole a meno che il nome non sia in conflitto con le
  catene (input, output e forward) o gli obiettivi (MASQ, REDIRECT,
  ACCEPT, DENY, REJECT o RETURN) predefiniti.  Suggerisco di evitare in
  toto l'uso di etichette in maiuscolo, in quanto le potrei usare per
  estensioni future.  Il nome della catena pu essere lungo fino a 8
  caratteri.


  4.1.4.6.  Creare una nuova catena

  Suvvia creiamo una nuova catena!  Poich sono un tipo con un sacco di
  immaginazione, la chiamer test.



       # ipchains -N test
       #





  Tutto qua.  Ora le si possono mettere dentro le regole come spiegato
  in precedenza.


  4.1.4.7.  Cancellare una catena

  Anche cancellare una catena  semplice.



       # ipchains -X test
       #




  Perch `-X'?  Beh, tutte le altre lettere buone erano gi occupate.


  Ci sono un paio di restrizioni sulla cancellazione di una catena: deve
  essere vuota (si veda ``Svuotare una catena'' nel seguito) e non deve
  essre l'obiettivo di nessuna regola.  Non  possibile cancellare
  nessuna delle tre catene predefinite.


  4.1.4.8.  Svuotare una catena

  C' un modo semplice per svuotare una catena di tutte le regole,
  usando il comando `-F' (flush).


               # ipchains -F forward
               #





  Se non si specifica una catena, allora saranno svuotate tutte le
  catene.


  4.1.4.9.  Elencare le regole in una catena

  Si possono elencare tutte le regole in una catena usando il comando
  `-L' (list).



       # ipchains -L input
       Chain input (refcnt = 1): (policy ACCEPT)
       target     prot opt    source                destination           ports
       ACCEPT     icmp -----  anywhere              anywhere              any
       # ipchains -L test
       Chain test (refcnt = 0):
       target     prot opt    source                destination           ports
       DENY       icmp -----  localnet/24           anywhere              any
       #





  Il valore di `refcmt' mostrato per test  il numero di regole che
  hanno test come loro obiettivo.  Deve essere zero (e la catena essere
  vuota) prima che si possa cancellarla.


  Se  omesso il nome della catena, sono elencate tutte le catene, anche
  quelle vuote.


  Ci sono tre opzioni che possono accompagnare `-L'.  L'opzione `-n'
  (numeric)  molto utile in quanto previene ipchains dal tentativo di
  ricercare gli indirizzi IP, che (se si usa un DNS come fanno molti)
  causer parecchio ritardo se il proprio DNS non  configurato
  correttamente, o si sono filtrate tutte le richieste DNS.  Inoltre fa
  s che le porte siano mostrate come numeri piuttosto che con i loro
  nomi.


  L'opzione `-v' mostra tutti i dettagli delle regole, come i contatori
  di pacchetti e byte, le maschere TOS, l'interfaccia e la marcatura dei
  pacchetti.  Diversamente questi valori sono omessi.  Per esempio:



       # ipchains -v -L input
       Chain input (refcnt = 1): (policy ACCEPT)
        pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
          10   840 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any






  Si noti che i contatori di pacchetti e byte sono mostrati usando i
  suffissi `K', `M' o `G' rispettivamente per 1000, 1000000 e
  1000000000.  Usando l'opzione `-x' (espandi i numeri) verranno
  mostrati i numeri interi, senza preoccuparsi di quanto grandi siano.


  4.1.4.10.  Azzerare i contatori

   utile poter azzerare i contatori.  Ci pu essere fatto con
  l'opzione `-Z' (zero counters).  Per esempio:



       # ipchains -v -L input
       Chain input (refcnt = 1): (policy ACCEPT)
        pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
          10   840 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any
       # ipchains -Z input
       # ipchains -v -L input
       Chain input (refcnt = 1): (policy ACCEPT)
        pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
           0     0 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any
       #





  Il problema con questo approccio  che talvolta serve sapere il valore
  dei contatori un attimo prima di azzerarli.  Nell'esempio precedente,
  tra i comandi `-L' e `-Z' potrebbero essere passati degli altri
  pacchetti.  Per questa ragione, si possono usare `-L' and `-Z'
  assieme, per azzerare i contatori mentri li si legge.
  Sfortunatamente, se si fa cos, non si pu operare su una sola catena:
  si devono mostrare e azzerare tutte le catene in una volta.



       # ipchains -L -v -Z
       Chain input (policy ACCEPT):
        pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
          10   840 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any

       Chain forward (refcnt = 1): (policy ACCEPT)
       Chain output (refcnt = 1): (policy ACCEPT)
       Chain test (refcnt = 0):
           0     0 DENY       icmp ----- 0xFF 0x00  ppp0                  localnet/24           anywhere              any
       # ipchains -L -v
       Chain input (policy ACCEPT):
        pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
          10   840 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any

       Chain forward (refcnt = 1): (policy ACCEPT)
       Chain output (refcnt = 1): (policy ACCEPT)
       Chain test (refcnt = 0):
           0     0 DENY       icmp ----- 0xFF 0x00  ppp0                  localnet/24           anywhere              any
       #





  4.1.4.11.  Impostare la tattica

  Si  visto cosa succede quando un pacchetto raggiunge la fine di una
  catena predefinita quando si  discusso come un pacchetto cammina
  attraverso una catena in ``Specificare un obiettivo''.  In questo
  caso, la tattica (policy) di una catena determina il destino del
  pacchetto.  Solo le catene predefinite (input, output e forward) hanno
  delle tattiche, poich se un pacchetto cade fuori dalla fine di una
  catena definita dall'utente, la traversata riprende nelle catena
  precedente.


  La tattica pu essere una qualsiasi dei primi quattro obiettivi
  speciali: ACCEPT, DENY, REJECT o MASQ.  MASQ  valida solamente per la
  catena `forward'.


  Inoltre  importante notare che un obiettivo RETURN in una regola in
  una delle catene predefinite  utile per stabilire esplicitamente la
  tattica di una catena quando un pacchetto soddisfa una regola.


  4.1.5.  Operazioni sul masquerading

  Ci sono diversi parametri per l'IP Masquerading con i quali si pu
  giocare.  Sono inglobati in ipchains perch non valeva la pena
  scrivere uno strumento separato (anche se questa cosa cambier).


  Il comando per il masquerading IP  `-M', e pu essere combinato con
  `-L' per mostrare l'elenco delle connessioni attualmente mascherate, o
  con `-S' per impostare i parametri del masquerading.


  Il comando `-L' pu essere accompagnato da `-n' (mostra i numeri
  invece dei nomi degli host e delle porte) o `-v' (mostra i delta nelle
  sequenze di numeri per le connessioni mascherate, nel caso importi
  qualcosa).


  Il comando `-S' dovrebbe essere seguito da tre valori di timeout in
  secondi: per le sessioni TCP, per le sessioni TCP dopo un pacchetto
  FYN e per i pacchetti UDP.  Se non si vuole cambiare uno di questi tre
  valori, semplicemente si specifichi `0' come valore.


  I valori predefiniti sono elencati in
  `/usr/src/linux/include/net/ip_masq.h', e rispettivamente sono 15
  minuti, 2 minuti e 5 minuti.


  Il valore pi comune da cambiare  il primo, per FTP (si veda ``Incubi
  da FTP'' pi avanti).


  Si noti il problema nell'impostazione dei timeout descritto in ``Non
  riesco a impostare i timeout del masquerading!''.


  4.1.6.  Controllare un pacchetto

  Talvolta si vuole vedere cosa succede quando un certo pacchetto entra
  nella propria macchina, ad esempio per fare il debug delle catene
  firewall.  ipchains ha il comando `-C' per permetterlo, che usa le
  stesse routine che usa il kernel per la diagnosi dei pacchetti reali.


  Si specifica su quale catena verificare il pacchetto facendo seguire
  l'argomento di `-C' con il suo nome.  Mentre il kernel inizia la
  trasversata sempre dalla catena input, output oppure forward, per gli
  scopi di test si ha il permesso di cominciare la traversata da
  qualsiasi catena.


  I dettagli del `pacchetto' sono specificati usando le stessa sintassi
  usata per specificare le regole firewall.  In particolare, sono
  obbligatori un protocollo (`-p'), un indirizzo di provenienza (`-s'),
  un indirizzo di destinazione (`-d') e un'interfaccia (`-i').  Se il
  protocollo  TCP o UDP, allora devono essere specificati un unico
  indirizzo di provenienza ed un unico indirizzo di destinazione, mentre
  devono essere specificati un tipo e un codice ICMP per il protocollo
  ICMP (a meno che non sia specificata l'opzione `-f' per indicare una
  regola sui frammenti, nel qual caso queste opzioni sono illegali).


  Se il protocollo  TCP (e non  specificata l'opzione `-f' ), pu
  essere specificata l'opzione `-y' per indicare che il pacchetto di
  test avr il bit SYN impostato.


  Ecco qui un esempio di verifica di un pacchetto SYN TCP dalla porta
  60000 di 192.168.1.1 alla porta www di 192.168.1.2, in arrivo
  sull'interfaccia eth0 e che entra nella catena `input' (questa  la
  classica inizializzazione di una connessione WWW):



       # ipchains -C input -p tcp -y -i eth0 -s 192.168.1.1 60000 -d 192.168.1.2 www
       packet accepted
       #





  4.1.7.  Pi regole in una volta sola e controllare cosa succede

  Talvolta un'unica riga di comando pu aver effetto su pi regole.  Ci
  capita in due situazioni.  La prima: se si pu specificare un nome di
  host che viene risolto (usando il DNS) in diversi indirizzi IP,
  ipchains si comporter come se si fossero digitati pi comandi, uno
  per ogni combinazione di indirizzi.


  Quindi se il nome di host `www.foo.com' viene risolto in tre indirizzi
  IP e il nome di host `www.bar.com' viene risolto in due indirizzi IP,
  allora il comando `ipchains -A input -j reject -s www.bar.com -d
  www.foo.com' aggiunger sei regole alla catena input.


  Un altro modo per far s che ipchains effettui azioni multiple  di
  usare l'opzione `-b' (bidirezionale).  Questa opzione fa s che
  ipchains si comporti come se si fosse digitato due volte il comando,
  la seconda volta scambiando gli argomenti di `-s' e `-d'.  Quindi per
  evitare l'inoltro sia da che per 192.168.1.1, si potrebbe fare quanto
  segue:



       # ipchains -b -A forward -j reject -s 192.168.1.1
       #





  Personalmente, non gradisco molto l'opzione `-b'; se si vuole qualcosa
  di pi utile si veda ``Usare ipchains-save'' pi avanti.


  L'opzione `-b' pu essere usato con i comandi di inserimento (`-I'),
  cancellazione (`-D') (ma non le varianti che accettano un numero di
  regola), aggiunta (`-A') e verifica (`-C').


  Un'altra opzione utile  `-v' (verboso) che mostra esattamente quel
  che ipchains sta facendo con il comando dato.   utile se si ha a che
  fare con comandi che possono evere effetto su pi regole.  Per
  esempio, controlliamo il comportamento dei frammenti tra 192.168.1.1 e
  192.168.1.2.



       # ipchains -v -b -C input -p tcp -f -s 192.168.1.1 -d 192.168.1.2 -i lo
         tcp opt   ---f- tos 0xFF 0x00  via lo    192.168.1.1  -> 192.168.1.2    * ->   *
       packet accepted
         tcp opt   ---f- tos 0xFF 0x00  via lo    192.168.1.2  -> 192.168.1.1    * ->   *
       packet accepted
       #





  4.2.  Un utile esempio

  Ho una connessione PPP in dialup (-i ppp0).  Mi scarico le news (-p
  TCP -s news.virtual.net.au nntp) e la posta (-p TCP -s
  mail.virtual.net.au pop-3) ogni volta che mi connetto.  Uso il metodo
  FTP di Debian per aggiornare regolarmente la mia macchina (-p TCP -y
  -s ftp.debian.org.au ftp-data).  Navigo in rete attraverso il proxy
  del mio ISP mentre tutta la roba precedente  in funzione (-p TCP -d
  proxy.virtual.net.au 8080), ma odio le pubblicit da doubleclick.net
  nel Dilbert Archive (-p TCP -y -d 199.95.207.0/24 e -p TCP -y -d
  199.95.208.0/24).


  Non mi preoccupo della gente che prova a fare ftp nella mia macchina
  mentre sono online (-p TCP -d $LOCALIP ftp), ma non voglio che nessuno
  da fuori pretenda di avere un indirizzo IP della mia rete interna (-s
  192.168.1.0/24).  Ci  comunemente detto IP spoofing, e c' un modo
  migliore per proteggersi nei kernel 2.1 e superiori: si veda ``Come
  proteggersi dall'IP spoofing?''.


  Questa configurazione  piuttosto semplice, perch attualmente non ci
  sono altre macchine nella mia rete interna.


  Non voglio che nessun processo locale (ie. Netscape, lynx ecc.) si
  connetta a doubleclick.net:



       # ipchains -A output -d 199.95.207.0/24 -j REJECT
       # ipchains -A output -d 199.95.208.0/24 -j REJECT
       #





  Ora voglio impostare le priorit in diversi pacchetti in uscita (non
  ne vedo l'utilit di farlo nei pacchetti in ingresso).  Poich ho
  parecchie di questo regole, ha senso metterle tutte in un unica
  catena, chiamata ppp-out.



       # ipchains -N ppp-out
       # ipchains -A output -i ppp0 -j ppp-out
       #





  Ritardo minimo per il traffico web e per telnet.



       # ipchains -A ppp-out -p TCP -d proxy.virtual.net.au 8080 -t 0x01 0x10
       # ipchains -A ppp-out -p TCP -d 0.0.0.0 telnet -t 0x01 0x10
       #





  Minimo costo per i dati ftp, nntp e pop-3:



       # ipchains -A ppp-out -p TCP -d 0.0.0.0/0 ftp-data -t 0x01 0x02
       # ipchains -A ppp-out -p TCP -d 0.0.0.0/0 nntp -t 0x01 0x02
       # ipchains -A ppp-out -p TCP -d 0.0.0.0/0 pop-3 -t 0x01 0x02
       #





  Ci sono alcune restrizioni sui pacchetti in ingresso dall'interfaccia
  ppp0: creo una catena chiamata `ppp-in':



       # ipchains -N ppp-in
       # ipchains -A input -i ppp0 -j ppp-in
       #





  Ora, nessun pacchetto in ingresso da ppp0 dovrebbe affermare un
  indirizzo di provenienza di 192.168.1.*, e quindi li registro e li
  proibisco:



       # ipchains -A ppp-in -s 192.168.1.0/24 -l -j DENY
       #





  Permetto l'ingresso solo di pacchetti UDP per il DNS (eseguo un
  caching nameserver che inoltra tutte le richieste a 203.29.16.1,
  quindi mi aspetto risposte DNS solo da loro), ftp entrante e ritorno
  di dati ftp (che dovrebbero andare solo verso una porta sotto la 1023,
  non verso le porte X11 attorno a 6000).



       # ipchains -A ppp-in -p UDP -s 203.29.16.1 -d $LOCALIP dns -j ACCEPT
       # ipchains -A ppp-in -p TCP -s 0.0.0.0/0 ftp-data -d $LOCALIP 1024:5999 -j ACCEPT
       # ipchains -A ppp-in -p TCP -s 0.0.0.0/0 ftp-data -d $LOCALIP 6010: -j ACCEPT
       # ipchains -A ppp-in -p TCP -d $LOCALIP ftp -j ACCEPT
       #





  Per finire, vanno bene i pacchetti local-to-local:



       # ipchains -A input -i lo -j ACCEPT
       #





  ora, la mia tattica di default per la catena input  DENY, quindi
  qualsiasi altra cosa viene scartata:



       # ipchains -P input DENY
       #





  NOTA: non imposterei le mie catene in questo ordine, in quanto i
  pacchetti potrebbero passare mentre le imposto.  La cosa pi sicura 
  di impostare per prima cosa la tattica a DENY, poi inserire le regole.
  Naturalmente, se le proprie regole necessitano di ricerche DNS per
  risolvere i nomi di host, potrebbero esserci problemi.


  4.2.1.  Usare ipchains-save

  Impostare le catene firewall proprio nel modo in cui le si vuole, e
  poi provare a ricordarsi i comandi usati in modo da porterlo fare
  anche la volta successiva  una cosa penosa.


  ipchains-save  uno script che legge l'impostazione corrente delle
  catene e la salva in un file.  Per ora vi lascio in fremente attesa di
  scoprire cosa fa ipchains-restore.


  ipchains-save pu salvare una catena o tutte le catene (se non 
  specificato un nome di catena).  La sola opzione attualmente permessa
   `-v' che stampa le regole (in stderr) mentre le salva.  Per le
  catene input, output e forward  salvata anche la tattica.


       # ipchains-save > my_firewall
       Saving `input'.
       Saving `output'.
       Saving `forward'.
       Saving `ppp-in'.
       Saving `ppp-out'.
       #





  4.2.2.  Usare ipchains-restore

  ipchains-restore ripristina le catene salvate con ipchains-save.
  Accetta due opzioni: `-v' che descrive ogni regola che viene aggiunta,
  e `-f' che forza lo svuotamento delle catene definite dall'utente se
  esistono, come descritto nel seguito.


  Se nell'input  trovata una catena definita dall'utente, ipchains-
  restore controlla se esiste gi.  Se esiste, sar chiesto se la catena
  debba essere svuotata (ripulita da tutte le regole) o se si debba
  saltare il ripristino di questa catena.  Se si specifica `-f' in riga
  di comando, non sar chiesto niente; la catena sar ripulita.


  Per esempio:



       # ipchains-restore < my_firewall
       Restoring `input'.
       Restoring `output'.
       Restoring `forward'.
       Restoring `ppp-in'.
       Chain `ppp-in' already exists. Skip or flush? [S/f]? s
       Skipping `ppp-in'.
       Restoring `ppp-out'.
       Chain `ppp-out' already exists. Skip or flush? [S/f]? f
       Flushing `ppp-out'.
       #





  5.  Miscellanea

  Questa sezione contiene tutte le informazioni e le FAQ che non sono
  riuscito a sistemare nella struttura precedente.


  5.1.  Come organizzare le proprie regole firewall

  Questa domanda richiede qualche riflessione.  Si pu provare ad
  organizzarle per ottimizzare la velocit (minizzare il numero di
  verifiche di regole per i pacchetti pi comuni) o per incrementare la
  gestibilit.


  Se si ha una connessione intermittente, diciamo una connessione PPP,
  si pu voler impostare la prima regola nella catena input a `-i ppp0
  -j DENY' al boot del sistema, e poi mettere qualcosa di simile a
  questo nello script ip-up:

       # Ricrea la catena `ppp-in'.
       ipchains-restore -f < ppp-in.firewall

       # Rimpiazza la regola DENY con un salto alla catena di gestione del ppp.
       ipchains -R input 1 -i ppp0 -j ppp-in





  Lo script ip-down potrebbe essere cos:



       ipchains -R input 1 -i ppp0 -j DENY






  5.2.  Cosa non filtrare

  Ci sono alcune cosette di cui bisogna essere consci prima di
  cominciare a filtrare tutto quello che non si vuole.


  5.2.1.  Pacchetti ICMP

  I pacchetti ICMP sono usati (tra le altre cose) per indicare
  fallimenti negli altri protocolli (come TCP o UDP).  In particolare i
  pacchetti `destination-unreachable' (destinazione irraggiungibile).
  Bloccare questi pacchetti significa che non si riceveranno mai gli
  errori `Host unreachable' o `No route to host'; qualsiasi connessione
  semplicemente attender una riposta che non arriver mai.  Ci 
  irritante, ma raramente fatale.


  Un problema peggiore  la regola dei pacchetti ICMP nel MTU discovery.
  Tutte le buone implementazioni TCP (inclusa quella di Linux) usano MTU
  discovery per provare a capire quale sia il pacchetto pi grosso che
  pu arrivare a destinazione senza essere frammentato (la
  frammentazione abbassa le prestazioni. specialmente quando vengono
  occasionalmente persi dei frammenti). MTU discovery lavora inviando
  pacchetti con il bit "Don't Fragment" impostato, inviando poi
  pacchetti pi piccoli se riceve un pacchetto ICMP che indica
  "Fragmentation needed but DF set" (`fragmentation-needed').  Questo 
  un pacchetto tipo `destination-unreachable', e se non viene mai
  ricevuto l'host locale non riduce l'MTU e le prestazioni saranno
  abissali o non esistenti.


  Si noti che  comune bloccare tutti i messaggi redirect ICMP (tipo 5);
  possono essere usati per manipolare l'instradamento (sebbene gli stack
  IP buoni abbiano delle protezioni), e quindi sono spesso visti un come
  po' rischiosi.


  5.2.2.  Connessioni TCP al DNS (nameserver)

  Se si sta provando a bloccare tutte le connessioni TCP in uscita, si
  ricordi che il DNS non sempre usa UDP; se la risposta dal server
  supera i 512 byte, il client usa una connessione TCP (ancora diretta
  alla porta numero 53) per ottenere i dati.


  Ci pu essere una trappola perch il DNS `praticamente funzioner' se
  si disabilitano tali trasferimenti TCP; comunque se lo si fa possono
  capitare strani lunghi ritardi e altri occasionali problemi DNS.


  Se le proprie interrogazioni DNS sono sempre dirette alla stessa fonte
  esterna (sia direttamente usando una riga nameserver in
  /etc/resolv.conf oppure usando un caching nameserver in modalit
  forward), allora si devono permettere solo le connessioni TCP alla
  porta domain di quel nameserver dalla porta domain locale (se si sta
  usando un caching nameserver) o da una porta pi alta (> 1023) se si
  sta usando /etc/resolv.conf.


  5.2.3.  Incubi da FTP

  FTP presenta un classico problema del filtraggio dei pacchetti.  FTP
  ha due modalit; quella tradizionale  detta modalit attiva e quella
  pi recente  detta modalit passiva.  I web browser solitamente usano
  la modalit passiva, mentre i programmi per FTP a riga di comando
  solitamente usano la modalit attiva.


  In modalit attiva, quando il sito remoto vuole inviare un file
  (oppure anche il risultato di un comando ls o dir) apre una
  connessione TCP verso la macchina locale.  Ci significa che non si
  possono filtrare queste connessioni TCP senza rompere l'FTP attivo.


  Se si ha la possibilit di usare la modalit passiva, allora bene; la
  modalit passiva crea connessioni dati dal client al server, anche per
  i dati in ingresso.  Altrimenti,  raccomandabile permettere
  connessioni TCP solamente verso porte superiori alla 1024 ma non tra
  6000 e 6010 (la 6000  usata per X-Windows).


  5.3.  Filtrare i Ping della Morte

  La macchine Linux sono ora immuni ai famosi Ping della Morte, che
  implicano l'invio di un pacchetto ICMP illegalmente grande che fa
  andare in overflow i buffer nello stack TCP del ricevente con effetti
  devastanti.


  Se vi vogliono proteggere macchine che potrebbero essere ancora
  vulnerabili, semplicemente si blocchino i frammenti ICMP.  Normalmente
  i pacchetti ICMP non sono abbastanza grandi da richiedere
  frammentazione, e quindi non si romper niente se non i grossi ping.
  Ho sentito (non confermato) che ad alcuni sistemi basta anche solo
  l'ultimo frammento di un pacchetto ICMP fuori misura per corromperli,
  e quindi non  raccomandabile bloccare solo il primo frammento.


  Sebbene i programmi exploit che ho visto usano tutti ICMP, non c'
  ragione per non usare frammenti TCP o UDP (o di un protocollo
  sconosciuto) per questi attacchi, e quindi bloccare i frammenti ICMP 
  solamente una soluzione temporanea.


  5.4.  Filtrare Teardrop e Bonk

  Teardrop e Bonk sono due attacchi (rivolti principalmente contro
  macchine Microsoft Windows NT) che si basano sulla sovrapposizione dei
  frammenti.  Le opzioni sono di far s che il proprio router Linux
  effettui la deframmentazione oppure disabilitare tutti i frammenti
  verso le macchine vulnerabili.
  5.5.  Filtrare i Fragment Bomb

  Si dice che alcuni stack TCP meno affidabili hanno problemi a gestire
  un largo numero di frammenti di pacchetti quando non ricevono mai
  tutti i frammenti.  Linux non ha questo problema.  Si possono filtrare
  tutti i frammenti (il che interrompe pure il loro uso legittimo)
  oppure compilare il kernel attivando `IP: always defragment' (solo se
  la propria macchina Linux  il solo instradamento possibile per questi
  pacchetti).


  5.6.  Cambiare le regole firewall

  Ci sono alcune questioni temporali coinvolte nella modifica delle
  regole firewall.  Se non si fa attenzione, si possono lasciar passare
  pacchetti mentre si fanno le modifiche.  L'approccio pi semplice  il
  seguente:



       # ipchains -I input 1 -j DENY
       # ipchains -I output 1 -j DENY
       # ipchains -I forward 1 -j DENY

       ... fare le modifiche ...

       # ipchains -D input 1
       # ipchains -D output 1
       # ipchains -D forward 1
       #




  Ci scarta tutti i pacchetti per la durata delle modifiche.


  Se le proprie modifiche sono ristrette ad una sola catena, si potrebbe
  creare una nuova catena con le nuove regole e poi rimpiazzare (`-R')
  la regola che punta alla vecchia catena con quella che punta a quella
  nuova: poi si pu cancellare la vecchia catena.  Questo rimpiazzo sar
  atomico.


  5.7.  Come proteggersi dall'IP Spoofing?

  L'IP spoofing  una tecnica nella quale un host invia pacchetti che
  affermano provenire da un altro host.  Poich il filtraggio dei
  pacchetti prende decisioni basandosi su questo indirizzo di
  provenienza, l'IP spoofing  utile solo con filtri di pacchetti un po'
  stupidi.   usato anche per nascondere l'identit dell'attaccante
  usando attacchi SYN, Teardrop, Ping della Morte e simili (non ci si
  preoccupi se non si sa cosa sono).


  Il miglior modo per proteggersi dall'IP spoofing  chiamato Source
  Address Verification (Verifica dell'Indirizzo di Provenienza), ed 
  fatto dal codice di instradamento e non dal firewall.  Si cerchi il
  file /proc/sys/net/ipv4/conf/all/rp_filter.  Se esiste, allora
  attivare il Source Address Verification ad ogni avvio  la giusta
  soluzione.  Per farlo, si inseriscano le righe seguenti da qualche
  parte nei propri script di inizializzazione, prima che sia
  inizializzata qualsiasi interfaccia di rete:



  # Questo  il metodo migliore: attivare il Source Address Verification
  # ed avere cos la protezione dallo spoof protection su tutte le
  # intefacce correnti e future.
  if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
    echo -n "Setting up IP spoofing protection..."
    for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
        echo 1 > $f
    done
    echo "done."
  else
    echo PROBLEMS SETTING UP IP SPOOFING PROTECTION.  BE WORRIED.
    echo "CONTROL-D will exit from this shell and continue system startup."
    echo
    # Start a single user shell on the console
    /sbin/sulogin $CONSOLE
  fi





  Se non si pu fare cos, si possono inserire manualmente delle regole
  per proteggere ogni interfaccia.  Ci richiede conoscenza su qualsiasi
  interfaccia.  I kernel 2.1 automaticamente rifiutano i pacchetti che
  affermano provenire dagli indirizzi 127.* (riservati per l'interfaccia
  loopbak locale lo).


  Per esempio, facciamo il caso che ci siano tre interfacce: eth0, eth1
  e ppp0.  Possiamo usare ifconfig per conoscere l'indirizzo e la
  netmask delle interfacce.  Diciamo che eth0 sia attaccata alla rete
  192.168.1.0 con netmask 255.255.255.0, eth1 sia attaccata alla rete
  10.0.0.0 con netmask 255.0.0.0 e che ppp0 connetta con Internet (dov'
  permesso qualsiasi indirizzo tranne quelli riservati come indirizzi IP
  privati).  Inseriremo allora le seguenti regole:



       # ipchains -A input -i eth0 -s ! 192.168.1.0/255.255.255.0 -j DENY
       # ipchains -A input -i ! eth0 -s 192.168.1.0/255.255.255.0 -j DENY
       # ipchains -A input -i eth1 -s ! 10.0.0.0/255.0.0.0 -j DENY
       # ipchains -A input -i ! eth1 -s 10.0.0.0/255.0.0.0 -j DENY
       #





  Questo approccio non  buono quanto l'approccio con il Source Address
  Verification, perch se cambia la propria rete, si devono cambiare le
  regole firewall.


  Se si usa un kernel della serie 2.0, si pu voler proteggere anche
  l'interfacia loopback, usando una regola come questa:



       # ipchains -A input -i ! lo -s 127.0.0.0/255.0.0.0 -j DENY
       #






  5.8.  Progetti avanzati

  Ho scritto una libreria (`libfw') che funziona dello spazio utente
  inclusa nei sorgenti.  Usa la possibilit offerta da IP Chains 1.3 e
  superiori di copiare un pacchetto nello spazio utente (usando
  l'opzione di configurazione IP_FIREWALL_NETLINK).


  Il valore marcato pu essere usato per specificare il paramentro
  Quality of Service per i pacchetti o per specificare come fare
  l'inoltro di porta dei pacchetti.  Non li ho mai usati, ma se si vuole
  scrivere qualcosa in proposito, mi si contatti.


  Usando questa libreria possono essere implementate nello spazio utente
  cose come la stateful inspection (preferisco il termine dynamic
  firewalling).  Un'altra idea interessante  il controllo dei pacchetti
  su base utente facendo delle ricerche in un demone nello spazio
  utente.  Questo dovrebbe essere abbastanza facile.


  5.8.1.  SPF: Stateful Packet Filtering

  ftp://ftp.interlinx.bc.ca/pub/spf <ftp://ftp.interlinx.bc.ca/pub/spf>
   il sito del progetto SPF di Brian Murrell, che fa il tracking delle
  connessioni nello spazio utente.  Aggiunge sicurezza significativa per
  siti a bassa banda.


  Attualmente c' poca documentazione, ma ecco qui un post nella mailing
  list nel quale Brian spiega un po' di cose:




       > Credo che faccia esattamente quello che voglio: installare un regola
       > temporanea di "arretramento" ("backward" rule) per permettere
       > l'ingresso dei pacchetti come fossero una risposta ad un richiesta
       > in uscita.

       Yup,  esattamente quello che fa.  Pi protocolli supporta, pi la
       regola di "arretramento" funziona bene.  Attualmente ha il supporto
       (vado a memoria, quindi scusate qualsiasi errore o omissione) per FTP
       (sia attivo che passivo, in ingresso e in uscita), RealAudio,
       traceroute, ICMP e ICQ basilare (ingresso da un server ICQ e
       connessioni TCP dirette, ma non c' ancora il supporto per le
       connessioni TCP dirette secondarie per altre cose come il
       trasferimento di file, ecc.).

       >  un rimpiazzo per ipchains o un supplemento?

        un supplemento.  Penso a ipchains come al motore per permettere o
       prevenire ai pacchetti di viaggiare attraverso la macchina Linux.  SPF
        il pilota che monitorizza costantemente il traffico e dice a
       ipchains come cambiare le sue tattiche per rispondere ai cambiamenti
       nel traffico.





  5.8.2.  L'ftp-data hack di Michael Hasenstein

  Michael Hasenstein della SuSE ha scritto una patch per il kernel che
  aggiunge a ipchains il tracking delle connessioni ftp.  Attualmente
  pu essere trovata a http://www.csn.tu-chemnitz.de/~mha/patch.ftp-
  data-2.gz <http://www.csn.tu-chemnitz.de/~mha/patch.ftp-data-2.gz>


  5.9.  Estensioni future

  Il firewalling ed il NAT sono in fase di riprogettazione per il 2.3.
  I piani e le discussioni sono disponibili nell'archivio delle liste
  netdev e ipchains-dev.  Queste estensioni dovrebbero chiarire
  parecchie questioni insolute sull'usabilit (veramente, il firewalling
  e il masquerading non dovrebbero essere cos difficili), e
  permetteranno la crescita di un firewalling maggiormente flessibile.


  6.  Problemi comuni


  6.1.  ipchains -L si pianta!

  Probabilmente si stanno bloccando le ricerche DNS; alla fine andr in
  timeout.  Si provi a passare l'opzione `-n' a ipchains, che sopprime
  la risoluzione dei nomi.



  6.2.  Masquerading/Forwarding non funziona!

  Ci si assicuri che sia abilitato l'inoltro dei pacchetti (nei kernel
  recenti  disabilitato per default, il che significa che i pacchetti
  non proveranno mai ad attraversare la catena `forward').  Si pu
  venirne a capo digitando (come root):



       # echo 1 > /proc/sys/net/ipv4/ip_forward
       #





  Se funziona, lo si pu mettere da qualche parte nei propri script di
  avvio cos che sia abilitato ogni volta; ovviamente  meglio impostare
  il proprio firewall prima di lanciare questo comando, altrimenti c'
  l'opportunit che scappino un po' di pacchetti.



  6.3.  -j REDIR non funziona!

  Si devono permettere i pacchetti di inoltro (si veda sopra) affinch
  funzioni il dirottamento; diversamente il codice di instradamento
  scarter i pacchetti.  Quindi se si sta usando solamente il
  dirottamento e non si usa il forwarding,  bene essere consci di
  questa cosa.


  Si noti che REDIR (sebbene sia nella catena input) non ha effetto
  sulle connessioni da un processo locale.


  6.4.  Non funzionano i caratteri jolly nelle interfacce!

  C' un bug nelle versioni 2.1.102 e 2.1.103 del kernel (e in alcune
  vecchie patch che ho prodotto) che faceva fallire i comandi ipchains
  che utilizzavano caratteri jolly per specificare interfacce (ad
  esempio -i ppp+).
  Ci  stato corretto nei kernel recenti e nella patch per il 2.0.34
  presente sul sito web.  Pu essere pure corretto a mano nei sorgenti
  del kernel modificando la riga 63 (pi o meno) di
  include/linux/ip_fw.h:



       #define IP_FW_F_MASK    0x002F  /* All possible flag bits mask   */





  Dovrebbe essere ``0x003F''.  Lo si corregga e si ricompili il kernel.


  6.5.  TOS non funziona!

  Questo  stato un mio errore: l'impostazione del campo Type of Service
  nei kernel dal 2.1.102 al 2.1.111 in realt non faceva niente.  Questo
  problema  stato corretto nel 2.1.112.


  6.6.  Non funzionano ipautofw e ipportfw!

  Per i 2.0.x,  vero; non ho il tempo per creare e mantenere una patch
  enorme per ipchains e ipautofw/ipportfw.


  Per i 2.1.x, si scarichi l'ipmasqadm di Juan Ciarlante da

  <htmlurl url="http://juanjox.linuxhq.com/"
          name="http://juanjox.linuxhq.com/">


  e lo si usi esattamente come si sarebbe usato ipautofw o ipportfw,
  tranne per il fatto che invece di ipportfw si usa ipmasqadm portfw, e
  invece di ipautofw si usa ipmasqadm autofw.


  6.7.  xosview si  rotto!

  Si aggiorni alla versione 1.6.0 o superiore, che non richiede nessuna
  regola firewall per i kernel 2.1.x.  Sembra che anche la release 1.6.1
  abbia questo problema; lo si segnali all'autore (non  un mio
  errore!).


  6.8.  Segmentation Fault con `-j REDIRECT'!

  Questo era un bug in ipchains versione 1.3.3.  Si aggiorni.



  6.9.  Non riesco ad impostare i timeout del masquerading!

  Ci  vero (per i kernel 2.1.x) fino al 2.1.123.  Nel 2.1.124, il
  tentativo di impostare i timeout del masquerading provoca un blocco
  del kernel (si modifichi return in ret = nella riga 1328 di
  net/ipv4/ip_fw.c).  Nel 2.1.125, funziona tutto.


  6.10.  Voglio dei firewall IPX!

  E cos molti altri, sembra.  Il mio codice gestisce solo IP,
  sfortunatamente.  D'altra parte c' anche qualcosa di buono: le cose
  per scrivere un firewall IPX ci sono tutte!  Basta semplicemente
  scrivere il codice; sar felice di aiutare dove possibile.


  7.  Un esempio pi serio

  Questo esempio  estratto dal tutorial scritto da me e Michael Neuling
  apparso in LinuxWorld nel Marzo 1999; non  il solo modo per risolvere
  il problema in esame, ma probabilmente  il pi semplice.  Spero lo si
  trovi interessante.



  7.1.  La situazione


    Rete interna con il masquerading (con diversi sistemi operativi)
     che chiameremo "GOOD".

    Server esposti in una rete separata (chiamata "DMZ" per
     Demilitarized Zone - Zona Demilitarizzata).

    Connessione PPP ad Internet (detta "BAD").




          Rete Esterna (BAD)
                  |
                  |
              ppp0|
           ---------------
           | 192.84.219.1|             Rete dei Server (DMZ)
           |             |eth0
           |             |----------------------------------------------
           |             |192.84.219.250 |             |              |
           |             |               |             |              |
           |192.168.1.250|               |             |              |
           ---------------          --------       -------        -------
                  | eth1            | SMTP |       | DNS |        | WWW |
                  |                 --------       -------        -------
                  |              192.84.219.128  192.84.219.129  192.84.218.130
                  |
         Rete Interna (GOOD)





  7.2.  Scopi


  Macchina per il filtraggio dei pacchetti:

      PING da/per qualsiasi rete
        Questo  veramente utile per sapere se una macchina  attiva.


      TRACEROUTE da/per qualsiasi rete
        Ancora, utile per la diagnotica.


      Accesso DNS
        Rende ping e DNS pi utili.


  All'interno di DMZ:


  Mail server

    SMTP verso l'esterno

    Accetta SMTP dall'interno e dall'esterno

    Accetta POP-3 dall'interno

  Name Server

    Invia richieste DNS all'esterno

    Accetta richieste DNS dall'interno, dall'esterno e dalla macchina
     per il filtraggio dei pacchetti.


  Server web

    Accetta connessioni HTTP dall'interno e dall'esterno

    Accesso rsync dall'interno


  Rete interna:

     Permettere WWW, ftp, traceroute, ssh verso l'esterno
        Queste sono cose abbastanza standard da permettere: alcuni
        iniziano permettendo di fare tutto alla rete interna, ma qui
        saremo un po' pi restrittivi.


      Permettere connessioni SMTP verso il mail server
        Ovviamente vogliamo poter inviare mail verso l'esterno.


      Permettere connessioni POP-3 verso il mail server
        Questo  il modo per leggere la propria posta.


      Permettere connessioni DNS verso il name server
        Vogliamo essere in grado di cercare i nomi esterni dei siti per
        il WWW, ftp, traceroute e ssh.


      Permettere connessioni rsync verso il server web
        Questo  il modo per sincronizzare il server web esterno con
        quello interno.


      Permettere connessioni WWW verso il server web
        Ovviamente, vogliamo poterci connettere al nostro server web
        esterno.


      Permettere il ping verso la macchina per il filtraggio dei pac
        chetti
        Questa  una pura cortesia: significa che si pu controllare se
        la macchina firewall  gi.





  7.3.  Prima del filtraggio dei pacchetti


    Anti-spoofing.


     Poich non c' nessun instradamento asimmetrico, semplicemente si
     pu attivare l'anti-spoofing per tutte le interfacce.




       # for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f; done
       #





    Impostare le regole di filtraggio per proibire (DENY) tutto.


     Si permetter ancora il traffico locale su loopback, ma verr
     proibito tutto il resto.




       # ipchains -A input -i ! lo -j DENY
       # ipchains -A output -i ! lo -j DENY
       # ipchains -A forward -j DENY
       #





    Configurare le interfacce.


     Solitamente ci  fatto negli script di boot.  Ci si assicuri che i
     passi precedenti siano fatti prima che vengano configurate le
     interfacce, per prevenire l'infiltrazione di pacchetti prima di
     aver impostato le regole.


    Inserire moduli di masquerading per ciascun protocollo.

     Si devono inserire i moduli di masquerading per FTP, in modo che
     funzioni l'FTP sia attivo che passivo per la rete interna.




       # insmod ip_masq_ftp
       #





  7.4.  Filtraggio dei pacchetti per i pacchetti di passaggio

  Con il masquerading, la cosa migliore  filtrare nella catena forward.


  Si suddivida la catena forward in diverse catene utente a seconda
  delle interfacce di provenienza/destinazione; ci spacca in problema
  in tronconi gestibili pi facilmente.



       ipchains -N good-dmz
       ipchains -N bad-dmz
       ipchains -N good-bad
       ipchains -N dmz-good
       ipchains -N dmz-bad
       ipchains -N bad-good




  Una cosa comune da fare  di accettare (ACCEPT) errori ICMP standard,
  e quindi si crea una catena solo per loro.



       ipchains -N icmp-acc





  7.4.1.  Impostare i salti dalla catena forward

  Sfortunatamente,  nota solamente (nella catena forward) l'interfaccia
  d'uscita.  Quindi, per scoprire da quale interfaccia sia entrato un
  pacchetto useremo l'indirizzo di provenienza (l'anti spoofing previene
  indirizzi contraffatti).


  Si noti che si registra qualsiasi cosa che non soddisfa una di queste
  regole (ovviamente ci non dovrebbe mai succedere).



       ipchains -A forward -s 192.168.1.0/24 -i eth0 -j good-dmz
       ipchains -A forward -s 192.168.1.0/24 -i ppp0 -j good-bad
       ipchains -A forward -s 192.84.219.0/24 -i ppp0 -j dmz-bad
       ipchains -A forward -s 192.84.219.0/24 -i eth1 -j dmz-good
       ipchains -A forward -i eth0 -j bad-dmz
       ipchains -A forward -i eth1 -j bad-good
       ipchains -A forward -j DENY -l





  7.4.2.  Definire la catena icmp-acc

  I pacchetti che siano degli errori ICMP sono accettati, altrimenti il
  controllo passer alla catena chiamante.




       ipchains -A icmp-acc -p icmp --icmp-type destination-unreachable -j ACCEPT
       ipchains -A icmp-acc -p icmp --icmp-type source-quench -j ACCEPT
       ipchains -A icmp-acc -p icmp --icmp-type time-exceeded -j ACCEPT
       ipchains -A icmp-acc -p icmp --icmp-type parameter-problem -j ACCEPT


  7.4.3.  Da Good (interno) a DMZ (server)

  Restrizioni della rete interna:

    Permettere WWW, ftp, traceroute, ssh verso l'esterno

    Permettere SMTP verso il Mail server

    Permettere POP-3 verso il Mail server

    Permettere DNS verso il Name server

    Permettere rsync verso il Web server

    Permettere WWW verso il Web server

    Permettere il ping alla macchina filtro

  Si potrebbe fare il masquerading dalla rete interna nella DMZ, ma qui
  non si far.  Poich nessuno nella rete interna dovrebbe provare a
  fare cose brutte, registriamo qualsiasi pacchetto che venga proibito.




       ipchains -A good-dmz -p tcp -d 192.84.219.128 smtp -j ACCEPT
       ipchains -A good-dmz -p tcp -d 192.84.219.128 pop-3 -j ACCEPT
       ipchains -A good-dmz -p udp -d 192.84.219.129 domain -j ACCEPT
       ipchains -A good-dmz -p tcp -d 192.84.219.129 domain -j ACCEPT
       ipchains -A good-dmz -p tcp -d 192.84.218.130 www -j ACCEPT
       ipchains -A good-dmz -p tcp -d 192.84.218.130 rsync -j ACCEPT
       ipchains -A good-dmz -p icmp -j icmp-acc
       ipchains -A good-dmz -j DENY -l






  7.4.4.  Da Bad (esterno) a DMZ (server).



    Restrizioni di DMZ:

    Mail server

    SMTP verso l'esterno

    Accetta SMTP da interno ed esterno

    Accetta POP-3 dall'interno


    Name server

    Invia DNS verso l'esterno

    Accetta DNS da interno, esterno e dalla macchina per il filtraggio
     dei pacchetti


    Web server

    Accetta HTTP da interno e esterno

    Accesso rsync dall'interno


    Cose permesse dalla rete esterna verso DMZ

    Non si registrano le violazioni, in quanto possono succedere.



       ipchains -A bad-dmz -p tcp -d 192.84.219.128 smtp -j ACCEPT
       ipchains -A bad-dmz -p udp -d 192.84.219.129 domain -j ACCEPT
       ipchains -A bad-dmz -p tcp -d 192.84.219.129 domain -j ACCEPT
       ipchains -A bad-dmz -p tcp -d 192.84.218.130 www -j ACCEPT
       ipchains -A bad-dmz -p icmp -j icmp-acc
       ipchains -A bad-dmz -j DENY





  7.4.5.  Da Good (interno) a Bad (esterno).


    Restrizioni della rete interna:

    Permettere WWW, ftp, traceroute, ssh verso l'esterno

    Permettere SMTP verso il Mail server

    Permettere POP-3 verso il Mail server

    Permettere DNS verso il Name server

    Permettere rsync verso il Web server

    Permettere WWW verso il Web server

    Permettere il ping alla macchina filtro

    Molti permettono qualsiasi cosa dalla rete interna verso quella
     esterna. Qua facciamo un po' i fascisti.

    Registrazione delle violazioni.

    FTP passivo gestito dal modulo del masquerading



       ipchains -A good-bad -p tcp --dport www -j MASQ
       ipchains -A good-bad -p tcp --dport ssh -j MASQ
       ipchains -A good-bad -p udp --dport 33434:33500 -j MASQ
       ipchains -A good-bad -p tcp --dport ftp --j MASQ
       ipchains -A good-bad -p icmp --icmp-type ping -j MASQ
       ipchains -A good-bad -j REJECT -l





  7.4.6.  Da DMZ a Good (interno).



    Restrizioni della rete interna:


    Permettere WWW, ftp, traceroute, ssh verso l'esterno

    Permettere SMTP verso il Mail server

    Permettere POP-3 verso il Mail server

    Permettere DNS verso il Name server

    Permettere rsync verso il Web server

    Permettere WWW verso il Web server

    Permettere il ping alla macchina filtro


    Se si fa il masquerading dalla rete interna verso la DMZ,
     semplicemente si rifiuti qualsiasi pacchetto che proviene
     nell'altro senso.  Ovvero, si permettano solo i pacchetti che
     possono essere parte di una connessione gi stabilita.



       ipchains -A dmz-good -p tcp ! -y -s 192.84.219.128 smtp -j ACCEPT
       ipchains -A dmz-good -p udp -s 192.84.219.129 domain -j ACCEPT
       ipchains -A dmz-good -p tcp ! -y -s 192.84.219.129 domain -j ACCEPT
       ipchains -A dmz-good -p tcp ! -y -s 192.84.218.130 www -j ACCEPT
       ipchains -A dmz-good -p tcp ! -y -s 192.84.218.130 rsync -j ACCEPT
       ipchains -A dmz-good -p icmp -j icmp-acc
       ipchains -A dmz-bad -j DENY -l





  7.4.7.  Da DMZ a Bad (esterno).



    Restrizioni di DMZ:

    Mail server

    SMTP verso l'esterno

    Accetta SMTP da interno ed esterno

    Accetta POP-3 dall'interno


    Name server

    Invia DNS verso l'esterno

    Accetta DNS da interno, esterno e dalla macchina per il filtraggio
     dei pacchetti


    Web server

    Accetta HTTP da interno e esterno

    Accesso rsync dall'interno




  


       ipchains -A dmz-bad -p tcp -s 192.84.219.128 smtp -j ACCEPT
       ipchains -A dmz-bad -p udp -s 192.84.219.129 domain -j ACCEPT
       ipchains -A dmz-bad -p tcp -s 192.84.219.129 domain -j ACCEPT
       ipchains -A dmz-bad -p tcp ! -y -s 192.84.218.130 www -j ACCEPT
       ipchains -A dmz-bad -p icmp -j icmp-acc
       ipchains -A dmz-bad -j DENY -l





  7.4.8.  Da Bad (esterno) a Good (interno).



    Non si permette niente (non mascherato) dalla rete esterna verso
     quella interna


       ipchains -A bad-good -j REJECT





  7.4.9.  Filtraggio dei pacchetti per la macchina Linux stessa



    Se si vuole usare il filtraggio dei pacchetti sui pacchetti in
     ingresso alla macchina stessa,  necessario fare il filtraggio
     sulla catena input.  Si crei una catena per ogni interfaccia di
     destinazione:


       ipchains -N bad-if
       ipchains -N dmz-if
       ipchains -N good-if





    Creare dei salti a queste:



       ipchains -A input -d 192.84.219.1 -j bad-if
       ipchains -A input -d 192.84.219.250 -j dmz-if
       ipchains -A input -d 192.168.1.250 -j good-if





  7.4.9.1.  Interfaccia di Bad (esterno).



    Macchina per il filtraggio dei pacchetti:

    PING verso ogni rete

    TRACEROUTE verso ogni rete

    Accesso DNS


    L'interfaccia esterna riceve risposte anche per i pacchetti
     "mascherati" oltre ad errori ICMP per questi e a risposte al PING.



       ipchains -A bad-if -i ! ppp0 -j DENY -l
       ipchains -A bad-if -p TCP --dport 61000:65096 -j ACCEPT
       ipchains -A bad-if -p UDP --dport 61000:65096 -j ACCEPT
       ipchains -A bad-if -p ICMP --icmp-type pong -j ACCEPT
       ipchains -A bad-if -j icmp-acc
       ipchains -A bad-if -j DENY





  7.4.9.2.  Interfaccia di DMZ.



    Restrizioni della macchina per il filtraggio dei pacchetti:

    PING verso ogni rete

    TRACEROUTE verso ogni rete

    Accesso DNS


    L'interfaccia DMZ riceve risposte DNS, risposte al ping ed errori
     ICMP.



       ipchains -A dmz-if -i ! eth0 -j DENY
       ipchains -A dmz-if -p TCP ! -y -s 192.84.219.129 53 -j ACCEPT
       ipchains -A dmz-if -p UDP -s 192.84.219.129 53 -j ACCEPT
       ipchains -A dmz-if -p ICMP --icmp-type pong -j ACCEPT
       ipchains -A dmz-if -j icmp-acc
       ipchains -A dmz-if -j DENY -l





  7.4.9.3.  Interfaccia di Good (interno).



    Restrizioni della macchina per il filtraggio dei pacchetti:

    PING verso ogni rete

    TRACEROUTE verso ogni rete

    Accesso DNS


    Restrizioni della rete interna:


    Permettere WWW, ftp, traceroute, ssh verso l'esterno

    Permettere SMTP verso il Mail server

    Permettere POP-3 verso il Mail server

    Permettere DNS verso il Name server

    Permettere rsync verso il Web server

    Permettere WWW verso il Web server

    Permettere il ping alla macchina filtro


    L'interfaccia interna riceve ping, risposte al ping e errori ICMP.



       ipchains -A good-if -i ! eth1 -j DENY
       ipchains -A good-if -p ICMP --icmp-type ping -j ACCEPT
       ipchains -A good-if -p ICMP --icmp-type pong -j ACCEPT
       ipchains -A good-if -j icmp-acc
       ipchains -A good-if -j DENY -l





  7.5.  Per finire


    Cancellare le regole di bloccaggio:


       ipchains -D input 1
       ipchains -D forward 1
       ipchains -D output 1





  8.  Appendice: Differenze tra ipchains e ipfwadm

  Alcune di queste modifiche sono il risultato di modifiche nel kernel,
  e altre dipendono dal fatto che ipchains sembra differente da ipfwadm.



  1. Molti argomenti sono stati rimappati: le maiuscole ora indicano un
     comando e le minuscole indicano un'opzione.

  2. Sono supportate catene arbitrarie e quindi anche le catene
     predefinite ora hanno un nome invece di essere solamente un opzione
     (eg. `input' invece di `-I').

  3. L'opzione `-k' non c' pi: si usi `! -y'.

  4. L'opzione `-b' inserire/aggiunge/cancella veramente due regole,
     piuttosto che una singola regola `bidirezionale'.

  5. L'opzione `-b' pu essere passata a `-C' per fare due verifiche
     (una in ogni direzione).


  6. L'opzione `-x' a `-l'  stata rimpiazzata da `-v'.

  7. Non sono pi supportate porte di provenienza e destinazione
     multiple.  Spero che l'essere in grado di negare un intervallo di
     porte venga in aiuto in questi casi.

  8. Le interfacce possono essere specificate solamente attraverso il
     nome (non l'indirizzo).  Comunque, la vecchia semantica  stata
     silenzionamente cambiata nei kernel della serie 2.1.

  9. I frammenti sono esaminati, non lasciati passare automaticamente.

  10.
     Sono state rimosse le catene specifiche per l'accounting.

  11.
     Possono essere testati protocolli arbitrari su IP.

  12.
     Il vecchio comportamente del SYN e ACK matching (che in precedenza
     era ignorato per i pacchetti non TCP)  cambiato; l'opzione SYN non
      valida per regole non specifiche per il TCP.

  13.
     I contatori sono ora a 64 bit su macchine a 32 bit, non pi a 32
     bit.

  14.
     Ora sono supportate le opzioni inverse.

  15.
     Ora sono supportati i codici ICMP.

  16.
     Sono supportati i caratteri jolly nella specifica dell'interfaccia.

  17.
     Ora  controllata l'integrit delle manipolazioni TOS: il vecchio
     codice del kernel sileziosamente bloccava le manipolazioni
     (illegali) del bit TOS `Must Be Zero'; ipchains ora restituisce un
     errore se ci si prova, come anche per gli altri casi illegali.


  8.1.  Tabella di riferimento rapido

  [ Gli argomenti dei comandi sono in MAIUSCOLO, mentre gli argomenti
  delle opzioni in minuscolo ]


  Una cosa da notare, il masquerading  specificato da `-j MASQ'; 
  completamente diverso da `-j ACCEPT', e non  trattato come un mero
  effetto collaterale, diversamente da quanto fa ipfwadm.














  ===================================================================
  | ipfwadm      | ipchains                | Note
  -------------------------------------------------------------------
  | -A [both]    | -N acct                 | Crea una catena `acct'
  |              |& -I 1 input -j acct     | e fa s che i pacchetti
  |              |& -I 1 output -j acct    | in ingresso e in uscita
  |              |& acct                   | la traversino.
  -------------------------------------------------------------------
  | -A in        | input                   | Una regola senza tattica
  -------------------------------------------------------------------
  | -A out       | output                  | Una regola senza tattica
  -------------------------------------------------------------------
  | -F           | forward                 | Si usi questo come [catena]
  -------------------------------------------------------------------
  | -I           | input                   | Si usi questo come [catena]
  -------------------------------------------------------------------
  | -O           | output                  | Si usi questo come [catena]
  -------------------------------------------------------------------
  | -M -l        | -M -L                   |
  -------------------------------------------------------------------
  | -M -s        | -M -S                   |
  -------------------------------------------------------------------
  | -a tattica   | -A [catena] -j TATTICA  | (si veda anche -r e -m).
  -------------------------------------------------------------------
  | -d tattica   | -D [catena] -j TATTICA  | (si veda anche -r e -m).
  -------------------------------------------------------------------
  | -i tattica   | -I 1 [catena] -j TATTICA| (si veda anche -r e -m).
  -------------------------------------------------------------------
  | -l           | -L                      |
  -------------------------------------------------------------------
  | -z           | -Z                      |
  -------------------------------------------------------------------
  | -f           | -F                      |
  -------------------------------------------------------------------
  | -p           | -P                      |
  -------------------------------------------------------------------
  | -c           | -C                      |
  -------------------------------------------------------------------
  | -P           | -p                      |
  -------------------------------------------------------------------
  | -S           | -s                      | Accetta solo una porta o
  |              |                         | intervallo.
  -------------------------------------------------------------------
  | -D           | -d                      | Accetta solo una porta o
  |              |                         | intervallo.
  -------------------------------------------------------------------
  | -V           | <nessuna>               | Si usi -i [nome].
  -------------------------------------------------------------------
  | -W           | -i                      |
  -------------------------------------------------------------------
  | -b           | -b                      | Crea 2 regole.
  -------------------------------------------------------------------
  | -e           | -v                      |
  -------------------------------------------------------------------
  | -k           | ! -y                    | Non funziona finch non
  |              |                         | si specifica anche -p tcp.
  -------------------------------------------------------------------
  | -m           | -j MASQ                 |
  -------------------------------------------------------------------
  | -n           | -n                      |
  -------------------------------------------------------------------
  | -o           | -l                      |
  -------------------------------------------------------------------
  | -r [redirpt] | -j REDIRECT [redirpt]   |
  -------------------------------------------------------------------
  | -t           | -t                      |
  -------------------------------------------------------------------
  | -v           | -v                      |
  -------------------------------------------------------------------
  | -x           | -x                      |
  -------------------------------------------------------------------
  | -y           | -y                      | Non funziona finch non
  |              |                         | si specifica anche -p tcp.
  -------------------------------------------------------------------




  8.2.  Esempi di traduzione di comandi ipfwadm

  Vecchio comando: ipfwadm -F  -p deny

  Nuovo comando: ipchains -P forward DENY


  Vecchio comando: ipfwadm -F -a m -S 192.168.0.0/24 -D 0.0.0.0/0

  Nuovo comando: ipchains -A forward -j MASQ -s 192.168.0.0/24 -d
  0.0.0.0/0


  Vecchio comando: ipfwadm -I -a accept -V 10.1.2.1 -S 10.0.0.0/8 -D
  0.0.0.0/0

  Nuovo comando: ipchains -A input -j ACCEPT -i eth0 -s 10.0.0.0/8 -d
  0.0.0.0/0

  (Si noti che questi non sono equivalenti specificando l'interfaccia
  tramite l'indirizzo: si usi il nome di interfaccia.  In questa
  macchina 10.1.2.1 corrisponde a eth0).


  9.  Appendice: Usare lo script ipfwadm-wrapper.

  Lo script shell ipfwadm-wrapper dovrebbe essere un plug-in di
  rimpiazzo di ipfwadm per compatibilit all'indietro con ipfwadm 2.3a.


  La sola caratteristica che non posso veramente gestire  l'opzione
  `-V'.  Quando  usata,  mostrato un avviso.  Se  usata anche
  l'opzione `-W', l'opzione `-V'  ignorata.  Altrimenti, lo script
  prova a trovare il nome di interfaccia associato con quell'indirizzo,
  usando ifconfig.  Se fallisce (come nel caso di un'interfaccia non
  attiva) allora uscir con un messaggio d'errore.


  Questo avviso pu essere soppresso o cambiando il `-V' in un `-W',
  oppure direzionando lo standard output dello script a /dev/null.


  Se si trova un qualsiasi errore nello script, o una qualsiasi
  differenza tra il vero ipfwadm e questo script, invito a segnalarmi il
  bug: si invii un'email a ipchains@rustcorp.com con "BUG-REPORT" nel
  subject.  Prego si segnali la versione del vecchio ipfwadm (ipfwadm
  -h), la versione di ipchains (ipchains --version) e quella dello
  script ipfwadm wrapper script (ipfwadm-wrapper --version).  Si invii
  anche l'output di ipchains-save.  Grazie in anticipo.


  Se si mischia ipchains con questo script ipfwadm-wrapper lo si fa a
  proprio rischio e pericolo.

  10.  Appendice: Ringraziamenti.

  Molte grazie a Michael Neuling, che ha scritto la prima cosa
  rilasciabile del codice IP chains mentre lavorava per me.  Mi scuso
  pubblicamente per aver respinto la sua idea del result-caching, che
  Alan Cox propose un po' dopo e finalmente mi sono deciso a
  implementare, rendendomi conto dell'errore che avevo commesso.


  Grazie ad Alan Cox per il suo supporto tecnico via email 24 ore su 24
  ed il suo incoraggiamento.


  Grazie a tutti gli autori del codice ipfw e ipfwadm, specialmente a
  Jos Vos.  Standing on the shoulders of giants and all that...  Ci
  vale anche per Linus Torvalds oltre che a tutti gli hacker del kernel
  e dello userspace.


  Un ringraziamento ai diligenti beta tester e bughunter (cacciatori di
  bug), specialmente a Jordan Mendelson, Shaw Carruthers, Kevin Moule,
  Dr. Liviu Daia, Helmut Adams, Franck Sicard, Kevin Littlejohn, Matt
  Kemner, John D. Hardin, Alexey Kuznetsov, Leos Bitto, Jim Kunzman,
  Gerard Gerritsen, Serge Sivkov, Andrew Burgess, Steve Schmidtke,
  Richard Offer, Bernhard Weisshuhn, Larry Auton, Ambrose Li, Pavel
  Krauz, Steve Chadsey, Francesco Potort e Alain Knaff.

  Il tradottore vuole ringraziare Alvise Bellotti per la sue
  indispensabili correzioni e suggerimenti.